[
  {
    "path": ".gitattributes",
    "content": "###############################################################################\n# Set default behavior to automatically normalize line endings.\n###############################################################################\n* text=auto\n\n###############################################################################\n# Set default behavior for command prompt diff.\n#\n# This is need for earlier builds of msysgit that does not have it on by\n# default for csharp files.\n# Note: This is only used by command line\n###############################################################################\n#*.cs     diff=csharp\n\n###############################################################################\n# Set the merge driver for project and solution files\n#\n# Merging from the command prompt will add diff markers to the files if there\n# are conflicts (Merging from VS is not affected by the settings below, in VS\n# the diff markers are never inserted). Diff markers may cause the following \n# file extensions to fail to load in VS. An alternative would be to treat\n# these files as binary and thus will always conflict and require user\n# intervention with every merge. To do so, just uncomment the entries below\n###############################################################################\n#*.sln       merge=binary\n#*.csproj    merge=binary\n#*.vbproj    merge=binary\n#*.vcxproj   merge=binary\n#*.vcproj    merge=binary\n#*.dbproj    merge=binary\n#*.fsproj    merge=binary\n#*.lsproj    merge=binary\n#*.wixproj   merge=binary\n#*.modelproj merge=binary\n#*.sqlproj   merge=binary\n#*.wwaproj   merge=binary\n\n###############################################################################\n# behavior for image files\n#\n# image files are treated as binary by default.\n###############################################################################\n#*.jpg   binary\n#*.png   binary\n#*.gif   binary\n\n###############################################################################\n# diff behavior for common document formats\n# \n# Convert binary document formats to text before diffing them. This feature\n# is only available from the command line. Turn it on by uncommenting the \n# entries below.\n###############################################################################\n#*.doc   diff=astextplain\n#*.DOC   diff=astextplain\n#*.docx  diff=astextplain\n#*.DOCX  diff=astextplain\n#*.dot   diff=astextplain\n#*.DOT   diff=astextplain\n#*.pdf   diff=astextplain\n#*.PDF   diff=astextplain\n#*.rtf   diff=astextplain\n#*.RTF   diff=astextplain\n"
  },
  {
    "path": ".gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# User-specific files\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\n[Xx]64/\n[Xx]86/\n[Bb]uild/\nbld/\n[Bb]in/\n[Oo]bj/\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\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\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\n# TODO: Un-comment the next line if you do not want to checkin \n# your web deploy settings because they may include unencrypted\n# passwords\n#*.pubxml\n*.publishproj\n\n# NuGet Packages\n*.nupkg\n# The packages folder can be ignored because of Package Restore\n**/packages/*\n# except build/, which is used as an MSBuild target.\n!**/packages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/packages/repositories.config\n# 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# Microsoft Azure ApplicationInsights config file\nApplicationInsights.config\n\n# Windows Store app package directory\nAppPackages/\nBundleArtifacts/\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n\n# Others\nClientBin/\n[Ss]tyle[Cc]op.*\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.pfx\n*.publishsettings\nnode_modules/\norleans.codegen.cs\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\n\n# SQL Server files\n*.mdf\n*.ldf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# 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# LightSwitch generated files\nGeneratedArtifacts/\nModelManifest.xml\n\n# Paket dependency manager\n.paket/paket.exe\n\n# FAKE - F# Make\n.fake/\n\n# CUSTOM\n*.editorconfig\nInstaller/\nSvgFileType/Properties/\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"resvg.net\"]\n\tpath = resvg.net\n\turl = https://github.com/otuncelli/resvg.net.git\n[submodule \"PaintDotNet.IndirectUI.Fluent\"]\n\tpath = PaintDotNet.IndirectUI.Fluent\n\turl = https://github.com/otuncelli/PaintDotNet.IndirectUI.Fluent.git\n[submodule \"BitmapVectorizer\"]\n\tpath = BitmapVectorizer\n\turl = https://github.com/otuncelli/BitmapVectorizer.git\n"
  },
  {
    "path": "COPYING",
    "content": "﻿                    GNU GENERAL PUBLIC LICENSE\n                       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\n 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Lesser General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n                            NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n                     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\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License along\n    with this program; if not, write to the Free Software Foundation, Inc.,\n    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) year name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License."
  },
  {
    "path": "README.md",
    "content": "﻿# ![W3C SVG Logo](https://www.w3.org/Icons/SVG/svg-logo-v.png) Scalable Vector Graphics (SVG) Plugin for Paint.NET \n\n[![](https://img.shields.io/github/release-pre/otuncelli/Scalable-Vector-Graphics-Plugin-for-Paint.NET.svg?style=flat)](https://github.com/otuncelli/Scalable-Vector-Graphics-Plugin-for-Paint.NET/releases)\n[![](https://img.shields.io/github/downloads/otuncelli/Scalable-Vector-Graphics-Plugin-for-Paint.NET/total)](https://github.com/otuncelli/Scalable-Vector-Graphics-Plugin-for-Paint.NET/releases)\n\nThis is a [paint.net](https://getpaint.net) filetype plugin for loading SVG (Scalable Vector Graphics) and its compressed variant SVGZ files. SVG files can be rendered as a flat image or each element/group on a separate layer. This plugin also provides basic image tracing (raster to vector conversion) functionality which works best with black and white drawings. You may export the tracing result as SVG or Paint.NET Shape.\n\n### Prerequisites\npaint.net 5.1 or later\n\n### Download links\n\nHere are the download links for latest release:\n\nInstaller[^1] (Recommended) | Manual Installation\n--- | ---\n:floppy_disk: [SvgFileTypePlugin_setup.exe](https://github.com/otuncelli/Scalable-Vector-Graphics-Plugin-for-Paint.NET/releases/latest/download/SvgFileTypePlugin_setup.exe) | :floppy_disk: [SvgFileTypePlugin.zip](https://github.com/otuncelli/Scalable-Vector-Graphics-Plugin-for-Paint.NET/releases/latest/download/SvgFileTypePlugin.zip)\n\n[^1]: The portable version of paint.net is not supported by the installer.\n\n### How to install\n\n:warning: **Note: Before install make sure you don't have any other file type plugin installed handling the same file extensions: .svg, .svgz**\n\n:point_right: To automatically install the plugin perform the following steps:\n  * Make sure paint.net is not running.\n  * Download and run `SvgFileTypePlugin_setup.exe`\n  * Follow the steps of the setup wizard.\n\t\n:point_right: To manually install the plugin perform the following steps:\n  * Make sure paint.net is not running.\n  * Download and extract `SvgFileTypePlugin.zip`\n  * If you're using Classic version of paint.net:\n    * Copy the `SvgFileTypePlugin` folder into the `<paint.net>\\FileTypes` directory (Default location is `C:\\Program Files\\paint.net\\FileTypes`).\n  * If you're using [Microsoft Store version of paint.net](https://www.microsoft.com/store/apps/9NBHCS1LX4R0):\n    * Copy the `SvgFileTypePlugin` folder into the `<Documents>\\paint.net App Files\\FileTypes` directory.\n  * Done. You may start paint.net."
  },
  {
    "path": "SvgFileType/BenchmarkScope.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. Allrights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing System;\nusing System.Diagnostics;\nusing System.Text;\nusing System.Threading;\n\nnamespace SvgFileTypePlugin;\n\ninternal struct BenchmarkScope : IDisposable\n{\n    private readonly Stopwatch timer;\n    private readonly string? name;\n    private int disposed;\n\n    public BenchmarkScope(string? name) : this()\n    {\n        this.name = name;\n    }\n\n    public BenchmarkScope()\n    {\n        timer = Stopwatch.StartNew();\n    }\n\n    public void Dispose()\n    {\n        if (Interlocked.CompareExchange(ref disposed, 1, 0) == 0)\n        {\n            StringBuilder sb = new StringBuilder(nameof(BenchmarkScope));\n            sb.Append(' ');\n            if (name is not null)\n            {\n                sb.Append($\"({name}) \");\n            }\n            sb.Append($\"took {timer.ElapsedMilliseconds} ms.\");\n            Logger.WriteLine(sb.ToString());\n        }\n    }\n}\n"
  },
  {
    "path": "SvgFileType/Export/PreviewMode.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nnamespace SvgFileTypePlugin.Export;\n\ninternal enum PreviewMode\n{\n    Fast,\n    Slow\n}\n"
  },
  {
    "path": "SvgFileType/Export/PropertyNames.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nnamespace SvgFileTypePlugin.Export;\n\ninternal enum PropertyNames\n{\n    Angle,\n    BrightnessCutoff,\n    Color,\n    DiscussionLink,\n    Enclose,\n    FillColor,\n    GitHubLink,\n    GreymapScale,\n    HighpassFilter,\n    Invert,\n    LowpassFilter,\n    Optimize,\n    PdnShape,\n    PdnShapeName,\n    PreviewMode,\n    ScanMode,\n    Scale,\n    SmoothCorners,\n    SuppressSpeckles,\n    Tight,\n    TurnPolicy\n}\n"
  },
  {
    "path": "SvgFileType/Export/ScanMode.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nnamespace SvgFileTypePlugin.Export;\n\ninternal enum ScanMode\n{\n    Transparent,\n    Opaque\n}\n"
  },
  {
    "path": "SvgFileType/Export/SvgExport.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing System;\nusing System.ComponentModel;\nusing System.IO;\nusing System.Text;\nusing System.Threading;\nusing System.Windows.Forms;\nusing BitmapVectorizer;\nusing PaintDotNet;\nusing PaintDotNet.AppModel;\nusing PaintDotNet.PropertySystem;\nusing PaintDotNet.PropertySystem.Extensions;\nusing SvgFileTypePlugin.Extensions;\nusing SvgFileTypePlugin.Localization;\nusing static PaintDotNet.UserBlendOps;\n\nnamespace SvgFileTypePlugin.Export;\n\ninternal static partial class SvgExport\n{\n    private static Lazy<string?> ShapesDirectory => new(() =>\n    {\n        try\n        {\n            IFileSystemService fss = Services.Get<IFileSystemService>();\n            string path = Path.Combine(fss.PerUserAppFilesPath, \"Shapes\");\n            if (!Directory.Exists(path))\n            {\n                Directory.CreateDirectory(path);\n            }\n            return path;\n        }\n        catch\n        {\n            return null;\n        }\n    });\n\n    public static string? ShowSaveShapeDialog()\n    {\n        if (!UIHelper.IsSaveConfigDialogVisible())\n        {\n            return null;\n        }\n\n        return UIHelper.RunOnUIThread(() =>\n        {\n            using SaveFileDialog sfd = new SaveFileDialog();\n            sfd.InitialDirectory = ShapesDirectory.Value;\n            sfd.Filter = $\"{StringResources.Shape}|*.xaml\";\n            sfd.OverwritePrompt = true;\n            return sfd.ShowDialog() == DialogResult.OK ? sfd.FileName : null;\n        });\n    }\n\n    private static T ThrowIfOverflow<T>(Func<T> action, string message)\n    {\n        try\n        {\n            return action();\n        }\n        catch (OverflowException ex)\n        {\n            throw new WarningException(message, ex);\n        }\n    }\n\n    public static void Export(Surface input, Stream output, PropertyCollection props, ProgressEventHandler progressCallback, string shapePath)\n    {\n        ArgumentNullException.ThrowIfNull(input);\n        ArgumentNullException.ThrowIfNull(output);\n        ArgumentNullException.ThrowIfNull(props);\n        ArgumentNullException.ThrowIfNull(progressCallback);\n        ThrowIfOverflow(() => checked(input.Stride * input.Height), StringResources.CanvasIsTooBig);\n\n#pragma warning disable format // @formatter:off\n        ScanMode scanMode                   = props.GetPropertyValue<ScanMode>(PropertyNames.ScanMode);\n        PreviewMode previewMode             = props.GetPropertyValue<PreviewMode>(PropertyNames.PreviewMode);\n        double brightnessCutoff             = props.GetPropertyValue<double>(PropertyNames.BrightnessCutoff);\n        int highpass                        = props.GetPropertyValue<int>(PropertyNames.HighpassFilter);\n        int gmScale                         = props.GetPropertyValue<int>(PropertyNames.GreymapScale);\n        int lowpass                         = props.GetPropertyValue<int>(PropertyNames.LowpassFilter);\n        int turdsize                        = props.GetPropertyValue<int>(PropertyNames.SuppressSpeckles);\n        float alphamax                      = props.GetPropertyValue<float>(PropertyNames.SmoothCorners);\n        float opttolerance                  = props.GetPropertyValue<float>(PropertyNames.Optimize);\n        TurnPolicy turnpolicy               = props.GetPropertyValue<TurnPolicy>(PropertyNames.TurnPolicy);\n        int color                           = props.GetPropertyValue<int>(PropertyNames.Color);\n        int fillcolor                       = props.GetPropertyValue<int>(PropertyNames.FillColor);\n        bool invert                         = props.GetPropertyValue<bool>(PropertyNames.Invert);\n        bool tight                          = props.GetPropertyValue<bool>(PropertyNames.Tight);\n        bool enclose                        = props.GetPropertyValue<bool>(PropertyNames.Enclose);\n        float angle                         = props.GetPropertyValue<float>(PropertyNames.Angle);\n        float scale                         = props.GetPropertyValue<float>(PropertyNames.Scale);\n        string shapeName                    = props.GetPropertyValue<string>(PropertyNames.PdnShapeName);\n#pragma warning restore format // @formatter:on\n\n        PotraceBitmap bm;\n        TraceResult? trace;\n        ImageInfo imginfo;\n        SvgBackEnd backend = new SvgBackEnd\n        {\n            Color = color,\n            ColumnWidth = int.MaxValue\n        };\n        backend.Rx /= scale;\n        backend.Ry /= scale;\n\n        bool isSaveConfigDialogVisible = UIHelper.IsSaveConfigDialogVisible();\n        Surface surface;\n        const int maxDimForPreview = 1280;\n\n        if (isSaveConfigDialogVisible && previewMode == PreviewMode.Fast && input.Width * input.Height > maxDimForPreview * maxDimForPreview)\n        {\n            // Preview Only\n            // Image downscaled to speed up preview generation.\n            double ar = input.Width / (double)input.Height;\n            int newWidth = maxDimForPreview;\n            int newHeight = maxDimForPreview;\n            if (input.Width > input.Height)\n            {\n                newHeight = (int)Math.Round(maxDimForPreview / ar);\n            }\n            else\n            {\n                newWidth = (int)Math.Round(maxDimForPreview * ar);\n            }\n\n            surface = new Surface(newWidth, newHeight);\n            surface.FitSurface(ResamplingAlgorithm.Cubic, input);\n        }\n        else\n        {\n            surface = input.Clone();\n        }\n\n        using var _ = surface;\n        surface.BlendOnto<NormalBlendOp>(ColorBgra.White);\n\n        using CancellationTokenSource cts = new CancellationTokenSource();\n        float full = isSaveConfigDialogVisible ? 90f : 100f;\n\n        CancellationToken cancellationToken = cts.Token;\n        if (scanMode == ScanMode.Opaque)\n        {\n            backend.Opaque = true;\n            backend.FillColor = fillcolor;\n        }\n\n        if (highpass == 0)\n        {\n            bm = PotraceBitmap.FromRgbx(surface.Scan0.Pointer, surface.Width, surface.Height, c: brightnessCutoff);\n        }\n        else\n        {\n            using Greymap gm = Greymap.FromRgbx(surface.Scan0.Pointer, surface.Width, surface.Height);\n            gm.HighPassFilter(lambda: highpass);\n\n            if (lowpass > 0)\n            {\n                gm.LowPassFilter(lambda: lowpass);\n            }\n\n            if (gmScale > 1)\n            {\n                bm = gm.InterpolateCubicBilevel(gmScale, c: brightnessCutoff);\n                backend.Rx *= gmScale;\n                backend.Ry *= gmScale;\n            }\n            else\n            {\n                bm = gm.Threshold(c: brightnessCutoff);\n            }\n        }\n\n        using (bm)\n        {\n            if (invert)\n            {\n                bm.Invert();\n            }\n\n            if (enclose)\n            {\n                bm.Enclose();\n            }\n\n            Progress<ProgressArgs> progress = new Progress<ProgressArgs>((prog) => OnProgress(ConvertProgressValue(prog)));\n            trace = bm.Trace(turdsize, turnpolicy, alphamax, opttolerance, progress, cancellationToken);\n            imginfo = bm.Info;\n            imginfo.Tight = tight;\n        }\n        imginfo.Angle = angle;\n        if (trace is null)\n        {\n            if (UIHelper.IsSaveConfigDialogVisible())\n            {\n                return;\n            }\n            else\n            {\n                throw new InvalidOperationException(StringResources.NoPath);\n            }\n        }\n\n        if (isSaveConfigDialogVisible && scanMode == ScanMode.Transparent && shapePath.Length > 0)\n        {\n            PdnShapeBackEnd pdnbackend = new PdnShapeBackEnd\n            {\n                ColumnWidth = int.MaxValue,\n                DisplayName = shapeName\n            };\n            using (FileStream shapeStream = File.Open(shapePath, FileMode.Create, FileAccess.Write))\n            {\n                pdnbackend.Save(shapeStream, trace, imginfo, cancellationToken);\n            }\n\n            StringBuilder msg = new StringBuilder();\n            msg.AppendFormat(StringResources.ShapeSaved, shapePath);\n\n            if (ShapesDirectory.Value != null && Path.GetDirectoryName(shapePath)?.StartsWith(ShapesDirectory.Value, StringComparison.OrdinalIgnoreCase) == true)\n            {\n                msg.AppendLine();\n                msg.AppendLine();\n                msg.AppendLine(StringResources.ShapeSavedRestart);\n            }\n\n            UIHelper.RunOnUIThread(() =>\n            {\n                MessageBox.Show(msg.ToString(), StringResources.ShapeSavedCaption, MessageBoxButtons.OK, MessageBoxIcon.Information);\n            });\n        }\n        backend.Save(output, trace, imginfo, cancellationToken);\n\n        void OnProgress(float prog)\n        {\n            try\n            {\n                progressCallback.Invoke(null, new ProgressEventArgs(prog * full));\n            }\n            catch (OperationCanceledException)\n            {\n                try\n                {\n                    cts.Cancel();\n                }\n                catch (ObjectDisposedException)\n                {\n                    // ignore\n                }\n            }\n        }\n    }\n\n    public static void Export(Document input, Stream output, PropertyBasedSaveConfigToken token, Surface scratchSurface, ProgressEventHandler progressCallback, string shapePath)\n    {\n        ArgumentNullException.ThrowIfNull(input);\n        ArgumentNullException.ThrowIfNull(output);\n        ArgumentNullException.ThrowIfNull(token);\n        ArgumentNullException.ThrowIfNull(scratchSurface);\n        ArgumentNullException.ThrowIfNull(progressCallback);\n        ThrowIfOverflow(() => checked(scratchSurface.Stride * scratchSurface.Height), StringResources.CanvasIsTooBig);\n\n        input.Flatten(scratchSurface);\n        Export(scratchSurface, output, token.Properties, progressCallback, shapePath);\n    }\n\n    private static float ConvertProgressValue(ProgressArgs args)\n    {\n        float progress = args.Progress * .5f;\n        if (args.Level == ProgressLevel.Tracing)\n        {\n            progress += .5f;\n        }\n        return progress;\n    }\n}\n"
  },
  {
    "path": "SvgFileType/Extensions/ControlExtensions.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Windows.Forms;\n\nnamespace SvgFileTypePlugin.Extensions;\n\ninternal static class ControlExtensions\n{\n    public static IEnumerable<Control> Descendants(this Control root)\n    {\n        ArgumentNullException.ThrowIfNull(root);\n\n        foreach (Control control in root.Controls)\n        {\n            yield return control;\n            if (control.HasChildren)\n            {\n                foreach (Control child in Descendants(control))\n                {\n                    yield return child;\n                }\n            }\n        }\n    }\n\n    public static object? RunOnUIThread<T>(this Control control, T action, params object[] args) where T : Delegate\n    {\n        ArgumentNullException.ThrowIfNull(control);\n\n        return control.InvokeRequired ? control.Invoke(action, args) : action.DynamicInvoke(args);\n    }\n\n    public static object? RunOnUIThread<T>(this Control control, T action) where T : Delegate\n    {\n        ArgumentNullException.ThrowIfNull(control);\n\n        return control.InvokeRequired ? control.Invoke(action) : action.DynamicInvoke();\n    }\n}\n"
  },
  {
    "path": "SvgFileType/Extensions/DocumentExtensions.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing System;\nusing PaintDotNet;\n\nnamespace SvgFileTypePlugin.Extensions;\n\ninternal static class DocumentExtensions\n{\n    public static void SetDpu(this Document doc, double dpuX, double dpuY, MeasurementUnit dpuUnit = MeasurementUnit.Inch)\n    {\n        ArgumentNullException.ThrowIfNull(doc);\n\n        doc.DpuUnit = dpuUnit;\n        doc.DpuX = dpuX;\n        doc.DpuY = dpuY;\n    }\n\n    public static void SetDpu(this Document doc, double dpu, MeasurementUnit dpuUnit = MeasurementUnit.Inch)\n    {\n        SetDpu(doc, dpu, dpu, dpuUnit);\n    }\n}\n"
  },
  {
    "path": "SvgFileType/Extensions/StringExtensions.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing System;\nusing System.Text.RegularExpressions;\n\nnamespace SvgFileTypePlugin.Extensions;\n\ninternal static class StringExtensions\n{\n    public static string Truncate(this string s, int maxLength, string suffix = \"...\")\n    {\n        ArgumentNullException.ThrowIfNull(s);\n        ArgumentOutOfRangeException.ThrowIfNegative(maxLength);\n\n        return s.Length > maxLength ? $\"{s[..maxLength]}{suffix}\" : s;\n    }\n\n    public static string SplitIntoLines(this string s, int maximumLineLength)\n    {\n        ArgumentNullException.ThrowIfNull(s);\n        ArgumentOutOfRangeException.ThrowIfNegativeOrZero(maximumLineLength);\n\n        return Regex.Replace(s, @\"(.{1,\" + maximumLineLength + @\"})(?:\\s|$)\", \"$1\\n\");\n    }\n}\n"
  },
  {
    "path": "SvgFileType/Extensions/SurfaceExtensions.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing System;\nusing System.Runtime.Intrinsics;\nusing System.Runtime.Intrinsics.X86;\nusing PaintDotNet;\n\nnamespace SvgFileTypePlugin.Extensions;\n\ninternal static class SurfaceExtensions\n{\n    public static Document CreateSingleLayerDocument(this Surface surface, bool takeOwnership = false)\n    {\n        ArgumentNullException.ThrowIfNull(surface);\n\n        Document document = new Document(surface.Width, surface.Height);\n        try\n        {\n            BitmapLayer layer = new BitmapLayer(surface, takeOwnership);\n            document.Layers.Add(layer);\n        }\n        catch\n        {\n            document.Dispose();\n            throw;\n        }\n        return document;\n    }\n\n    public static unsafe bool IsEmpty(this Surface surface)\n    {\n        ArgumentNullException.ThrowIfNull(surface);\n\n        const int unrollFactor = 4;\n        int pixcnt = surface.Width * surface.Height;\n        sbyte* ptr = (sbyte*)surface.Scan0.VoidStar;\n\n        if (Avx2.IsSupported && pixcnt >= Vector256<uint>.Count)\n        {\n            Vector256<sbyte> valphamask = Vector256.Create(\n                3, 7, 11, 15, 19, 23, 27, 31,\n                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n                0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff).AsSByte();\n            Vector256<sbyte> zero = Vector256<sbyte>.Zero;\n            while (pixcnt >= Vector256<uint>.Count * unrollFactor)\n            {\n                Vector256<sbyte> v0 = Avx.LoadVector256(ptr);\n                Vector256<sbyte> v1 = Avx.LoadVector256(ptr + Vector256<sbyte>.Count);\n                Vector256<sbyte> v2 = Avx.LoadVector256(ptr + 2 * Vector256<sbyte>.Count);\n                Vector256<sbyte> v3 = Avx.LoadVector256(ptr + 3 * Vector256<sbyte>.Count);\n\n                v0 = Avx2.Shuffle(v0, valphamask);\n                v1 = Avx2.Shuffle(v1, valphamask);\n                v2 = Avx2.Shuffle(v2, valphamask);\n                v3 = Avx2.Shuffle(v3, valphamask);\n\n                v0 = Avx2.CompareGreaterThan(v0, zero);\n                v1 = Avx2.CompareGreaterThan(v1, zero);\n                v2 = Avx2.CompareGreaterThan(v2, zero);\n                v3 = Avx2.CompareGreaterThan(v3, zero);\n\n                int mask = Avx2.MoveMask(v0) | Avx2.MoveMask(v1) | Avx2.MoveMask(v2) | Avx2.MoveMask(v3);\n                if (mask != 0)\n                {\n                    return false;\n                }\n\n                ptr += Vector256<sbyte>.Count * unrollFactor;\n                pixcnt -= Vector256<uint>.Count * unrollFactor;\n            }\n\n            while (pixcnt >= Vector256<sbyte>.Count)\n            {\n                Vector256<sbyte> v = Avx.LoadVector256(ptr);\n                v = Avx2.Shuffle(v, valphamask);\n                v = Avx2.CompareGreaterThan(v, zero);\n                if (Avx2.MoveMask(v) != 0)\n                {\n                    return false;\n                }\n                ptr += Vector256<sbyte>.Count;\n                pixcnt -= Vector256<uint>.Count;\n            }\n        }\n\n        if (Ssse3.IsSupported && pixcnt >= Vector128<uint>.Count)\n        {\n            Vector128<sbyte> valphamask = Vector128.Create(\n                3, 7, 11, 15,\n                0xff, 0xff, 0xff, 0xff,\n                0xff, 0xff, 0xff, 0xff,\n                0xff, 0xff, 0xff, 0xff).AsSByte();\n            Vector128<sbyte> zero = Vector128<sbyte>.Zero;\n            while (pixcnt >= Vector128<uint>.Count * unrollFactor)\n            {\n                Vector128<sbyte> v0 = Sse2.LoadVector128(ptr);\n                Vector128<sbyte> v1 = Sse2.LoadVector128(ptr + Vector128<sbyte>.Count);\n                Vector128<sbyte> v2 = Sse2.LoadVector128(ptr + 2 * Vector128<sbyte>.Count);\n                Vector128<sbyte> v3 = Sse2.LoadVector128(ptr + 3 * Vector128<sbyte>.Count);\n\n                v0 = Ssse3.Shuffle(v0, valphamask);\n                v1 = Ssse3.Shuffle(v1, valphamask);\n                v2 = Ssse3.Shuffle(v2, valphamask);\n                v3 = Ssse3.Shuffle(v3, valphamask);\n\n                v0 = Sse2.CompareGreaterThan(v0, zero);\n                v1 = Sse2.CompareGreaterThan(v1, zero);\n                v2 = Sse2.CompareGreaterThan(v2, zero);\n                v3 = Sse2.CompareGreaterThan(v3, zero);\n\n                int mask = Sse2.MoveMask(v0) | Sse2.MoveMask(v1) | Sse2.MoveMask(v2) | Sse2.MoveMask(v3);\n                if (mask != 0)\n                {\n                    return false;\n                }\n\n                ptr += Vector128<sbyte>.Count * unrollFactor;\n                pixcnt -= Vector128<uint>.Count * unrollFactor;\n            }\n\n            while (pixcnt >= Vector128<sbyte>.Count)\n            {\n                Vector128<sbyte> v = Sse2.LoadVector128(ptr);\n                v = Ssse3.Shuffle(v, valphamask);\n                v = Sse2.CompareGreaterThan(v, zero);\n                if (Sse2.MoveMask(v) != 0)\n                {\n                    return false;\n                }\n                ptr += Vector128<sbyte>.Count;\n                pixcnt -= Vector128<uint>.Count;\n            }\n        }\n\n        while (pixcnt > 0)\n        {\n            if (ptr[3] > 0)\n            {\n                return false;\n            }\n            ptr += sizeof(uint);\n            pixcnt--;\n        }\n\n        return true;\n    }\n\n    public static void BlendOnto<T>(this Surface surface, ColorBgra backgroundColor) where T : UserBlendOp, new()\n    {\n        ArgumentNullException.ThrowIfNull(surface);\n\n        using Surface tmp = surface.Clone();\n        surface.Fill(backgroundColor);\n        T blendOp = new T();\n        blendOp.Apply(surface, tmp);\n    }\n}\n"
  },
  {
    "path": "SvgFileType/Extensions/SvgDocumentExtensions.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing System;\nusing System.Drawing;\nusing Svg;\nusing SvgFileTypePlugin.Import;\n\nnamespace SvgFileTypePlugin.Extensions;\n\ninternal static class SvgDocumentExtensions\n{\n    public static SvgDocument RemoveInvisibleAndNonTextElements(this SvgDocument svg)\n    {\n        ArgumentNullException.ThrowIfNull(svg);\n\n        SvgFragment clonedFragment = (SvgFragment)svg.Clone();\n        clonedFragment.RemoveInvisibleAndNonTextElements();\n        SvgDocument clonedDocument = new SvgDocument();\n        clonedDocument.Children.Add(clonedFragment);\n        return clonedDocument;\n    }\n\n    public static IDisposable UseSetRasterDimensions(this SvgDocument svg, SvgImportConfig config)\n    {\n        ArgumentNullException.ThrowIfNull(svg);\n        ArgumentNullException.ThrowIfNull(config);\n\n        SvgAspectRatio origAR = svg.AspectRatio;\n        SizeF origSize = svg.GetDimensions();\n        SizeF rasterSize = origSize;\n        SvgViewBox origViewBox = svg.ViewBox;\n        if (origViewBox.IsEmpty() && !origSize.IsEmpty)\n        {\n            svg.ViewBox = new SvgViewBox(0, 0, origSize.Width, origSize.Height);\n        }\n        svg.RasterizeDimensions(ref rasterSize, config.RasterWidth, config.RasterHeight);\n        svg.Width = new SvgUnit(SvgUnitType.User, rasterSize.Width);\n        svg.Height = new SvgUnit(SvgUnitType.User, rasterSize.Height);\n        svg.AspectRatio = new SvgAspectRatio(config.PreserveAspectRatio\n            ? SvgPreserveAspectRatio.xMinYMin\n            : SvgPreserveAspectRatio.none);\n        return new DisposableAction(() =>\n        {\n            // Restore the original values back\n            svg.AspectRatio = origAR;\n            svg.Width = origSize.Width;\n            svg.Height = origSize.Height;\n            svg.ViewBox = origViewBox;\n        });\n    }\n\n    private sealed class DisposableAction : IDisposable\n    {\n        private Action? _dispose;\n\n        public DisposableAction(Action dispose)\n        {\n            ArgumentNullException.ThrowIfNull(dispose);\n\n            _dispose = dispose;\n        }\n\n        public void Dispose()\n        {\n            _dispose?.Invoke();\n            _dispose = null;\n        }\n    }\n}\n"
  },
  {
    "path": "SvgFileType/Extensions/SvgElementExtensions.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing System;\nusing System.Globalization;\nusing System.IO;\nusing System.Reflection;\nusing System.Text;\nusing System.Xml;\nusing Svg;\n\nnamespace SvgFileTypePlugin.Extensions;\n\ninternal static class SvgElementExtensions\n{\n    private delegate SvgAttributeCollection AttributesGetterDelegate(SvgElement element);\n    private delegate string? ElementNameGetterDelegate(SvgElement element);\n\n    private static readonly AttributesGetterDelegate GetElementAttributes = CreateGetterDelegate<AttributesGetterDelegate>(\"Attributes\");\n    private static readonly ElementNameGetterDelegate GetElementName = CreateGetterDelegate<ElementNameGetterDelegate>(\"ElementName\");\n    private static readonly XmlWriterSettings WriterSettings = new() { Encoding = Encoding.UTF8 };\n\n    public static string GetName(this SvgElement element)\n    {\n        ArgumentNullException.ThrowIfNull(element);\n\n        return element.GetType().GetCustomAttribute<SvgElementAttribute>()?.ElementName\n            ?? GetElementName(element)\n            ?? element.GetType().Name;\n    }\n\n    public static SvgAttributeCollection GetAttributes(this SvgElement element)\n    {\n        ArgumentNullException.ThrowIfNull(element);\n\n        return GetElementAttributes(element);\n    }\n\n    public static void RemoveInvisibleAndNonTextElements(this SvgElement element)\n    {\n        ArgumentNullException.ThrowIfNull(element);\n\n        for (int i = element.Children.Count - 1; i >= 0; i--)\n        {\n            SvgElement child = element.Children[i];\n            if (child is not SvgTextBase && child.Visibility != \"visible\")\n            {\n                element.Children.RemoveAt(i);\n            }\n            else\n            {\n                child.RemoveInvisibleAndNonTextElements();\n            }\n        }\n    }\n\n    public static string GetXML_QuotedFuncIRIHack(this SvgElement svg)\n    {\n        ArgumentNullException.ThrowIfNull(svg);\n\n        using InvariantUtf8StringWriter writer = new InvariantUtf8StringWriter();\n        using (XmlWriter xmlWriter = new CustomXmlWriter(XmlWriter.Create(writer, WriterSettings)))\n        {\n            svg.Write(xmlWriter);\n            xmlWriter.Flush();\n        }\n        writer.Flush();\n        return writer.ToString();\n    }\n\n    public static void WriteXML_QuotedFuncIRIHack(this SvgElement svg, Stream output)\n    {\n        ArgumentNullException.ThrowIfNull(svg);\n\n        using InvariantUtf8StreamWriter writer = new InvariantUtf8StreamWriter(output);\n        using (XmlWriter xmlWriter = new CustomXmlWriter(XmlWriter.Create(writer, WriterSettings)))\n        {\n            svg.Write(xmlWriter);\n            xmlWriter.Flush();\n        }\n        writer.Flush();\n    }\n\n    private static T CreateGetterDelegate<T>(string propertyName) where T : Delegate\n    {\n        MethodInfo getter = typeof(SvgElement)\n            ?.GetProperty(propertyName, BindingFlags.NonPublic | BindingFlags.Instance)\n            ?.GetGetMethod(true)\n            ?? throw new MissingMemberException(nameof(SvgElement), propertyName);\n        return getter.CreateDelegate<T>();\n    }\n\n    #region InvariantUtf8StreamWriter\n\n    private sealed class InvariantUtf8StreamWriter(Stream stream) : StreamWriter(stream, Encoding.UTF8, leaveOpen: true)\n    {\n        private readonly Stream stream = stream;\n\n        public override Encoding Encoding => Encoding.UTF8;\n        public override IFormatProvider FormatProvider => CultureInfo.InvariantCulture;\n\n        protected override void Dispose(bool disposing)\n        {\n            base.Dispose(disposing);\n            if (disposing)\n            {\n                stream.Position = 0;\n            }\n        }\n    }\n\n    #endregion\n\n    #region InvariantUtf8StringWriter\n\n    private sealed class InvariantUtf8StringWriter() : StringWriter(CultureInfo.InvariantCulture)\n    {\n        public override Encoding Encoding => Encoding.UTF8;\n    }\n\n    #endregion\n\n    #region CustomXmlWriter\n\n    // Workaround for removing quotes from quoted FuncIRI(s).\n\n    private sealed class CustomXmlWriter(XmlWriter writer) : XmlWriter\n    {\n        private readonly XmlWriter writer = writer;\n        public override WriteState WriteState => writer.WriteState;\n        public override void Flush() => writer.Flush();\n        public override string? LookupPrefix(string ns) => writer.LookupPrefix(ns);\n        public override void WriteBase64(byte[] buffer, int index, int count) => writer.WriteBase64(buffer, index, count);\n        public override void WriteCData(string? text) => writer.WriteCData(text);\n        public override void WriteCharEntity(char ch) => writer.WriteCharEntity(ch);\n        public override void WriteChars(char[] buffer, int index, int count) => writer.WriteChars(buffer, index, count);\n        public override void WriteComment(string? text) => writer.WriteComment(text);\n        public override void WriteDocType(string name, string? pubid, string? sysid, string? subset) => writer.WriteDocType(name, pubid, sysid, subset);\n        public override void WriteEndAttribute() => writer.WriteEndAttribute();\n        public override void WriteEndDocument() => writer.WriteEndDocument();\n        public override void WriteEndElement() => writer.WriteEndElement();\n        public override void WriteEntityRef(string name) => writer.WriteEntityRef(name);\n        public override void WriteFullEndElement() => writer.WriteFullEndElement();\n        public override void WriteProcessingInstruction(string name, string? text) => writer.WriteProcessingInstruction(name, text);\n        public override void WriteRaw(char[] buffer, int index, int count) => writer.WriteRaw(buffer, index, count);\n        public override void WriteRaw(string data) => writer.WriteRaw(data);\n        public override void WriteStartAttribute(string? prefix, string localName, string? ns) => writer.WriteStartAttribute(prefix, localName, ns);\n        public override void WriteStartDocument() => writer.WriteStartDocument();\n        public override void WriteStartDocument(bool standalone) => writer.WriteStartDocument(standalone);\n        public override void WriteStartElement(string? prefix, string localName, string? ns) => writer.WriteStartElement(prefix, localName, ns);\n        public override void WriteString(string? text)\n        {\n            writer.WriteString(text?.Replace(\"\\\"\", string.Empty).Replace(\"\\'\", string.Empty));\n        }\n        public override void WriteSurrogateCharEntity(char lowChar, char highChar) => writer.WriteSurrogateCharEntity(lowChar, highChar);\n        public override void WriteWhitespace(string? ws) => writer.WriteWhitespace(ws);\n    }\n\n    #endregion\n}\n"
  },
  {
    "path": "SvgFileType/Extensions/SvgUnitExtensions.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing System;\nusing Svg;\n\nnamespace SvgFileTypePlugin.Extensions;\n\ninternal static class SvgUnitExtensions\n{\n    public static int ToDeviceValue(this SvgUnit unit, SvgElement owner, UnitRenderingType unitRenderingType = UnitRenderingType.Other)\n    {\n        ArgumentNullException.ThrowIfNull(owner);\n\n        using ISvgRenderer renderer = SvgRenderer.FromNull();\n        float value = unit.ToDeviceValue(renderer, unitRenderingType, owner);\n        return checked((int)Math.Round(value));\n    }\n}\n"
  },
  {
    "path": "SvgFileType/Extensions/SvgUseExtensions.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing System;\nusing System.Collections.Generic;\nusing Svg;\nusing Svg.Transforms;\n\nnamespace SvgFileTypePlugin.Extensions;\n\ninternal static class SvgUseExtensions\n{\n    public static SvgElement? GetCopyOfReferencedElement(this SvgUse useElement)\n    {\n        ArgumentNullException.ThrowIfNull(useElement);\n        SvgDocument document = useElement.OwnerDocument \n            ?? throw new ArgumentException(\"Use element does not have an owner document.\", nameof(useElement));\n\n        List<SvgTransform> transforms = [];\n        SvgElement? referencedElement = useElement;\n        while (referencedElement is SvgUse parentUse and { ReferencedElement: Uri uri })\n        {\n            string href = uri.ToString().TrimStart('#');\n            if (href.Length < 1)\n            {\n                return null;\n            }\n            if (parentUse.Transforms is { Count: > 0 })\n            {\n                transforms.AddRange(parentUse.Transforms);\n            }\n            referencedElement = document.GetElementById(href);\n        }\n        if (referencedElement is null)\n        {\n            return null;\n        }\n        SvgElement copiedElement = referencedElement.DeepCopy();\n        useElement.CopyOverridedAttributes(copiedElement);\n        copiedElement.Transforms ??= [];\n        copiedElement.Transforms.AddRange(transforms);\n        return copiedElement;\n    }\n\n    private static void CopyOverridedAttributes(this SvgUse useElement, SvgElement targetElement)\n    {\n        SvgAttributeCollection targetAttributes = targetElement.GetAttributes();\n        SvgAttributeCollection sourceAttributes = useElement.GetAttributes();\n\n        foreach (KeyValuePair<string, object> attribute in sourceAttributes)\n        {\n            string key = attribute.Key.ToLowerInvariant();\n\n            // Most attributes on use do not override those already on the element\n            // referenced by use. (This differs from how CSS style attributes override\n            // those set 'earlier' in the cascade). Only the attributes x, y, width,\n            // height and href on the use element will override those set on the\n            // referenced element.However, any other attributes not set on the referenced\n            // element will be applied to the use element.\n            if (key is \"x\" or \"y\" or \"width\" or \"height\" or \"href\" or \"xlink:href\")\n            {\n                targetAttributes[key] = attribute.Value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "SvgFileType/Extensions/SvgViewBoxExtensions.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing Svg;\n\nnamespace SvgFileTypePlugin.Extensions;\n\ninternal static class SvgViewBoxExtensions\n{\n    public static bool IsEmpty(this SvgViewBox vb)\n    {\n        return vb.Width < float.Epsilon || vb.Height < float.Epsilon;\n    }\n}\n"
  },
  {
    "path": "SvgFileType/Extensions/SvgVisualElementExtensions.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\nusing Svg;\n\nnamespace SvgFileTypePlugin.Extensions;\n\ninternal static class SvgVisualElementExtensions\n{\n    #region OriginalVisibilityAttribute\n\n    private const string OriginalVisibilityAttribute = \"original_visibility\";\n\n    public static bool IsOriginallyVisible(this SvgVisualElement element)\n    {\n        ArgumentNullException.ThrowIfNull(element);\n\n        return element.CustomAttributes.TryGetValue(OriginalVisibilityAttribute, out string? arg) \n            && string.Equals(arg.Trim(), \"visible\", StringComparison.OrdinalIgnoreCase);\n    }\n\n    public static void StoreOriginalVisibility(this SvgVisualElement element)\n    {\n        ArgumentNullException.ThrowIfNull(element);\n\n        SvgCustomAttributeCollection col = element.CustomAttributes;\n        if (col.ContainsKey(OriginalVisibilityAttribute))\n        {\n            col[OriginalVisibilityAttribute] = element.Visibility;\n        }\n        else\n        {\n            col.Add(OriginalVisibilityAttribute, element.Visibility);\n        }\n    }\n\n    #endregion\n\n    #region GroupNameAttribute \n\n    private const string GroupNameAttribute = \"group_name\";\n\n    public static string? GetGroupName(this SvgVisualElement element)\n    {\n        ArgumentNullException.ThrowIfNull(element);\n\n        return element.CustomAttributes.TryGetValue(GroupNameAttribute, out string? groupName) ? groupName : null;\n    }\n\n    public static void SetGroupName(this SvgVisualElement element, string? groupName)\n    {\n        ArgumentNullException.ThrowIfNull(element);\n\n        SvgCustomAttributeCollection col = element.CustomAttributes;\n        if (col.ContainsKey(GroupNameAttribute))\n        {\n            if (string.IsNullOrEmpty(groupName))\n            {\n                col.Remove(GroupNameAttribute);\n            }\n            else\n            {\n                col[GroupNameAttribute] = groupName;\n            }\n        }\n        else if (!string.IsNullOrEmpty(groupName))\n        {\n            col.Add(GroupNameAttribute, groupName);\n        }\n    }\n\n    #endregion\n\n    public static IEnumerable<SvgVisualElement> NotOfType<TElement>(this IEnumerable<SvgVisualElement> source)\n        where TElement : SvgVisualElement\n    {\n        ArgumentNullException.ThrowIfNull(source);\n\n        return source.Where(element => element is not TElement);\n    }\n\n    public static bool IsDisplayable(this SvgVisualElement element)\n    {\n        ArgumentNullException.ThrowIfNull(element);\n\n        return !element.Display.Trim().Equals(\"none\", StringComparison.OrdinalIgnoreCase);\n    }\n\n    public static bool PreRender(this SvgVisualElement element, IReadOnlyCollection<SvgVisualElement> elements, bool hiddenElements, CancellationToken ctoken = default)\n    {\n        ArgumentNullException.ThrowIfNull(element);\n        ArgumentNullException.ThrowIfNull(elements);\n\n        // Turn off visibility of all other elements\n        foreach (SvgVisualElement sibling in elements.Where(e => e != element))\n        {\n            ctoken.ThrowIfCancellationRequested();\n            sibling.Visibility = \"hidden\";\n        }\n\n        element.Visibility = \"visible\";\n\n        // Turn on visibility from node to parent\n        for (SvgElement parent = element.Parent; parent != null; parent = parent.Parent)\n        {\n            ctoken.ThrowIfCancellationRequested();\n\n            if (parent is not SvgVisualElement visual)\n            {\n                continue;\n            }\n\n            // Check, maybe parent element was initially hidden\n            // Skip hidden layers.\n            if (!hiddenElements && !visual.IsOriginallyVisible())\n            {\n                return false;\n            }\n\n            visual.Visibility = \"visible\";\n        }\n        return true;\n    }\n}\n"
  },
  {
    "path": "SvgFileType/FodyWeavers.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Weavers xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"FodyWeavers.xsd\">\n    <ILMerge IncludeAssemblies=\"Svg|ExCss|resvg.net|BitmapVectorizer|SimplePaletteQuantizer|PaintDotNet.IndirectUI.Fluent\" NamespacePrefix=\"\" IncludeResources=\"\\.(resources|dtd|zip)$\" CompactMode=\"0\" FullImport=\"0\" />\n</Weavers>"
  },
  {
    "path": "SvgFileType/FodyWeavers.xsd",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">\n  <!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. -->\n  <xs:element name=\"Weavers\">\n    <xs:complexType>\n      <xs:all>\n        <xs:element name=\"ILMerge\" minOccurs=\"0\" maxOccurs=\"1\">\n          <xs:complexType>\n            <xs:all>\n              <xs:element name=\"IncludeAssemblies\" type=\"xs:string\" minOccurs=\"0\" maxOccurs=\"1\">\n                <xs:annotation>\n                  <xs:documentation>A regular expression matching the assembly names to include in merging.</xs:documentation>\n                </xs:annotation>\n              </xs:element>\n              <xs:element name=\"ExcludeAssemblies\" type=\"xs:string\" minOccurs=\"0\" maxOccurs=\"1\">\n                <xs:annotation>\n                  <xs:documentation>A regular expression matching the assembly names to exclude from merging.</xs:documentation>\n                </xs:annotation>\n              </xs:element>\n              <xs:element name=\"IncludeResources\" type=\"xs:string\" minOccurs=\"0\" maxOccurs=\"1\">\n                <xs:annotation>\n                  <xs:documentation>A regular expression matching the resource names to include in merging.</xs:documentation>\n                </xs:annotation>\n              </xs:element>\n              <xs:element name=\"ExcludeResources\" type=\"xs:string\" minOccurs=\"0\" maxOccurs=\"1\">\n                <xs:annotation>\n                  <xs:documentation>A regular expression matching the resource names to exclude from merging.</xs:documentation>\n                </xs:annotation>\n              </xs:element>\n              <xs:element name=\"HideImportedTypes\" type=\"xs:boolean\" minOccurs=\"0\" maxOccurs=\"1\">\n                <xs:annotation>\n                  <xs:documentation>A switch to control whether the imported types are hidden (made private) or keep their visibility unchanged. Default is 'true'</xs:documentation>\n                </xs:annotation>\n              </xs:element>\n              <xs:element name=\"NamespacePrefix\" type=\"xs:string\" minOccurs=\"0\" maxOccurs=\"1\">\n                <xs:annotation>\n                  <xs:documentation>A string that is used as prefix for the namespace of the imported types.</xs:documentation>\n                </xs:annotation>\n              </xs:element>\n              <xs:element name=\"FullImport\" type=\"xs:boolean\" minOccurs=\"0\" maxOccurs=\"1\">\n                <xs:annotation>\n                  <xs:documentation>A switch to control whether to import the full assemblies or only the referenced types. Default is 'false'</xs:documentation>\n                </xs:annotation>\n              </xs:element>\n              <xs:element name=\"CompactMode\" type=\"xs:boolean\" minOccurs=\"0\" maxOccurs=\"1\">\n                <xs:annotation>\n                  <xs:documentation>A switch to enable compacting of the target assembly by skipping properties, events and unused methods. Default is 'false'</xs:documentation>\n                </xs:annotation>\n              </xs:element>\n            </xs:all>\n            <xs:attribute name=\"IncludeAssemblies\" type=\"xs:string\">\n              <xs:annotation>\n                <xs:documentation>A regular expression matching the assembly names to include in merging.</xs:documentation>\n              </xs:annotation>\n            </xs:attribute>\n            <xs:attribute name=\"ExcludeAssemblies\" type=\"xs:string\">\n              <xs:annotation>\n                <xs:documentation>A regular expression matching the assembly names to exclude from merging.</xs:documentation>\n              </xs:annotation>\n            </xs:attribute>\n            <xs:attribute name=\"IncludeResources\" type=\"xs:string\">\n              <xs:annotation>\n                <xs:documentation>A regular expression matching the resource names to include in merging.</xs:documentation>\n              </xs:annotation>\n            </xs:attribute>\n            <xs:attribute name=\"ExcludeResources\" type=\"xs:string\">\n              <xs:annotation>\n                <xs:documentation>A regular expression matching the resource names to exclude from merging.</xs:documentation>\n              </xs:annotation>\n            </xs:attribute>\n            <xs:attribute name=\"HideImportedTypes\" type=\"xs:boolean\">\n              <xs:annotation>\n                <xs:documentation>A switch to control whether the imported types are hidden (made private) or keep their visibility unchanged. Default is 'true'</xs:documentation>\n              </xs:annotation>\n            </xs:attribute>\n            <xs:attribute name=\"NamespacePrefix\" type=\"xs:string\">\n              <xs:annotation>\n                <xs:documentation>A string that is used as prefix for the namespace of the imported types.</xs:documentation>\n              </xs:annotation>\n            </xs:attribute>\n            <xs:attribute name=\"FullImport\" type=\"xs:boolean\">\n              <xs:annotation>\n                <xs:documentation>A switch to control whether to import the full assemblies or only the referenced types. Default is 'false'</xs:documentation>\n              </xs:annotation>\n            </xs:attribute>\n            <xs:attribute name=\"CompactMode\" type=\"xs:boolean\">\n              <xs:annotation>\n                <xs:documentation>A switch to enable compacting of the target assembly by skipping properties, events and unused methods. Default is 'false'</xs:documentation>\n              </xs:annotation>\n            </xs:attribute>\n          </xs:complexType>\n        </xs:element>\n      </xs:all>\n      <xs:attribute name=\"VerifyAssembly\" type=\"xs:boolean\">\n        <xs:annotation>\n          <xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation>\n        </xs:annotation>\n      </xs:attribute>\n      <xs:attribute name=\"VerifyIgnoreCodes\" type=\"xs:string\">\n        <xs:annotation>\n          <xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation>\n        </xs:annotation>\n      </xs:attribute>\n      <xs:attribute name=\"GenerateXsd\" type=\"xs:boolean\">\n        <xs:annotation>\n          <xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation>\n        </xs:annotation>\n      </xs:attribute>\n    </xs:complexType>\n  </xs:element>\n</xs:schema>"
  },
  {
    "path": "SvgFileType/Import/Direct2DSvgRenderer.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.IO;\nusing System.Runtime;\nusing System.Threading;\nusing PaintDotNet;\nusing PaintDotNet.Direct2D1;\nusing PaintDotNet.DirectWrite;\nusing PaintDotNet.Imaging;\nusing PaintDotNet.Rendering;\nusing Svg;\nusing SvgFileTypePlugin.Extensions;\nusing FontStyle = PaintDotNet.DirectWrite.FontStyle;\nusing IDeviceContext = PaintDotNet.Direct2D1.IDeviceContext;\nusing SR = SvgFileTypePlugin.Localization.StringResources;\n\nnamespace SvgFileTypePlugin.Import;\n\ninternal sealed class Direct2DSvgRenderer() : SvgRenderer2(name: \"Direct2D\")\n{\n    protected override Document GetFlatDocument(string svgdata, SvgImportConfig config, CancellationToken ctoken = default)\n    {\n        ArgumentException.ThrowIfNullOrWhiteSpace(svgdata);\n        ArgumentNullException.ThrowIfNull(config);\n\n        ctoken.ThrowIfCancellationRequested();\n        (int width, int height) = (config.RasterWidth, config.RasterHeight);\n        using BenchmarkScope _ = new BenchmarkScope();\n        using MemoryFailPoint mfp = GetMemoryFailPoint(width, height, 1);\n        ResetProgress(1);\n        Surface surface = new Surface(width, height, SurfaceCreationFlags.DoNotZeroFillHint);\n        try\n        {\n            SvgDocument svgdoc = SvgDocument.FromSvg<SvgDocument>(svgdata);\n            IDirect2DFactory d2d = Services.Get<IDirect2DFactory>(); // Don't dispose this! It's singleton.\n            using IBitmap<ColorBgra32> sbitmap = surface.CreateSharedBitmap();\n            using IBitmap<ColorPbgra32> pbitmap = sbitmap.CreatePremultipliedAdapter(PremultipliedAdapterOptions.UnPremultiplyOnDispose);\n            using IDeviceContext dc = d2d.CreateBitmapDeviceContext(pbitmap);\n            using MemoryStream stream = new MemoryStream();\n            svgdoc.WriteXML_QuotedFuncIRIHack(stream);\n            using ISvgDocument svg = dc.CreateSvgDocument(stream, viewportSize: new SizeFloat(width, height));\n            using DrawingScope _1 = dc.UseBeginDraw();\n            dc.Transform = CalculateTransform(svgsize: new SizeF(svgdoc.Width, svgdoc.Height), config);\n            dc.Clear();\n            dc.DrawSvgDocument(svg);\n        }\n        catch (Exception)\n        {\n            surface.Dispose();\n            throw;\n        }\n\n        Document document = surface.CreateSingleLayerDocument(takeOwnership: true);\n        document.SetDpu(config.Ppi);\n        IncrementProgress();\n        return document;\n    }\n\n    protected override Document GetLayeredDocument(string svgdata, SvgImportConfig config, CancellationToken ctoken = default)\n    {\n        ArgumentException.ThrowIfNullOrWhiteSpace(svgdata);\n        ArgumentNullException.ThrowIfNull(config);\n\n        using BenchmarkScope _ = new BenchmarkScope();\n        SvgDocument svg = SvgDocument.FromSvg<SvgDocument>(svgdata);\n        using IDisposable _1 = svg.UseSetRasterDimensions(config);\n\n        List<SvgVisualElement> elements = GetSvgVisualElements(svg, config, ctoken);\n        ctoken.ThrowIfCancellationRequested();\n\n        using MemoryFailPoint _2 = GetMemoryFailPoint(config.RasterWidth, config.RasterHeight, elements.Count);\n\n        ResetProgress(elements.Count);\n        List<BitmapLayer> layers = [];\n\n        IDirect2DFactory d2d = Services.Get<IDirect2DFactory>(); // Don't dispose this! It's singleton.\n        using Surface surface = new Surface(config.RasterWidth, config.RasterHeight);\n        using IBitmap<ColorBgra32> sharedBitmap = surface.CreateSharedBitmap();\n        using IBitmap<ColorPbgra32> premultiplied = sharedBitmap.CreatePremultipliedAdapter(PremultipliedAdapterOptions.None);\n        using IDeviceContext dc = d2d.CreateBitmapDeviceContext(premultiplied);\n        // Render all visual elements that are passed here.\n        foreach (SvgVisualElement element in elements)\n        {\n            ctoken.ThrowIfCancellationRequested();\n\n            BitmapLayer? layer;\n            if (element is GroupBoundary boundaryNode)\n            {\n                // Render empty group boundary and continue\n                layer = boundaryNode.ToEmptyLayer(config.RasterWidth, config.RasterHeight);\n                layers.Add(layer);\n                IncrementProgress();\n                continue;\n            }\n\n            if (!element.PreRender(elements, config.ImportHiddenElements, ctoken))\n            {\n                IncrementProgress();\n                continue;\n            }\n\n            RenderSvgDocument(element, dc);\n            if (surface.IsEmpty())\n            {\n                IncrementProgress();\n                continue;\n            }\n            layer = new BitmapLayer(surface, takeOwnership: false);\n            try\n            {\n                layer.Name = GetLayerTitle(element);\n                if (config.RespectElementOpacity)\n                {\n                    layer.Opacity = ToByteOpacity(element.Opacity);\n                }\n\n                if (config.ImportHiddenElements && !element.IsOriginallyVisible())\n                {\n                    layer.Visible = false;\n                }\n            }\n            catch (Exception)\n            {\n                layer?.Dispose();\n                layers.ForEach(layer => layer.Dispose());\n                throw;\n            }\n\n            IncrementProgress();\n            layers.Add(layer);\n        }\n        return GetDocument(layers, config);\n    }\n\n    public override Document GetNoPathDocument()\n    {\n        IDirectWriteFactory dw = Services.Get<IDirectWriteFactory>();\n        IDirect2DFactory d2d = Services.Get<IDirect2DFactory>();\n        using ITextFormat textFormat = dw.CreateTextFormat(\"Arial\", null, FontWeight.Bold, FontStyle.Normal, FontStretch.Normal, UIScaleFactor.ConvertFontPointsToDips(24));\n        using ITextLayout textLayout = dw.CreateTextLayout(SR.NoPath, textFormat);\n        textLayout.WordWrapping = WordWrapping.NoWrap;\n        TextMeasurement textMeasurement = textLayout.Measure();\n        int width = (int)textMeasurement.Width;\n        int height = (int)textMeasurement.Height;\n        //StrokeStyleProperties strokeStyleProperties = StrokeStyleProperties.Default;\n        //strokeStyleProperties.LineJoin = LineJoin.Bevel;\n        //strokeStyleProperties.MiterLimit = 0;\n        Surface surface = new Surface(width, height, SurfaceCreationFlags.DoNotZeroFillHint);\n        using (IBitmap<ColorBgra32> shared = surface.CreateSharedBitmap())\n        using (IBitmap<ColorPbgra32> premltd = shared.CreatePremultipliedAdapter(PremultipliedAdapterOptions.UnPremultiplyOnDispose))\n        using (IDeviceContext dc = d2d.CreateBitmapDeviceContext(premltd))\n        using (ISolidColorBrush textBrush = dc.CreateSolidColorBrush(Color.Black))\n        //using (ISolidColorBrush strokeBrush = dc.CreateSolidColorBrush(Color.Red))\n        //using (IGeometry textGeometry = d2d.CreateGeometryFromTextLayout(textLayout))\n        //using (IStrokeStyle strokeStyle = d2d.CreateStrokeStyle(strokeStyleProperties))\n        //using (IGeometry widenedGeometry = textGeometry.Widen(1, strokeStyle))\n        //using (IGeometry outerStrokeGeometry = widenedGeometry.CombineWithGeometry(textGeometry, GeometryCombineMode.Exclude))\n        using (dc.UseTextRenderingMode(TextRenderingMode.Default))\n        using (dc.UseTextAntialiasMode(TextAntialiasMode.Grayscale))\n        using (dc.UseBeginDraw())\n        {\n            dc.Clear(Color.LightGray);\n            dc.DrawTextLayout(0, 0, textLayout, textBrush, DrawTextOptions.EnableColorFont);\n            //dc.FillGeometry(textGeometry, textBrush);\n            //dc.FillGeometry(outerStrokeGeometry, strokeBrush);\n        }\n        return surface.CreateSingleLayerDocument(takeOwnership: true);\n    }\n\n    private void RenderSvgDocument(SvgElement element, IDeviceContext dc)\n    {\n        if (element is SvgUse use)\n        {\n            RenderSvgUseElement(use, e => RenderSvgDocument(e, dc));\n        }\n        else\n        {\n            SvgDocument clone = element.OwnerDocument.RemoveInvisibleAndNonTextElements();\n            using MemoryStream stream = new MemoryStream();\n            clone.WriteXML_QuotedFuncIRIHack(stream);\n            using ISvgDocument partial = dc.CreateSvgDocument(stream, dc.Size);\n            using DrawingScope _ = dc.UseBeginDraw();\n            dc.Clear();\n            dc.DrawSvgDocument(partial);\n        }\n    }\n\n    private static Matrix3x2Float CalculateTransform(SizeF svgsize, SvgImportConfig config)\n    {\n        float ratioX = config.RasterWidth / svgsize.Width;\n        float ratioY = config.PreserveAspectRatio ? ratioX : config.RasterHeight / svgsize.Height;\n        return new Matrix3x2Float()\n        {\n            M11 = ratioX,\n            M22 = ratioY\n        };\n    }\n}\n"
  },
  {
    "path": "SvgFileType/Import/GdipSvgRenderer.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Runtime;\nusing System.Threading;\nusing PaintDotNet;\nusing Svg;\nusing SvgFileTypePlugin.Extensions;\n\nnamespace SvgFileTypePlugin.Import;\n\ninternal sealed class GdipSvgRenderer() : SvgRenderer2(name: \"GDI+\")\n{\n    protected override Document GetFlatDocument(string svgdata, SvgImportConfig config, CancellationToken ctoken = default)\n    {\n        ArgumentException.ThrowIfNullOrWhiteSpace(svgdata);\n        ArgumentNullException.ThrowIfNull(config);\n\n        ctoken.ThrowIfCancellationRequested();\n\n        using BenchmarkScope _ = new BenchmarkScope();\n        SvgDocument svg = SvgDocument.FromSvg<SvgDocument>(svgdata);\n        using IDisposable _1 = svg.UseSetRasterDimensions(config);\n\n        List<SvgVisualElement> elements = GetSvgVisualElements(svg, config, ctoken);\n        using MemoryFailPoint _2 = GetMemoryFailPoint(config.RasterWidth, config.RasterHeight, 2);\n\n        ResetProgress(elements.Count);\n        using Bitmap bmp = new Bitmap(config.RasterWidth, config.RasterHeight);\n        using (Graphics g = Graphics.FromImage(bmp))\n        {\n            // Render all visual elements that are passed here.\n            foreach (SvgVisualElement element in elements)\n            {\n                ctoken.ThrowIfCancellationRequested();\n                if (!element.PreRender(elements, hiddenElements: false, ctoken))\n                {\n                    IncrementProgress();\n                    continue;\n                }\n                RenderSvgDocument(element, g, config);\n                IncrementProgress();\n            }\n        }\n        Document document = Document.FromImage(bmp);\n        document.SetDpu(config.Ppi);\n        return document;\n    }\n\n    protected override Document GetLayeredDocument(string svgdata, SvgImportConfig config, CancellationToken ctoken = default)\n    {\n        ArgumentException.ThrowIfNullOrWhiteSpace(svgdata);\n        ArgumentNullException.ThrowIfNull(config);\n\n        using BenchmarkScope _ = new BenchmarkScope();\n        SvgDocument svg = SvgDocument.FromSvg<SvgDocument>(svgdata);\n        using IDisposable _1 = svg.UseSetRasterDimensions(config);\n\n        List<SvgVisualElement> elements = GetSvgVisualElements(svg, config, ctoken);\n        ctoken.ThrowIfCancellationRequested();\n\n        using MemoryFailPoint _2 = GetMemoryFailPoint(config.RasterWidth, config.RasterHeight, elements.Count);\n\n        ResetProgress(elements.Count);\n        List<BitmapLayer> layers = [];\n        using Bitmap bmp = new Bitmap(config.RasterWidth, config.RasterHeight);\n        using Graphics g = Graphics.FromImage(bmp);\n        // Render all visual elements that are passed here.\n        foreach (SvgVisualElement element in elements)\n        {\n            ctoken.ThrowIfCancellationRequested();\n\n            BitmapLayer? layer;\n            if (element is GroupBoundary boundaryNode)\n            {\n                // Render empty group boundary and continue\n                layer = boundaryNode.ToEmptyLayer(config.RasterWidth, config.RasterHeight);\n                layers.Add(layer);\n                IncrementProgress();\n                continue;\n            }\n\n            if (!element.PreRender(elements, config.ImportHiddenElements, ctoken))\n            {\n                IncrementProgress();\n                continue;\n            }\n\n            g.Clear(default);\n            RenderSvgDocument(element, g, config);\n            Surface surface = Surface.CopyFromBitmap(bmp, detectDishonestAlpha: false);\n            if (surface.IsEmpty())\n            {\n                surface.Dispose();\n                IncrementProgress();\n                continue;\n            }\n\n            layer = new BitmapLayer(surface, takeOwnership: true);\n            try\n            {\n                layer.Name = GetLayerTitle(element);\n                if (config.RespectElementOpacity)\n                    layer.Opacity = ToByteOpacity(element.Opacity);\n\n                if (config.ImportHiddenElements && !element.IsOriginallyVisible())\n                    layer.Visible = false;\n            }\n            catch (Exception)\n            {\n                surface.Dispose();\n                layer?.Dispose();\n                layers.ForEach(layer => layer.Dispose());\n                throw;\n            }\n            IncrementProgress();\n            layers.Add(layer);\n        }\n        return GetDocument(layers, config);\n    }\n\n    private void RenderSvgDocument(SvgElement element, Graphics graphics, SvgImportConfig config)\n    {\n        if (element is SvgUse use)\n        {\n            RenderSvgUseElement(use, e => RenderSvgDocument(e, graphics, config));\n        }\n        else\n        {\n            SvgDocument clone = element.OwnerDocument.RemoveInvisibleAndNonTextElements();\n            clone.Draw(graphics);\n        }\n    }\n}\n"
  },
  {
    "path": "SvgFileType/Import/LayersMode.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nnamespace SvgFileTypePlugin.Import;\n\ninternal enum LayersMode\n{\n    Flat,\n    Groups,\n    All\n}\n"
  },
  {
    "path": "SvgFileType/Import/MyBaseForm.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing System;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Runtime.InteropServices;\nusing System.Security;\nusing System.Windows.Forms;\nusing PaintDotNet;\nusing SvgFileTypePlugin.Extensions;\n\nnamespace SvgFileTypePlugin.Import;\n\ninternal partial class MyBaseForm : Form\n{\n    #region Properties\n\n    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\n    public bool UseAppThemeColors { get; private set; }\n\n    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\n    public virtual bool EnableImmersiveDarkMode => false;\n\n    #endregion\n\n    #region Constructor\n\n    protected MyBaseForm(Form? owner)\n    {\n        Owner = owner;\n        FormBorderStyle = FormBorderStyle.FixedDialog;\n        StartPosition = FormStartPosition.CenterParent;\n        MaximizeBox = false;\n        MinimizeBox = false;\n        ShowIcon = false;\n    }\n\n    protected MyBaseForm() : this(null)\n    {\n    }\n\n    #endregion\n\n    #region Public Instance Methods\n\n    public void SetUseAppThemeColors(bool enable = true)\n    {\n        if (enable == UseAppThemeColors) \n        { \n            return;\n        }\n        using (PdnBaseForm dummy = new PdnBaseForm())\n        {\n            dummy.UseAppThemeColors = enable;\n            BackColor = dummy.BackColor;\n            ForeColor = dummy.ForeColor;\n        }\n        UpdateControlColorsRecursive();\n        UseAppThemeColors = enable;\n    }\n\n    #endregion\n\n    #region Private Instance Methods\n\n    private void UpdateControlColorsRecursive()\n    {\n        bool isDark = ForeColor.GetBrightness() > BackColor.GetBrightness();\n\n        if (EnableImmersiveDarkMode)\n        {\n            // Native.SetPreferredAppMode(true);\n            Native.UseImmersiveDarkModeColors(this, isDark);\n            Native.UseImmersiveDarkMode(this, isDark);\n        }\n\n        foreach (Control control in this.Descendants())\n        {\n            control.ForeColor = ForeColor;\n            control.BackColor = BackColor;\n            switch (control)\n\n            {\n                case LinkLabel linkLabel when isDark:\n                    linkLabel.LinkColor = Color.Orange;\n                    linkLabel.VisitedLinkColor = Color.Orange;\n                    break;\n                case LinkLabel linkLabel when !isDark:\n                    linkLabel.LinkColor = Color.Empty;\n                    linkLabel.VisitedLinkColor = Color.Empty;\n                    break;\n                case Label label:\n                    label.FlatStyle = FlatStyle.Standard;\n                    SubscribeOnPaint(label, Label_Paint);\n                    break;\n                case CheckBox _:\n                case RadioButton _:\n                    ((ButtonBase)control).FlatStyle = FlatStyle.Standard;\n                    SubscribeOnPaint(control, CheckRadio_Paint);\n                    break;\n                case Button button:\n                    button.FlatStyle = FlatStyle.System;\n                    break;\n                case GroupBox groupBox:\n                    groupBox.FlatStyle = FlatStyle.Standard;\n                    SubscribeOnPaint(groupBox, GroupBox_Paint);\n                    break;\n                case ComboBox _ when !isDark:\n                case TextBox _ when !isDark:\n                    control.BackColor = SystemColors.Window;\n                    break;\n            }\n\n            if (EnableImmersiveDarkMode)\n            {\n                if (control.IsHandleCreated)\n                {\n                    Native.ControlSetDarkMode(control, isDark);\n                }\n                control.HandleCreated -= Control_HandleCreated;\n                control.HandleCreated -= Control_HandleCreated;\n                control.HandleCreated += Control_HandleCreated;\n            }\n        }\n    }\n\n    #endregion\n\n    #region Private Static Methods\n\n    private static void DrawBackground(Graphics g, Color backColor, Rectangle rect)\n    {\n        using SolidBrush brush = new SolidBrush(backColor);\n        g.FillRectangle(brush, rect);\n    }\n\n    #region Control Event Handlers\n\n    private static void Control_HandleCreated(object? sender, EventArgs e)\n    {\n        if (sender is not Control ctrl)\n        {\n            return;\n        }\n\n        bool isDark = ctrl.ForeColor.GetBrightness() > ctrl.BackColor.GetBrightness();\n        Native.ControlSetDarkMode(ctrl, isDark);\n    }\n\n    private static void SubscribeOnPaint(Control control, PaintEventHandler handler)\n    {\n        control.Paint -= handler;\n        control.Paint -= handler;\n        control.Paint += handler;\n    }\n\n    private static void GroupBox_Paint(object? sender, PaintEventArgs e)\n    {\n        if (sender is not GroupBox ctrl || ctrl.Enabled)\n        {\n            return;\n        }\n\n        Color foreColor = SystemColors.GrayText;\n        bool rtl = ctrl.RightToLeft == RightToLeft.Yes;\n        TextFormatFlags tff = ConvertAlignment(ContentAlignment.MiddleLeft, rtl) | TextFormatFlags.WordBreak;\n        DrawBackground(e.Graphics, ctrl.BackColor, e.ClipRectangle);\n        GroupBoxRenderer.DrawGroupBox(e.Graphics, e.ClipRectangle, ctrl.Text, ctrl.Font, foreColor, tff, System.Windows.Forms.VisualStyles.GroupBoxState.Disabled);\n    }\n\n    private static void Label_Paint(object? sender, PaintEventArgs e)\n    {\n        if (sender is not Label ctrl || ctrl.Enabled)\n        {\n            return;\n        }\n\n        Color foreColor = SystemColors.GrayText;\n        bool rtl = ctrl.RightToLeft == RightToLeft.Yes;\n        TextFormatFlags tff = ConvertAlignment(ctrl.TextAlign, rtl) | TextFormatFlags.WordBreak;\n        DrawBackground(e.Graphics, ctrl.BackColor, e.ClipRectangle);\n        TextRenderer.DrawText(e.Graphics, ctrl.Text, ctrl.Font, e.ClipRectangle, foreColor, tff);\n    }\n\n    private static void CheckRadio_Paint(object? sender, PaintEventArgs e)\n    {\n        if (sender is not ButtonBase ctrl || ctrl.Enabled)\n        {\n            return;\n        }\n\n        Color foreColor = SystemColors.GrayText;\n        Size glyphSize = CheckBoxRenderer.GetGlyphSize(e.Graphics, System.Windows.Forms.VisualStyles.CheckBoxState.UncheckedNormal);\n        bool rtl = ctrl.RightToLeft == RightToLeft.Yes;\n        TextFormatFlags tff = ConvertAlignment(ctrl.TextAlign, rtl) \n            | TextFormatFlags.LeftAndRightPadding \n            | TextFormatFlags.Internal;\n        Rectangle rect = e.ClipRectangle;\n        Size size = new Size(rect.Width - 1 - glyphSize.Width, rect.Height);\n        Point point = rtl ? new Point(rect.X - 1, rect.Y) : new Point(rect.X + glyphSize.Width + 1, rect.Y + 1);\n        rect = new Rectangle(point, size);\n        DrawBackground(e.Graphics, ctrl.BackColor, rect);\n        TextRenderer.DrawText(e.Graphics, ctrl.Text, ctrl.Font, rect, foreColor, tff);\n    }\n\n    #endregion\n\n    #region ContentAlignment<->TextFormatting Conversions\n\n    public static TextFormatFlags ConvertAlignment(ContentAlignment alignment, bool rtl)\n    {\n        TextFormatFlags tff = TextFormatFlags.Default;\n        // Vertical alignment\n        tff |= alignment switch\n        {\n            ContentAlignment.TopLeft or ContentAlignment.TopRight or ContentAlignment.TopCenter => TextFormatFlags.Top,\n            ContentAlignment.BottomLeft or ContentAlignment.BottomRight or ContentAlignment.BottomCenter => TextFormatFlags.Bottom,\n            ContentAlignment.MiddleLeft or ContentAlignment.MiddleRight or ContentAlignment.MiddleCenter => TextFormatFlags.VerticalCenter,\n            _ => TextFormatFlags.Default\n        };\n        // Horizontal alignment\n        tff |= alignment switch\n        {\n            ContentAlignment.TopLeft or ContentAlignment.BottomLeft or ContentAlignment.MiddleLeft when rtl => TextFormatFlags.Right,\n            ContentAlignment.TopLeft or ContentAlignment.BottomLeft or ContentAlignment.MiddleLeft => TextFormatFlags.Left,\n            ContentAlignment.TopRight or ContentAlignment.BottomRight or ContentAlignment.MiddleRight when rtl => TextFormatFlags.Left,\n            ContentAlignment.TopRight or ContentAlignment.BottomRight or ContentAlignment.MiddleRight => TextFormatFlags.Right,\n            _ => TextFormatFlags.HorizontalCenter\n        };\n        return tff;\n    }\n\n    #endregion\n\n    #endregion\n\n    #region Native\n\n    [SuppressUnmanagedCodeSecurity]\n    private static partial class Native\n    {\n        #region Scaling Factor\n\n        [LibraryImport(\"gdi32.dll\", SetLastError = true)]\n        private static partial int GetDeviceCaps(nint hdc, int nIndex);\n        \n        public static float GetScalingFactor()\n        {\n            const int VERTRES = 10;\n            const int DESKTOPVERTRES = 117;\n            using Graphics g = Graphics.FromHwnd(IntPtr.Zero);\n            IntPtr desktop = g.GetHdc();\n            int logicalScreenHeight = GetDeviceCaps(desktop, VERTRES);\n            int physicalScreenHeight = GetDeviceCaps(desktop, DESKTOPVERTRES);\n            return physicalScreenHeight / (float)logicalScreenHeight; // 1.25 = 125%\n        }\n\n        #endregion\n\n        #region Experimental Dark Mode\n\n        private const int DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1 = 19;\n        private const int DWMWA_USE_IMMERSIVE_DARK_MODE = 20;\n        private const int PREFFERED_APP_MODE__ALLOW_DARK = 1;\n        private const int PREFFERED_APP_MODE__DEFAULT = 0;\n        private const int S_OK = 0;\n\n        public static bool IsDarkModeSupported { get; } = IsWindows10OrGreater(17763);\n\n        public static bool ControlSetDarkMode(IWin32Window window, bool enable)\n        {\n            if (!IsDarkModeSupported) \n            { \n                return false; \n            }\n            int error = SetWindowTheme(window.Handle, enable ? \"darkmode_explorer\" : \"explorer\", null);\n            return Check(error);\n        }\n\n        public static bool UseImmersiveDarkModeColors(IWin32Window window, bool enable)\n        {\n            if (!IsDarkModeSupported) \n            { \n                return false;\n            }\n            WindowCompositionAttributeData data = new()\n            {\n                Attribute = WindowCompositionAttribute.WCA_USEDARKMODECOLORS,\n                Data = enable ? 1 : 0,\n                SizeOfData = Marshal.SizeOf<int>()\n            };\n            return SetWindowCompositionAttribute(window.Handle, data);\n        }\n\n        public static bool SetPreferredAppMode(bool dark)\n        {\n            if (!IsDarkModeSupported) \n            {\n                return false;\n            }\n            int error = SetPreferredAppMode(dark ? 1 : 0);\n            return Check(error);\n        }\n\n        public static bool UseImmersiveDarkMode(IWin32Window window, bool enabled)\n        {\n            if (!IsDarkModeSupported) \n            { \n                return false; \n            }\n            int attr = IsWindows10OrGreater(18985)\n                ? DWMWA_USE_IMMERSIVE_DARK_MODE\n                : DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1;\n            int attrValue = enabled ? 1 : 0;\n            int error = DwmSetWindowAttribute(window.Handle, attr, ref attrValue, sizeof(int));\n            return Check(error);\n        }\n\n        private static bool Check(int error)\n        {\n            return error == S_OK ? true : throw new Win32Exception(error);\n        }\n\n        private static bool IsWindows10OrGreater(int build = -1)\n        {\n            Version version = Environment.OSVersion.Version;\n            return version.Major >= 10 && version.Build >= build;\n        }\n\n        [LibraryImport(\"uxtheme.dll\", SetLastError = true, StringMarshalling = StringMarshalling.Utf16)]\n        private static partial int SetWindowTheme(nint hWnd, string? pszSubAppName, string? pszSubIdList);\n\n        [LibraryImport(\"uxtheme.dll\", EntryPoint = \"#133\", SetLastError = true)]\n        [return: MarshalAs(UnmanagedType.Bool)]\n        private static partial bool AllowDarkModeForWindow(nint hWnd, [MarshalAs(UnmanagedType.Bool)] bool allow);\n\n        [LibraryImport(\"uxtheme.dll\", EntryPoint = \"#135\", SetLastError = true)]\n        private static partial int SetPreferredAppMode(int i);\n\n        [LibraryImport(\"user32.dll\", SetLastError = true)]\n        [return: MarshalAs(UnmanagedType.Bool)]\n        private static partial bool SetWindowCompositionAttribute(nint hwnd, WindowCompositionAttributeData data);\n        \n        [LibraryImport(\"dwmapi.dll\", SetLastError = true)]\n        private static partial int DwmSetWindowAttribute(nint hwnd, int attr, ref int attrValue, int attrSize);\n\n        private enum WindowCompositionAttribute\n        {\n            WCA_ACCENT_POLICY = 19,\n            WCA_USEDARKMODECOLORS = 26\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        private ref struct WindowCompositionAttributeData\n        {\n            public WindowCompositionAttribute Attribute;\n            public int Data;\n            public int SizeOfData;\n        }\n\n        #endregion\n    }\n\n    #endregion\n}\n"
  },
  {
    "path": "SvgFileType/Import/MyBaseForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "SvgFileType/Import/ResvgSvgRenderer.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Runtime;\nusing System.Threading;\nusing PaintDotNet;\nusing resvg.net;\nusing Svg;\nusing SvgFileTypePlugin.Extensions;\n\nnamespace SvgFileTypePlugin.Import;\n\ninternal sealed class ResvgSvgRenderer() : SvgRenderer2(\"resvg\")\n{\n    protected override Document GetFlatDocument(string svgdata, SvgImportConfig config, CancellationToken ctoken = default)\n    {\n        ArgumentException.ThrowIfNullOrWhiteSpace(svgdata);\n        ArgumentNullException.ThrowIfNull(config);\n\n        ctoken.ThrowIfCancellationRequested();\n        (int width, int height) = (config.RasterWidth, config.RasterHeight);\n        using BenchmarkScope _ = new BenchmarkScope();\n        using MemoryFailPoint mfp = GetMemoryFailPoint(width, height, 1);\n        ResetProgress(1);\n        Surface surface = new Surface(width, height);\n        try\n        {\n            using Resvg resvg = Resvg.FromData(svgdata, loadSystemFonts: true);\n            ResvgTransform transform = CalculateTransform(resvg.Size, config);\n            resvg.Render(surface.Scan0.Pointer, transform, width, height, PixelOpFlags.RgbaToBgra | PixelOpFlags.UnPremultiplyAlpha);\n        }\n        catch (Exception)\n        {\n            surface.Dispose();\n            throw;\n        }\n\n        Document document = surface.CreateSingleLayerDocument(takeOwnership: true);\n        document.SetDpu(config.Ppi);\n        IncrementProgress();\n        return document;\n    }\n\n    protected override Document GetLayeredDocument(string svgdata, SvgImportConfig config, CancellationToken ctoken = default)\n    {\n        ArgumentException.ThrowIfNullOrWhiteSpace(svgdata);\n        ArgumentNullException.ThrowIfNull(config);\n\n        using BenchmarkScope _ = new BenchmarkScope();\n        SvgDocument svg = SvgDocument.FromSvg<SvgDocument>(svgdata);\n        using IDisposable _1 = svg.UseSetRasterDimensions(config);\n\n        List<SvgVisualElement> elements = GetSvgVisualElements(svg, config, ctoken);\n        ctoken.ThrowIfCancellationRequested();\n\n        using MemoryFailPoint _2 = GetMemoryFailPoint(config.RasterWidth, config.RasterHeight, elements.Count);\n\n        ResetProgress(elements.Count);\n        List<BitmapLayer> layers = [];\n        using ResvgOptions options = new ResvgOptions();\n        options.LoadSystemFonts();\n\n        using Surface surface = new Surface(config.RasterWidth, config.RasterHeight, SurfaceCreationFlags.DoNotZeroFillHint);\n        // Render all visual elements that are passed here.\n        foreach (SvgVisualElement element in elements)\n        {\n            ctoken.ThrowIfCancellationRequested();\n\n            BitmapLayer? layer;\n            if (element is GroupBoundary boundaryNode)\n            {\n                // Render empty group boundary and continue\n                layer = boundaryNode.ToEmptyLayer(config.RasterWidth, config.RasterHeight);\n                layers.Add(layer);\n                IncrementProgress();\n                continue;\n            }\n\n            if (!element.PreRender(elements, config.ImportHiddenElements, ctoken))\n            {\n                IncrementProgress();\n                continue;\n            }\n\n            surface.Clear();\n            RenderSvgDocument(element, surface, options, config);\n            if (surface.IsEmpty())\n            {\n                IncrementProgress();\n                continue;\n            }\n            layer = new BitmapLayer(surface, takeOwnership: false);\n            try\n            {\n                layer.Name = GetLayerTitle(element);\n                if (config.RespectElementOpacity)\n                {\n                    layer.Opacity = ToByteOpacity(element.Opacity);\n                }\n\n                if (config.ImportHiddenElements && !element.IsOriginallyVisible())\n                {\n                    layer.Visible = false;\n                }\n            }\n            catch (Exception)\n            {\n                layer?.Dispose();\n                layers.ForEach(layer => layer.Dispose());\n                throw;\n            }\n\n            IncrementProgress();\n            layers.Add(layer);\n        }\n        return GetDocument(layers, config);\n    }\n\n    private void RenderSvgDocument(SvgElement element, Surface surface, ResvgOptions options, SvgImportConfig config)\n    {\n        if (element is SvgUse use)\n        {\n            RenderSvgUseElement(use, e => RenderSvgDocument(e, surface, options, config));\n        }\n        else\n        {\n            SvgDocument clone = element.OwnerDocument.RemoveInvisibleAndNonTextElements();\n            (int width, int height) = (surface.Width, surface.Height);\n            using Resvg resvg = Resvg.FromData(clone.GetXML_QuotedFuncIRIHack(), options);\n            resvg.Render(surface.Scan0.Pointer, width, height, PixelOpFlags.RgbaToBgra | PixelOpFlags.UnPremultiplyAlpha);\n        }\n    }\n\n    private static ResvgTransform CalculateTransform(SizeF svgsize, SvgImportConfig config)\n    {\n        float ratioX = config.RasterWidth / svgsize.Width;\n        float ratioY = config.PreserveAspectRatio ? ratioX : config.RasterHeight / svgsize.Height;\n        return new ResvgTransform()\n        {\n            M11 = ratioX,\n            M22 = ratioY\n        };\n    }\n}\n"
  },
  {
    "path": "SvgFileType/Import/StreamTrackerCancellationTokenSource.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing System;\nusing System.IO;\nusing System.Threading;\n\nnamespace SvgFileTypePlugin.Import;\n\n/// <summary>\n/// Paint.NET input stream can throw <see cref=\"OperationCanceledException\"></see> internally.\n/// This class helps us to track these cancellation events. Provides us ability to gracefully end \n/// the ongoing operation.\n/// <br />\n/// <b>! Note: Must be used after reading the whole stream.</b>\n/// </summary>\ninternal sealed class StreamTrackerCancellationTokenSource : CancellationTokenSource\n{\n    private bool disposed;\n    private readonly Timer? timer;\n    private readonly Func<bool>? action;\n\n    public StreamTrackerCancellationTokenSource(Stream stream, int period = 1000)\n    {\n        ArgumentNullException.ThrowIfNull(stream);\n        ArgumentOutOfRangeException.ThrowIfNegative(period);\n\n        if (!stream.CanSeek)\n        {\n            return;\n        }\n\n        action = () => IsStreamCanceled(stream);\n        timer = new Timer(OnTimer, null, 0, period);\n    }\n\n    protected override void Dispose(bool disposing)\n    {\n        base.Dispose(disposing);\n        if (!disposed)\n        {\n            disposed = true;\n            timer?.Dispose();\n        }\n    }\n\n    private void OnTimer(object? state)\n    {\n        try\n        {\n            if (action!.Invoke())\n            {\n                Cancel();\n                timer!.Dispose();\n            }\n        }\n        catch (ObjectDisposedException)\n        {\n            // ignore\n        }\n    }\n\n    private static bool IsStreamCanceled(Stream stream)\n    {\n        ArgumentNullException.ThrowIfNull(stream);\n\n        try\n        {\n            stream.Position = 0;\n            return false;\n        }\n        catch (ObjectDisposedException)\n        {\n            Logger.WriteLine(\"Completed!\");\n            return true;\n        }\n        catch (OperationCanceledException)\n        {\n            Logger.WriteLine(\"Canceled!\");\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "SvgFileType/Import/SvgImport.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing System;\nusing System.Diagnostics;\nusing System.IO;\nusing System.IO.Compression;\nusing System.Threading;\nusing System.Windows.Forms;\nusing PaintDotNet;\nusing Svg;\nusing SvgFileTypePlugin.Extensions;\n\nnamespace SvgFileTypePlugin.Import;\n\ninternal static class SvgImport\n{\n    public static Document Load(Stream stream)\n    {\n        ArgumentNullException.ThrowIfNull(stream);\n        if (!stream.CanRead)\n        {\n            throw new IOException(\"Input stream is not readable.\");\n        }\n\n        if (stream.Length <= 0)\n        {\n            return new Direct2DSvgRenderer().GetNoPathDocument();\n        }\n\n        // We are using resvg which gives the best result in my tests.\n        // For testing purposes, I also have implemented GDI+ and Direct2D based SVG renderers as well.\n        // Renderers: resvg, gdip or gdiplus or gdi+, direct2d or d2d\n        const string rendererName = \"resvg\";\n\n        string svgdata = Open(stream);\n        using StreamTrackerCancellationTokenSource cts = new(stream);\n        CancellationToken ctoken = cts.Token;\n        if (UIHelper.IsSaveConfigDialogVisible())\n        {\n            // This is workaround for Saving functionality.\n            // We don't want the dialog appear if Paint.NET is generating previews.\n            SvgDocument svg = SvgDocument.FromSvg<SvgDocument>(svgdata);\n            SvgRenderer2 svgRenderer = SvgRenderer2.Create(rendererName);\n            SvgImportConfig config = new SvgImportConfig\n            {\n                LayersMode = LayersMode.Flat,\n                RasterWidth = svg.Width.ToDeviceValue(svg),\n                RasterHeight = svg.Height.ToDeviceValue(svg),\n                Ppi = 96\n            };\n            return svgRenderer.Rasterize(svgdata, config, ctoken);\n        }\n\n        Document? document = UIHelper.RunOnUIThread(() =>\n        {\n            using SvgImportDialog dialog = new SvgImportDialog(svgdata, rendererName, ctoken);\n            DialogResult dialogResult = dialog.ShowDialog();\n            return dialogResult == DialogResult.OK ? dialog.Result : throw dialog.Error ?? new InvalidOperationException();\n        });\n        Debug.Assert(document is not null);\n        return document;\n    }\n\n    private static string Open(Stream input)\n    {\n        using MemoryStream ms = new();\n        Span<byte> buf = new byte[3];\n        if (input.Read(buf) < 3)\n        {\n            throw new IOException(\"Input stream is not a valid SVG.\");\n        }\n        ms.Write(buf);\n        input.CopyTo(ms);\n\n        // Do not close the source stream.\n        // It also can be used to track cancellation.\n\n        ms.Position = 0;\n\n        ReadOnlySpan<byte> gzipMagicBytes = [0x1F, 0x8B, 0x8];\n        input = buf.SequenceEqual(gzipMagicBytes)\n            ? new GZipStream(ms, CompressionMode.Decompress, leaveOpen: false)\n            : ms;\n        using StreamReader reader = new StreamReader(input, leaveOpen: false);\n        return reader.ReadToEnd();\n    }\n}\n"
  },
  {
    "path": "SvgFileType/Import/SvgImportConfig.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nnamespace SvgFileTypePlugin.Import;\n\ninternal sealed class SvgImportConfig\n{\n    public required int RasterWidth { get; init; }\n\n    public required int RasterHeight { get; init; }\n\n    public bool PreserveAspectRatio { get; set; } = true;\n\n    public int Ppi { get; set; } = 96;\n\n    public LayersMode LayersMode { get; set; } = LayersMode.Flat;\n\n    public bool GroupBoundariesAsLayers { get; set; }\n\n    public bool RespectElementOpacity { get; set; }\n\n    public bool ImportHiddenElements { get; set; }\n}\n"
  },
  {
    "path": "SvgFileType/Import/SvgImportDialog.Designer.cs",
    "content": "﻿namespace SvgFileTypePlugin.Import;\n\npartial class SvgImportDialog\n{\n    /// <summary>\n    /// Required designer variable.\n    /// </summary>\n    private System.ComponentModel.IContainer components = null;\n\n    /// <summary>\n    /// Clean up any resources being used.\n    /// </summary>\n    /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n    protected override void Dispose(bool disposing)\n    {\n        if (disposing && (components != null))\n        {\n            components.Dispose();\n        }\n        base.Dispose(disposing);\n    }\n\n    #region Windows Form Designer generated code\n\n    /// <summary>\n    /// Required method for Designer support - do not modify\n    /// the contents of this method with the code editor.\n    /// </summary>\n    private void InitializeComponent()\n    {\n        components = new System.ComponentModel.Container();\n        ToolTip1 = new System.Windows.Forms.ToolTip(components);\n        PbWarning = new System.Windows.Forms.PictureBox();\n        CbGroupBoundaries = new System.Windows.Forms.CheckBox();\n        RootPanel = new System.Windows.Forms.Panel();\n        StatusStrip = new System.Windows.Forms.StatusStrip();\n        ProgressBar = new System.Windows.Forms.ToolStripProgressBar();\n        ProgressLabel = new System.Windows.Forms.ToolStripStatusLabel();\n        PlaceHolderLabel = new System.Windows.Forms.ToolStripStatusLabel();\n        UpdateAvailLabel = new System.Windows.Forms.ToolStripStatusLabel();\n        tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel();\n        LnkGitHub = new System.Windows.Forms.LinkLabel();\n        LnkForum = new System.Windows.Forms.LinkLabel();\n        BtnOk = new System.Windows.Forms.Button();\n        BtnCancel = new System.Windows.Forms.Button();\n        GbLayers = new System.Windows.Forms.GroupBox();\n        tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();\n        RbFlatten = new System.Windows.Forms.RadioButton();\n        RbGroups = new System.Windows.Forms.RadioButton();\n        CbHiddenLayers = new System.Windows.Forms.CheckBox();\n        RbAllElements = new System.Windows.Forms.RadioButton();\n        CbOpacity = new System.Windows.Forms.CheckBox();\n        GbSizeSelection = new System.Windows.Forms.GroupBox();\n        CbKeepAR = new System.Windows.Forms.CheckBox();\n        tableLayoutPanel4 = new System.Windows.Forms.TableLayoutPanel();\n        LblResolution = new System.Windows.Forms.Label();\n        LblCanvasWH = new System.Windows.Forms.Label();\n        NudCanvasW = new System.Windows.Forms.NumericUpDown();\n        NudCanvasH = new System.Windows.Forms.NumericUpDown();\n        label9 = new System.Windows.Forms.Label();\n        NudDpi = new System.Windows.Forms.NumericUpDown();\n        GbInfo = new System.Windows.Forms.GroupBox();\n        tableLayoutPanel9 = new System.Windows.Forms.TableLayoutPanel();\n        LnkUseSvgSettings = new System.Windows.Forms.Button();\n        tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();\n        LblViewport = new System.Windows.Forms.Label();\n        TbViewboxH = new System.Windows.Forms.TextBox();\n        label6 = new System.Windows.Forms.Label();\n        TbViewportW = new System.Windows.Forms.TextBox();\n        label3 = new System.Windows.Forms.Label();\n        TbViewboxW = new System.Windows.Forms.TextBox();\n        TbViewportH = new System.Windows.Forms.TextBox();\n        LblViewboxWH = new System.Windows.Forms.Label();\n        LblViewboxXY = new System.Windows.Forms.Label();\n        TbViewboxY = new System.Windows.Forms.TextBox();\n        label4 = new System.Windows.Forms.Label();\n        TbViewboxX = new System.Windows.Forms.TextBox();\n        ((System.ComponentModel.ISupportInitialize)PbWarning).BeginInit();\n        RootPanel.SuspendLayout();\n        StatusStrip.SuspendLayout();\n        tableLayoutPanel3.SuspendLayout();\n        GbLayers.SuspendLayout();\n        tableLayoutPanel1.SuspendLayout();\n        GbSizeSelection.SuspendLayout();\n        tableLayoutPanel4.SuspendLayout();\n        ((System.ComponentModel.ISupportInitialize)NudCanvasW).BeginInit();\n        ((System.ComponentModel.ISupportInitialize)NudCanvasH).BeginInit();\n        ((System.ComponentModel.ISupportInitialize)NudDpi).BeginInit();\n        GbInfo.SuspendLayout();\n        tableLayoutPanel9.SuspendLayout();\n        tableLayoutPanel2.SuspendLayout();\n        SuspendLayout();\n        // \n        // ToolTip1\n        // \n        ToolTip1.AutomaticDelay = 0;\n        ToolTip1.AutoPopDelay = 0;\n        ToolTip1.InitialDelay = 0;\n        ToolTip1.IsBalloon = true;\n        ToolTip1.ReshowDelay = 0;\n        ToolTip1.ShowAlways = true;\n        ToolTip1.UseAnimation = false;\n        // \n        // PbWarning\n        // \n        PbWarning.Dock = System.Windows.Forms.DockStyle.Fill;\n        PbWarning.Location = new System.Drawing.Point(52, 0);\n        PbWarning.Margin = new System.Windows.Forms.Padding(0);\n        PbWarning.MinimumSize = new System.Drawing.Size(23, 23);\n        PbWarning.Name = \"PbWarning\";\n        PbWarning.Size = new System.Drawing.Size(23, 29);\n        PbWarning.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;\n        PbWarning.TabIndex = 2;\n        PbWarning.TabStop = false;\n        ToolTip1.SetToolTip(PbWarning, \"Please make sure you've enough memory, especially if you're importing with layers.\");\n        PbWarning.Visible = false;\n        // \n        // CbGroupBoundaries\n        // \n        CbGroupBoundaries.AutoSize = true;\n        CbGroupBoundaries.Dock = System.Windows.Forms.DockStyle.Fill;\n        CbGroupBoundaries.Enabled = false;\n        CbGroupBoundaries.Location = new System.Drawing.Point(99, 53);\n        CbGroupBoundaries.Name = \"CbGroupBoundaries\";\n        CbGroupBoundaries.RightToLeft = System.Windows.Forms.RightToLeft.Yes;\n        CbGroupBoundaries.Size = new System.Drawing.Size(256, 19);\n        CbGroupBoundaries.TabIndex = 2;\n        CbGroupBoundaries.Text = \"Group boundaries\";\n        ToolTip1.SetToolTip(CbGroupBoundaries, \"Imports group boundaries as empty layers.\");\n        CbGroupBoundaries.UseVisualStyleBackColor = true;\n        // \n        // RootPanel\n        // \n        RootPanel.AutoSize = true;\n        RootPanel.Controls.Add(StatusStrip);\n        RootPanel.Controls.Add(tableLayoutPanel3);\n        RootPanel.Controls.Add(GbLayers);\n        RootPanel.Controls.Add(GbSizeSelection);\n        RootPanel.Controls.Add(GbInfo);\n        RootPanel.Dock = System.Windows.Forms.DockStyle.Top;\n        RootPanel.Location = new System.Drawing.Point(0, 0);\n        RootPanel.Name = \"RootPanel\";\n        RootPanel.Padding = new System.Windows.Forms.Padding(10, 10, 10, 0);\n        RootPanel.Size = new System.Drawing.Size(384, 421);\n        RootPanel.TabIndex = 0;\n        // \n        // StatusStrip\n        // \n        StatusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { ProgressBar, ProgressLabel, PlaceHolderLabel, UpdateAvailLabel });\n        StatusStrip.Location = new System.Drawing.Point(10, 399);\n        StatusStrip.Name = \"StatusStrip\";\n        StatusStrip.Size = new System.Drawing.Size(364, 22);\n        StatusStrip.SizingGrip = false;\n        StatusStrip.TabIndex = 0;\n        StatusStrip.Text = \"statusStrip1\";\n        // \n        // ProgressBar\n        // \n        ProgressBar.Name = \"ProgressBar\";\n        ProgressBar.Size = new System.Drawing.Size(100, 16);\n        ProgressBar.Visible = false;\n        // \n        // ProgressLabel\n        // \n        ProgressLabel.BackColor = System.Drawing.Color.Transparent;\n        ProgressLabel.Name = \"ProgressLabel\";\n        ProgressLabel.Size = new System.Drawing.Size(42, 17);\n        ProgressLabel.Text = \"Ready!\";\n        // \n        // PlaceHolderLabel\n        // \n        PlaceHolderLabel.BackColor = System.Drawing.Color.Transparent;\n        PlaceHolderLabel.Name = \"PlaceHolderLabel\";\n        PlaceHolderLabel.Size = new System.Drawing.Size(307, 17);\n        PlaceHolderLabel.Spring = true;\n        // \n        // UpdateAvailLabel\n        // \n        UpdateAvailLabel.BackColor = System.Drawing.Color.Transparent;\n        UpdateAvailLabel.ForeColor = System.Drawing.Color.Red;\n        UpdateAvailLabel.Name = \"UpdateAvailLabel\";\n        UpdateAvailLabel.Size = new System.Drawing.Size(0, 17);\n        // \n        // tableLayoutPanel3\n        // \n        tableLayoutPanel3.AutoSize = true;\n        tableLayoutPanel3.ColumnCount = 5;\n        tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n        tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n        tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n        tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n        tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n        tableLayoutPanel3.Controls.Add(LnkGitHub, 0, 0);\n        tableLayoutPanel3.Controls.Add(LnkForum, 1, 0);\n        tableLayoutPanel3.Controls.Add(BtnOk, 3, 0);\n        tableLayoutPanel3.Controls.Add(BtnCancel, 4, 0);\n        tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Top;\n        tableLayoutPanel3.Location = new System.Drawing.Point(10, 350);\n        tableLayoutPanel3.Name = \"tableLayoutPanel3\";\n        tableLayoutPanel3.Padding = new System.Windows.Forms.Padding(10);\n        tableLayoutPanel3.RowCount = 1;\n        tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());\n        tableLayoutPanel3.Size = new System.Drawing.Size(364, 49);\n        tableLayoutPanel3.TabIndex = 1;\n        // \n        // LnkGitHub\n        // \n        LnkGitHub.Dock = System.Windows.Forms.DockStyle.Fill;\n        LnkGitHub.Location = new System.Drawing.Point(13, 10);\n        LnkGitHub.Name = \"LnkGitHub\";\n        LnkGitHub.Size = new System.Drawing.Size(45, 29);\n        LnkGitHub.TabIndex = 2;\n        LnkGitHub.TabStop = true;\n        LnkGitHub.Text = \"GitHub\";\n        LnkGitHub.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n        // \n        // LnkForum\n        // \n        LnkForum.AutoSize = true;\n        LnkForum.Dock = System.Windows.Forms.DockStyle.Fill;\n        LnkForum.Location = new System.Drawing.Point(64, 10);\n        LnkForum.Name = \"LnkForum\";\n        LnkForum.Size = new System.Drawing.Size(42, 29);\n        LnkForum.TabIndex = 3;\n        LnkForum.TabStop = true;\n        LnkForum.Text = \"Forum\";\n        LnkForum.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n        // \n        // BtnOk\n        // \n        BtnOk.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right;\n        BtnOk.Location = new System.Drawing.Point(195, 13);\n        BtnOk.Name = \"BtnOk\";\n        BtnOk.Size = new System.Drawing.Size(75, 23);\n        BtnOk.TabIndex = 0;\n        BtnOk.Text = \"OK\";\n        BtnOk.UseVisualStyleBackColor = true;\n        // \n        // BtnCancel\n        // \n        BtnCancel.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right;\n        BtnCancel.Location = new System.Drawing.Point(276, 13);\n        BtnCancel.Name = \"BtnCancel\";\n        BtnCancel.Size = new System.Drawing.Size(75, 23);\n        BtnCancel.TabIndex = 1;\n        BtnCancel.Text = \"Cancel\";\n        BtnCancel.UseVisualStyleBackColor = true;\n        // \n        // GbLayers\n        // \n        GbLayers.AutoSize = true;\n        GbLayers.Controls.Add(tableLayoutPanel1);\n        GbLayers.Dock = System.Windows.Forms.DockStyle.Top;\n        GbLayers.Location = new System.Drawing.Point(10, 253);\n        GbLayers.Name = \"GbLayers\";\n        GbLayers.Size = new System.Drawing.Size(364, 97);\n        GbLayers.TabIndex = 2;\n        GbLayers.TabStop = false;\n        GbLayers.Text = \"Layers\";\n        // \n        // tableLayoutPanel1\n        // \n        tableLayoutPanel1.AutoSize = true;\n        tableLayoutPanel1.ColumnCount = 2;\n        tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n        tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n        tableLayoutPanel1.Controls.Add(RbFlatten, 0, 0);\n        tableLayoutPanel1.Controls.Add(CbGroupBoundaries, 1, 2);\n        tableLayoutPanel1.Controls.Add(RbGroups, 0, 1);\n        tableLayoutPanel1.Controls.Add(CbHiddenLayers, 1, 1);\n        tableLayoutPanel1.Controls.Add(RbAllElements, 0, 2);\n        tableLayoutPanel1.Controls.Add(CbOpacity, 1, 0);\n        tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;\n        tableLayoutPanel1.Location = new System.Drawing.Point(3, 19);\n        tableLayoutPanel1.Name = \"tableLayoutPanel1\";\n        tableLayoutPanel1.RowCount = 3;\n        tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n        tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n        tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n        tableLayoutPanel1.Size = new System.Drawing.Size(358, 75);\n        tableLayoutPanel1.TabIndex = 0;\n        // \n        // RbFlatten\n        // \n        RbFlatten.AutoSize = true;\n        RbFlatten.Checked = true;\n        RbFlatten.Dock = System.Windows.Forms.DockStyle.Fill;\n        RbFlatten.Location = new System.Drawing.Point(3, 3);\n        RbFlatten.Name = \"RbFlatten\";\n        RbFlatten.Size = new System.Drawing.Size(90, 19);\n        RbFlatten.TabIndex = 3;\n        RbFlatten.TabStop = true;\n        RbFlatten.Text = \"Flatten\";\n        RbFlatten.UseVisualStyleBackColor = true;\n        // \n        // RbGroups\n        // \n        RbGroups.AutoSize = true;\n        RbGroups.Dock = System.Windows.Forms.DockStyle.Fill;\n        RbGroups.Location = new System.Drawing.Point(3, 28);\n        RbGroups.Name = \"RbGroups\";\n        RbGroups.Size = new System.Drawing.Size(90, 19);\n        RbGroups.TabIndex = 4;\n        RbGroups.Text = \"Groups\";\n        RbGroups.UseVisualStyleBackColor = true;\n        // \n        // CbHiddenLayers\n        // \n        CbHiddenLayers.AutoSize = true;\n        CbHiddenLayers.Checked = true;\n        CbHiddenLayers.CheckState = System.Windows.Forms.CheckState.Checked;\n        CbHiddenLayers.Dock = System.Windows.Forms.DockStyle.Fill;\n        CbHiddenLayers.Enabled = false;\n        CbHiddenLayers.Location = new System.Drawing.Point(99, 28);\n        CbHiddenLayers.Name = \"CbHiddenLayers\";\n        CbHiddenLayers.RightToLeft = System.Windows.Forms.RightToLeft.Yes;\n        CbHiddenLayers.Size = new System.Drawing.Size(256, 19);\n        CbHiddenLayers.TabIndex = 1;\n        CbHiddenLayers.Text = \"Hidden layers\";\n        CbHiddenLayers.UseVisualStyleBackColor = true;\n        // \n        // RbAllElements\n        // \n        RbAllElements.AutoSize = true;\n        RbAllElements.Dock = System.Windows.Forms.DockStyle.Fill;\n        RbAllElements.Location = new System.Drawing.Point(3, 53);\n        RbAllElements.Name = \"RbAllElements\";\n        RbAllElements.Size = new System.Drawing.Size(90, 19);\n        RbAllElements.TabIndex = 5;\n        RbAllElements.Text = \"All Elements\";\n        RbAllElements.UseVisualStyleBackColor = true;\n        // \n        // CbOpacity\n        // \n        CbOpacity.AutoSize = true;\n        CbOpacity.Checked = true;\n        CbOpacity.CheckState = System.Windows.Forms.CheckState.Checked;\n        CbOpacity.Dock = System.Windows.Forms.DockStyle.Fill;\n        CbOpacity.Enabled = false;\n        CbOpacity.Location = new System.Drawing.Point(99, 3);\n        CbOpacity.Name = \"CbOpacity\";\n        CbOpacity.RightToLeft = System.Windows.Forms.RightToLeft.Yes;\n        CbOpacity.Size = new System.Drawing.Size(256, 19);\n        CbOpacity.TabIndex = 0;\n        CbOpacity.Text = \"Opacity as layer property\";\n        CbOpacity.UseVisualStyleBackColor = true;\n        // \n        // GbSizeSelection\n        // \n        GbSizeSelection.AutoSize = true;\n        GbSizeSelection.Controls.Add(CbKeepAR);\n        GbSizeSelection.Controls.Add(tableLayoutPanel4);\n        GbSizeSelection.Dock = System.Windows.Forms.DockStyle.Top;\n        GbSizeSelection.Location = new System.Drawing.Point(10, 154);\n        GbSizeSelection.Name = \"GbSizeSelection\";\n        GbSizeSelection.Size = new System.Drawing.Size(364, 99);\n        GbSizeSelection.TabIndex = 3;\n        GbSizeSelection.TabStop = false;\n        GbSizeSelection.Text = \"Size selection by user\";\n        // \n        // CbKeepAR\n        // \n        CbKeepAR.AutoSize = true;\n        CbKeepAR.Checked = true;\n        CbKeepAR.CheckState = System.Windows.Forms.CheckState.Checked;\n        CbKeepAR.Dock = System.Windows.Forms.DockStyle.Top;\n        CbKeepAR.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;\n        CbKeepAR.Location = new System.Drawing.Point(3, 77);\n        CbKeepAR.Name = \"CbKeepAR\";\n        CbKeepAR.RightToLeft = System.Windows.Forms.RightToLeft.Yes;\n        CbKeepAR.Size = new System.Drawing.Size(358, 19);\n        CbKeepAR.TabIndex = 0;\n        CbKeepAR.Text = \"Keep aspect ratio\";\n        CbKeepAR.UseVisualStyleBackColor = true;\n        // \n        // tableLayoutPanel4\n        // \n        tableLayoutPanel4.AutoSize = true;\n        tableLayoutPanel4.ColumnCount = 7;\n        tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));\n        tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 23F));\n        tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n        tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n        tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n        tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n        tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));\n        tableLayoutPanel4.Controls.Add(LblResolution, 2, 1);\n        tableLayoutPanel4.Controls.Add(LblCanvasWH, 2, 0);\n        tableLayoutPanel4.Controls.Add(PbWarning, 1, 0);\n        tableLayoutPanel4.Controls.Add(NudCanvasW, 3, 0);\n        tableLayoutPanel4.Controls.Add(NudCanvasH, 5, 0);\n        tableLayoutPanel4.Controls.Add(label9, 4, 0);\n        tableLayoutPanel4.Controls.Add(NudDpi, 3, 1);\n        tableLayoutPanel4.Dock = System.Windows.Forms.DockStyle.Top;\n        tableLayoutPanel4.Location = new System.Drawing.Point(3, 19);\n        tableLayoutPanel4.Name = \"tableLayoutPanel4\";\n        tableLayoutPanel4.RowCount = 2;\n        tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle());\n        tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle());\n        tableLayoutPanel4.Size = new System.Drawing.Size(358, 58);\n        tableLayoutPanel4.TabIndex = 1;\n        // \n        // LblResolution\n        // \n        LblResolution.AutoSize = true;\n        LblResolution.Dock = System.Windows.Forms.DockStyle.Fill;\n        LblResolution.Location = new System.Drawing.Point(78, 29);\n        LblResolution.Name = \"LblResolution\";\n        LblResolution.Size = new System.Drawing.Size(92, 29);\n        LblResolution.TabIndex = 0;\n        LblResolution.Text = \"Resolution (DPI)\";\n        LblResolution.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n        // \n        // LblCanvasWH\n        // \n        LblCanvasWH.AutoSize = true;\n        LblCanvasWH.Dock = System.Windows.Forms.DockStyle.Fill;\n        LblCanvasWH.Location = new System.Drawing.Point(78, 0);\n        LblCanvasWH.Name = \"LblCanvasWH\";\n        LblCanvasWH.Size = new System.Drawing.Size(92, 29);\n        LblCanvasWH.TabIndex = 1;\n        LblCanvasWH.Text = \"Canvas (W×H)\";\n        LblCanvasWH.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n        // \n        // NudCanvasW\n        // \n        NudCanvasW.Dock = System.Windows.Forms.DockStyle.Fill;\n        NudCanvasW.Location = new System.Drawing.Point(176, 3);\n        NudCanvasW.Maximum = new decimal(new int[] { 100000, 0, 0, 0 });\n        NudCanvasW.Minimum = new decimal(new int[] { 1, 0, 0, 0 });\n        NudCanvasW.MinimumSize = new System.Drawing.Size(50, 0);\n        NudCanvasW.Name = \"NudCanvasW\";\n        NudCanvasW.Size = new System.Drawing.Size(50, 23);\n        NudCanvasW.TabIndex = 0;\n        NudCanvasW.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\n        NudCanvasW.Value = new decimal(new int[] { 512, 0, 0, 0 });\n        // \n        // NudCanvasH\n        // \n        NudCanvasH.Dock = System.Windows.Forms.DockStyle.Fill;\n        NudCanvasH.Location = new System.Drawing.Point(253, 3);\n        NudCanvasH.Maximum = new decimal(new int[] { 100000, 0, 0, 0 });\n        NudCanvasH.Minimum = new decimal(new int[] { 1, 0, 0, 0 });\n        NudCanvasH.MinimumSize = new System.Drawing.Size(50, 0);\n        NudCanvasH.Name = \"NudCanvasH\";\n        NudCanvasH.Size = new System.Drawing.Size(50, 23);\n        NudCanvasH.TabIndex = 1;\n        NudCanvasH.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\n        NudCanvasH.Value = new decimal(new int[] { 512, 0, 0, 0 });\n        // \n        // label9\n        // \n        label9.AutoSize = true;\n        label9.Dock = System.Windows.Forms.DockStyle.Fill;\n        label9.Location = new System.Drawing.Point(232, 0);\n        label9.Name = \"label9\";\n        label9.Size = new System.Drawing.Size(15, 29);\n        label9.TabIndex = 5;\n        label9.Text = \"×\";\n        label9.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n        // \n        // NudDpi\n        // \n        NudDpi.Dock = System.Windows.Forms.DockStyle.Fill;\n        NudDpi.Location = new System.Drawing.Point(176, 32);\n        NudDpi.Maximum = new decimal(new int[] { 32767, 0, 0, 0 });\n        NudDpi.Minimum = new decimal(new int[] { 1, 0, 0, 0 });\n        NudDpi.MinimumSize = new System.Drawing.Size(50, 0);\n        NudDpi.Name = \"NudDpi\";\n        NudDpi.Size = new System.Drawing.Size(50, 23);\n        NudDpi.TabIndex = 2;\n        NudDpi.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\n        NudDpi.Value = new decimal(new int[] { 96, 0, 0, 0 });\n        // \n        // GbInfo\n        // \n        GbInfo.AutoSize = true;\n        GbInfo.Controls.Add(tableLayoutPanel9);\n        GbInfo.Controls.Add(tableLayoutPanel2);\n        GbInfo.Dock = System.Windows.Forms.DockStyle.Top;\n        GbInfo.Location = new System.Drawing.Point(10, 10);\n        GbInfo.Name = \"GbInfo\";\n        GbInfo.Size = new System.Drawing.Size(364, 144);\n        GbInfo.TabIndex = 4;\n        GbInfo.TabStop = false;\n        GbInfo.Text = \"Size settings given in SVG file\";\n        // \n        // tableLayoutPanel9\n        // \n        tableLayoutPanel9.AutoSize = true;\n        tableLayoutPanel9.ColumnCount = 3;\n        tableLayoutPanel9.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));\n        tableLayoutPanel9.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n        tableLayoutPanel9.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));\n        tableLayoutPanel9.Controls.Add(LnkUseSvgSettings, 1, 0);\n        tableLayoutPanel9.Dock = System.Windows.Forms.DockStyle.Top;\n        tableLayoutPanel9.Location = new System.Drawing.Point(3, 106);\n        tableLayoutPanel9.Name = \"tableLayoutPanel9\";\n        tableLayoutPanel9.RowCount = 1;\n        tableLayoutPanel9.RowStyles.Add(new System.Windows.Forms.RowStyle());\n        tableLayoutPanel9.Size = new System.Drawing.Size(358, 35);\n        tableLayoutPanel9.TabIndex = 0;\n        // \n        // LnkUseSvgSettings\n        // \n        LnkUseSvgSettings.AutoSize = true;\n        LnkUseSvgSettings.Dock = System.Windows.Forms.DockStyle.Top;\n        LnkUseSvgSettings.Location = new System.Drawing.Point(80, 5);\n        LnkUseSvgSettings.Margin = new System.Windows.Forms.Padding(5);\n        LnkUseSvgSettings.Name = \"LnkUseSvgSettings\";\n        LnkUseSvgSettings.Size = new System.Drawing.Size(197, 25);\n        LnkUseSvgSettings.TabIndex = 0;\n        LnkUseSvgSettings.Text = \"▼ Use size settings given in SVG ▼\";\n        // \n        // tableLayoutPanel2\n        // \n        tableLayoutPanel2.AutoSize = true;\n        tableLayoutPanel2.ColumnCount = 6;\n        tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));\n        tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n        tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n        tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n        tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n        tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));\n        tableLayoutPanel2.Controls.Add(LblViewport, 1, 0);\n        tableLayoutPanel2.Controls.Add(TbViewboxH, 4, 2);\n        tableLayoutPanel2.Controls.Add(label6, 3, 2);\n        tableLayoutPanel2.Controls.Add(TbViewportW, 2, 0);\n        tableLayoutPanel2.Controls.Add(label3, 3, 0);\n        tableLayoutPanel2.Controls.Add(TbViewboxW, 2, 2);\n        tableLayoutPanel2.Controls.Add(TbViewportH, 4, 0);\n        tableLayoutPanel2.Controls.Add(LblViewboxWH, 1, 2);\n        tableLayoutPanel2.Controls.Add(LblViewboxXY, 1, 1);\n        tableLayoutPanel2.Controls.Add(TbViewboxY, 4, 1);\n        tableLayoutPanel2.Controls.Add(label4, 3, 1);\n        tableLayoutPanel2.Controls.Add(TbViewboxX, 2, 1);\n        tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Top;\n        tableLayoutPanel2.Location = new System.Drawing.Point(3, 19);\n        tableLayoutPanel2.Name = \"tableLayoutPanel2\";\n        tableLayoutPanel2.RowCount = 3;\n        tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle());\n        tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle());\n        tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle());\n        tableLayoutPanel2.Size = new System.Drawing.Size(358, 87);\n        tableLayoutPanel2.TabIndex = 1;\n        // \n        // LblViewport\n        // \n        LblViewport.AutoSize = true;\n        LblViewport.Dock = System.Windows.Forms.DockStyle.Fill;\n        LblViewport.Location = new System.Drawing.Point(60, 0);\n        LblViewport.Name = \"LblViewport\";\n        LblViewport.Size = new System.Drawing.Size(93, 29);\n        LblViewport.TabIndex = 0;\n        LblViewport.Text = \"Viewport (W×H)\";\n        LblViewport.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n        // \n        // TbViewboxH\n        // \n        TbViewboxH.Dock = System.Windows.Forms.DockStyle.Fill;\n        TbViewboxH.Enabled = false;\n        TbViewboxH.Location = new System.Drawing.Point(242, 61);\n        TbViewboxH.MinimumSize = new System.Drawing.Size(50, 4);\n        TbViewboxH.Name = \"TbViewboxH\";\n        TbViewboxH.Size = new System.Drawing.Size(56, 23);\n        TbViewboxH.TabIndex = 5;\n        TbViewboxH.TabStop = false;\n        TbViewboxH.Text = \"-\";\n        TbViewboxH.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;\n        // \n        // label6\n        // \n        label6.AutoSize = true;\n        label6.Dock = System.Windows.Forms.DockStyle.Fill;\n        label6.Location = new System.Drawing.Point(221, 58);\n        label6.Name = \"label6\";\n        label6.Size = new System.Drawing.Size(15, 29);\n        label6.TabIndex = 2;\n        label6.Text = \"×\";\n        label6.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n        // \n        // TbViewportW\n        // \n        TbViewportW.Dock = System.Windows.Forms.DockStyle.Fill;\n        TbViewportW.Enabled = false;\n        TbViewportW.Location = new System.Drawing.Point(159, 3);\n        TbViewportW.MinimumSize = new System.Drawing.Size(50, 4);\n        TbViewportW.Name = \"TbViewportW\";\n        TbViewportW.Size = new System.Drawing.Size(56, 23);\n        TbViewportW.TabIndex = 0;\n        TbViewportW.TabStop = false;\n        TbViewportW.Text = \"-\";\n        TbViewportW.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;\n        // \n        // label3\n        // \n        label3.AutoSize = true;\n        label3.Dock = System.Windows.Forms.DockStyle.Fill;\n        label3.Location = new System.Drawing.Point(221, 0);\n        label3.Name = \"label3\";\n        label3.Size = new System.Drawing.Size(15, 29);\n        label3.TabIndex = 4;\n        label3.Text = \"×\";\n        label3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n        // \n        // TbViewboxW\n        // \n        TbViewboxW.Dock = System.Windows.Forms.DockStyle.Fill;\n        TbViewboxW.Enabled = false;\n        TbViewboxW.Location = new System.Drawing.Point(159, 61);\n        TbViewboxW.MinimumSize = new System.Drawing.Size(50, 4);\n        TbViewboxW.Name = \"TbViewboxW\";\n        TbViewboxW.Size = new System.Drawing.Size(56, 23);\n        TbViewboxW.TabIndex = 4;\n        TbViewboxW.TabStop = false;\n        TbViewboxW.Text = \"-\";\n        TbViewboxW.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;\n        // \n        // TbViewportH\n        // \n        TbViewportH.Dock = System.Windows.Forms.DockStyle.Fill;\n        TbViewportH.Enabled = false;\n        TbViewportH.Location = new System.Drawing.Point(242, 3);\n        TbViewportH.MinimumSize = new System.Drawing.Size(50, 4);\n        TbViewportH.Name = \"TbViewportH\";\n        TbViewportH.Size = new System.Drawing.Size(56, 23);\n        TbViewportH.TabIndex = 1;\n        TbViewportH.TabStop = false;\n        TbViewportH.Text = \"-\";\n        TbViewportH.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;\n        // \n        // LblViewboxWH\n        // \n        LblViewboxWH.AutoSize = true;\n        LblViewboxWH.Dock = System.Windows.Forms.DockStyle.Fill;\n        LblViewboxWH.Location = new System.Drawing.Point(60, 58);\n        LblViewboxWH.Name = \"LblViewboxWH\";\n        LblViewboxWH.Size = new System.Drawing.Size(93, 29);\n        LblViewboxWH.TabIndex = 7;\n        LblViewboxWH.Text = \"ViewBox (W×H)\";\n        LblViewboxWH.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n        // \n        // LblViewboxXY\n        // \n        LblViewboxXY.AutoSize = true;\n        LblViewboxXY.Dock = System.Windows.Forms.DockStyle.Fill;\n        LblViewboxXY.Location = new System.Drawing.Point(60, 29);\n        LblViewboxXY.Name = \"LblViewboxXY\";\n        LblViewboxXY.Size = new System.Drawing.Size(93, 29);\n        LblViewboxXY.TabIndex = 8;\n        LblViewboxXY.Text = \"ViewBox (X,Y)\";\n        LblViewboxXY.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n        // \n        // TbViewboxY\n        // \n        TbViewboxY.Dock = System.Windows.Forms.DockStyle.Fill;\n        TbViewboxY.Enabled = false;\n        TbViewboxY.Location = new System.Drawing.Point(242, 32);\n        TbViewboxY.MinimumSize = new System.Drawing.Size(50, 4);\n        TbViewboxY.Name = \"TbViewboxY\";\n        TbViewboxY.Size = new System.Drawing.Size(56, 23);\n        TbViewboxY.TabIndex = 3;\n        TbViewboxY.TabStop = false;\n        TbViewboxY.Text = \"-\";\n        TbViewboxY.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;\n        // \n        // label4\n        // \n        label4.AutoSize = true;\n        label4.Dock = System.Windows.Forms.DockStyle.Fill;\n        label4.Location = new System.Drawing.Point(221, 29);\n        label4.Name = \"label4\";\n        label4.Size = new System.Drawing.Size(15, 29);\n        label4.TabIndex = 10;\n        label4.Text = \",\";\n        label4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\n        // \n        // TbViewboxX\n        // \n        TbViewboxX.Dock = System.Windows.Forms.DockStyle.Fill;\n        TbViewboxX.Enabled = false;\n        TbViewboxX.Location = new System.Drawing.Point(159, 32);\n        TbViewboxX.MinimumSize = new System.Drawing.Size(50, 4);\n        TbViewboxX.Name = \"TbViewboxX\";\n        TbViewboxX.Size = new System.Drawing.Size(56, 23);\n        TbViewboxX.TabIndex = 2;\n        TbViewboxX.TabStop = false;\n        TbViewboxX.Text = \"-\";\n        TbViewboxX.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;\n        // \n        // SvgImportDialog\n        // \n        AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);\n        AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;\n        AutoSize = true;\n        ClientSize = new System.Drawing.Size(384, 341);\n        Controls.Add(RootPanel);\n        Name = \"SvgImportDialog\";\n        ((System.ComponentModel.ISupportInitialize)PbWarning).EndInit();\n        RootPanel.ResumeLayout(false);\n        RootPanel.PerformLayout();\n        StatusStrip.ResumeLayout(false);\n        StatusStrip.PerformLayout();\n        tableLayoutPanel3.ResumeLayout(false);\n        tableLayoutPanel3.PerformLayout();\n        GbLayers.ResumeLayout(false);\n        GbLayers.PerformLayout();\n        tableLayoutPanel1.ResumeLayout(false);\n        tableLayoutPanel1.PerformLayout();\n        GbSizeSelection.ResumeLayout(false);\n        GbSizeSelection.PerformLayout();\n        tableLayoutPanel4.ResumeLayout(false);\n        tableLayoutPanel4.PerformLayout();\n        ((System.ComponentModel.ISupportInitialize)NudCanvasW).EndInit();\n        ((System.ComponentModel.ISupportInitialize)NudCanvasH).EndInit();\n        ((System.ComponentModel.ISupportInitialize)NudDpi).EndInit();\n        GbInfo.ResumeLayout(false);\n        GbInfo.PerformLayout();\n        tableLayoutPanel9.ResumeLayout(false);\n        tableLayoutPanel9.PerformLayout();\n        tableLayoutPanel2.ResumeLayout(false);\n        tableLayoutPanel2.PerformLayout();\n        ResumeLayout(false);\n        PerformLayout();\n    }\n\n    #endregion\n    private System.Windows.Forms.ToolTip ToolTip1;\n    private System.Windows.Forms.Panel RootPanel;\n    private System.Windows.Forms.TableLayoutPanel tableLayoutPanel3;\n    private System.Windows.Forms.LinkLabel LnkGitHub;\n    private System.Windows.Forms.LinkLabel LnkForum;\n    private System.Windows.Forms.Button BtnOk;\n    private System.Windows.Forms.Button BtnCancel;\n    private System.Windows.Forms.GroupBox GbLayers;\n    private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;\n    private System.Windows.Forms.RadioButton RbFlatten;\n    private System.Windows.Forms.CheckBox CbGroupBoundaries;\n    private System.Windows.Forms.RadioButton RbGroups;\n    private System.Windows.Forms.CheckBox CbHiddenLayers;\n    private System.Windows.Forms.RadioButton RbAllElements;\n    private System.Windows.Forms.CheckBox CbOpacity;\n    private System.Windows.Forms.GroupBox GbSizeSelection;\n    private System.Windows.Forms.CheckBox CbKeepAR;\n    private System.Windows.Forms.TableLayoutPanel tableLayoutPanel4;\n    private System.Windows.Forms.Label LblResolution;\n    private System.Windows.Forms.Label LblCanvasWH;\n    private System.Windows.Forms.PictureBox PbWarning;\n    private System.Windows.Forms.NumericUpDown NudCanvasW;\n    private System.Windows.Forms.NumericUpDown NudCanvasH;\n    private System.Windows.Forms.Label label9;\n    private System.Windows.Forms.NumericUpDown NudDpi;\n    private System.Windows.Forms.GroupBox GbInfo;\n    private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;\n    private System.Windows.Forms.Label LblViewport;\n    private System.Windows.Forms.TextBox TbViewboxH;\n    private System.Windows.Forms.Label label6;\n    private System.Windows.Forms.TextBox TbViewportW;\n    private System.Windows.Forms.Label label3;\n    private System.Windows.Forms.TextBox TbViewboxW;\n    private System.Windows.Forms.TextBox TbViewportH;\n    private System.Windows.Forms.Label LblViewboxWH;\n    private System.Windows.Forms.Label LblViewboxXY;\n    private System.Windows.Forms.TextBox TbViewboxY;\n    private System.Windows.Forms.Label label4;\n    private System.Windows.Forms.TextBox TbViewboxX;\n    private System.Windows.Forms.StatusStrip StatusStrip;\n    private System.Windows.Forms.ToolStripStatusLabel ProgressLabel;\n    private System.Windows.Forms.ToolStripProgressBar ProgressBar;\n    private System.Windows.Forms.ToolStripStatusLabel PlaceHolderLabel;\n    private System.Windows.Forms.ToolStripStatusLabel UpdateAvailLabel;\n    private System.Windows.Forms.TableLayoutPanel tableLayoutPanel9;\n    private System.Windows.Forms.Button LnkUseSvgSettings;\n}\n"
  },
  {
    "path": "SvgFileType/Import/SvgImportDialog.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing System;\nusing System.ComponentModel;\nusing System.Diagnostics;\nusing System.Drawing;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing PaintDotNet;\nusing Svg;\nusing SvgFileTypePlugin.Extensions;\nusing SR = SvgFileTypePlugin.Localization.StringResources;\n\nnamespace SvgFileTypePlugin.Import;\n\ninternal partial class SvgImportDialog : MyBaseForm\n{\n    private const string NotAvailable = \"-\";\n    private const int CanvasSizeWarningThreshold = 1280;\n    private const int DefaultFallbackSize = 512;\n    private object? lastModifiedNud;\n    private bool dontUpdate;\n    private bool isRunning;\n    private readonly CancellationTokenSource cts;\n    private readonly Size docSize;\n    private readonly int docPpi;\n    private readonly string svgdata;\n    private Size rasterSize;\n    private readonly Rectangle docViewbox;\n    private readonly string renderer;\n\n    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\n    public Document? Result { get; private set; }\n\n    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\n    public Exception? Error { get; private set; }\n\n    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\n    public override bool EnableImmersiveDarkMode => true;\n\n    public SvgImportDialog(string svgdata, string renderer = \"resvg\", CancellationToken ctoken = default) : base(UIHelper.GetMainForm())\n    {\n        ArgumentNullException.ThrowIfNull(svgdata);\n        ArgumentException.ThrowIfNullOrWhiteSpace(renderer);\n\n        InitializeComponent();\n        SetUseAppThemeColors();\n\n        this.renderer = renderer;\n        this.svgdata = svgdata;\n        cts = CancellationTokenSource.CreateLinkedTokenSource(ctoken);\n\n        SvgDocument svg = SvgDocument.FromSvg<SvgDocument>(svgdata);\n        docSize = svg.GetDimensions().ToSize();\n        docViewbox = Rectangle.Truncate(svg.ViewBox);\n        docPpi = svg.Ppi;\n\n        PopulateContols();\n        HookEvents();\n    }\n\n    protected override void OnLoad(EventArgs e)\n    {\n        ClientSize = RootPanel.Size;\n        base.OnLoad(e);\n    }\n\n    protected override void OnClosing(CancelEventArgs e)\n    {\n        base.OnClosing(e);\n\n        if (!isRunning) \n        {\n            Error = new WarningException(SR.CanceledUponYourRequest);\n        }\n        if (!cts.IsCancellationRequested)\n        {\n            cts.Cancel();\n        }\n    }\n\n    protected override void OnClosed(EventArgs e)\n    {\n        base.OnClosed(e);\n        cts.Dispose();\n    }\n\n    #region Private Methods\n\n    private void PopulateContols()\n    {\n        Text = $\"{SvgFileTypePluginSupportInfo.Instance.DisplayName} v{SvgFileTypePluginSupportInfo.Instance.Version}\";\n        PbWarning.Image = SystemIcons.Warning.ToBitmap();\n        GbInfo.Text = SR.SizeSettingsGivenInSvgFile;\n        LnkUseSvgSettings.Text = SR.UseSizeSettingsGivenInSvg.SplitIntoLines(maximumLineLength: 60);\n        GbSizeSelection.Text = SR.SizeSelectionByUser;\n        LblResolution.Text = SR.Resolution;\n        LblCanvasWH.Text = SR.Canvas;\n        LblViewport.Text = SR.Viewport;\n        LblViewboxWH.Text = SR.ViewBoxWH;\n        LblViewboxXY.Text = SR.ViewBoxXY;\n        CbKeepAR.Text = SR.KeepAspectRatio;\n        GbLayers.Text = SR.Layers;\n        RbFlatten.Text = SR.Flatten;\n        RbGroups.Text = SR.Groups;\n        RbAllElements.Text = SR.AllElements;\n        CbOpacity.Text = SR.OpacityAsLayerProperty.SplitIntoLines(maximumLineLength: 36);\n        CbHiddenLayers.Text = SR.ImportHiddenElements.SplitIntoLines(maximumLineLength: 36);\n        CbGroupBoundaries.Text = SR.GroupBoundaries.SplitIntoLines(maximumLineLength: 36);\n        BtnOk.Text = SR.OK;\n        BtnCancel.Text = SR.Cancel;\n        ProgressLabel.Text = SR.Ready;\n        ToolTip1.SetToolTip(PbWarning, SR.MemoryWarningText);\n\n        TbViewportW.Text = docSize.Width > 0 ? docSize.Width.ToString() : NotAvailable;\n        TbViewportH.Text = docSize.Height > 0 ? docSize.Height.ToString() : NotAvailable;\n\n        if (!docViewbox.IsEmpty)\n        {\n            TbViewboxX.Text = docViewbox.X.ToString();\n            TbViewboxY.Text = docViewbox.Y.ToString();\n            TbViewboxW.Text = docViewbox.Width.ToString();\n            TbViewboxH.Text = docViewbox.Height.ToString();\n        }\n        else\n        {\n            TbViewboxX.Text = NotAvailable;\n            TbViewboxY.Text = NotAvailable;\n            TbViewboxW.Text = NotAvailable;\n            TbViewboxH.Text = NotAvailable;\n        }\n\n        rasterSize = docSize.Width == 0 || docSize.Height == 0\n            ? new Size(DefaultFallbackSize, DefaultFallbackSize)\n            : docSize;\n\n        if (rasterSize.Width * rasterSize.Height > CanvasSizeWarningThreshold * CanvasSizeWarningThreshold)\n        {\n            double ratio = rasterSize.Width / (double)rasterSize.Height;\n            if (rasterSize.Width > rasterSize.Height)\n            {\n                NudCanvasW.Value = CanvasSizeWarningThreshold;\n                NudCanvasH.Value = (int)Math.Round(CanvasSizeWarningThreshold / ratio);\n            }\n            else\n            {\n                NudCanvasH.Value = CanvasSizeWarningThreshold;\n                NudCanvasW.Value = (int)Math.Round(CanvasSizeWarningThreshold * ratio);\n            }\n        }\n        else\n        {\n            NudCanvasW.Value = rasterSize.Width;\n            NudCanvasH.Value = rasterSize.Height;\n        }\n\n        UpdateLayersPanel();\n    }\n\n    private void HookEvents()\n    {\n        RbAllElements.CheckedChanged += Rb_CheckedChanged;\n        RbFlatten.CheckedChanged += Rb_CheckedChanged;\n        RbGroups.CheckedChanged += Rb_CheckedChanged;\n        NudCanvasW.Accelerations.Add(new NumericUpDownAcceleration(3, 10));\n        NudCanvasW.KeyUp += NudCanvas_KeyUp;\n        NudCanvasH.Accelerations.Add(new NumericUpDownAcceleration(3, 10));\n        NudCanvasH.KeyUp += NudCanvas_KeyUp;\n        NudCanvasW.LostFocus += NudCanvas_LostFocus;\n        NudCanvasH.LostFocus += NudCanvas_LostFocus;\n        NudCanvasW.ValueChanged += NudCanvas_ValueChanged;\n        NudCanvasH.ValueChanged += NudCanvas_ValueChanged;\n        CbKeepAR.CheckedChanged += CbKeepAR_CheckedChanged;\n        LnkUseSvgSettings.Click += LnkUseSvgSettings_Click;\n        LnkGitHub.LinkClicked += LnkGitHub_LinkClicked;\n        LnkForum.LinkClicked += LnkForum_LinkClicked;\n        BtnOk.Click += BtnOk_Click;\n        BtnCancel.Click += BtnCancel_Click;\n        CancelButton = BtnCancel;\n    }\n\n    private void UpdateLayersPanel()\n    {\n        CbOpacity.Enabled = CbHiddenLayers.Enabled = CbGroupBoundaries.Enabled = !RbFlatten.Checked;\n        CbGroupBoundaries.Enabled = RbAllElements.Checked;\n        ShowCanvasSizeWarningIfNeeded();\n    }\n\n    private void ShowCanvasSizeWarningIfNeeded()\n    {\n        PbWarning.Visible = !RbFlatten.Checked && NudCanvasH.Value * NudCanvasW.Value > CanvasSizeWarningThreshold * CanvasSizeWarningThreshold;\n    }\n\n    private void UpdateTheOtherNud()\n    {\n        lastModifiedNud ??= NudCanvasW.Value > NudCanvasH.Value ? NudCanvasW : NudCanvasH;\n\n        if (ReferenceEquals(lastModifiedNud, NudCanvasW))\n        {\n            decimal newHeight = CbKeepAR.Checked ? NudCanvasW.Value * rasterSize.Height / rasterSize.Width : NudCanvasH.Value;\n            newHeight = Math.Clamp(newHeight, 1, Math.Min(NudCanvasH.Maximum, int.MaxValue / (NudCanvasW.Value * 4)));\n            NudCanvasH.Value = newHeight;\n        }\n        else\n        {\n            decimal newWidth = CbKeepAR.Checked ? NudCanvasH.Value * rasterSize.Width / rasterSize.Height : NudCanvasW.Value;\n            newWidth = Math.Clamp(newWidth, 1, Math.Min(NudCanvasW.Maximum, int.MaxValue / (NudCanvasH.Value * 4)));\n            NudCanvasW.Value = newWidth;\n        }\n        ShowCanvasSizeWarningIfNeeded();\n    }\n\n    private SvgImportConfig GetSvgImportConfig()\n    {\n        SvgImportConfig config = new SvgImportConfig\n        {\n            RasterWidth = (int)NudCanvasW.Value,\n            RasterHeight = (int)NudCanvasH.Value,\n            PreserveAspectRatio = CbKeepAR.Checked,\n            Ppi = (int)NudDpi.Value,\n            GroupBoundariesAsLayers = CbGroupBoundaries.Checked,\n            ImportHiddenElements = CbHiddenLayers.Checked,\n            RespectElementOpacity = CbOpacity.Checked,\n            LayersMode = RbAllElements.Checked\n                ? LayersMode.All\n                : RbFlatten.Checked\n                ? LayersMode.Flat\n                : LayersMode.Groups\n        };\n        return config;\n    }\n\n    private void DisableControlsExceptCancelButton()\n    {\n        this.Descendants().OfType<GroupBox>().ToList().ForEach(groupbox => groupbox.Enabled = false);\n        BtnOk.Enabled = false;\n        ProgressBar.Visible = true;\n    }\n\n    #endregion\n\n    #region Events\n\n    private void NudCanvas_ValueChanged(object? sender, EventArgs e)\n    {\n        if (dontUpdate)\n        {\n            return;\n        }\n\n        lastModifiedNud = sender;\n        UpdateTheOtherNud();\n    }\n\n    private void CbKeepAR_CheckedChanged(object? sender, EventArgs e)\n    {\n        if (dontUpdate)\n        {\n            return;\n        }\n\n        lastModifiedNud = null;\n        UpdateTheOtherNud();\n    }\n\n    private void NudCanvas_KeyUp(object? sender, KeyEventArgs e)\n    {\n        if (dontUpdate)\n        {\n            return;\n        }\n\n        lastModifiedNud = sender;\n        if (e.KeyValue >= '0' || e.KeyValue <= '9' || e.KeyCode == Keys.Delete || e.KeyCode == Keys.Back)\n        {\n            // Handle key events like digits, delete and backspace\n            UpdateTheOtherNud();\n        }\n        else\n        {\n            // We ignore any other key event on these controls\n            e.SuppressKeyPress = true;\n            e.Handled = true;\n        }\n    }\n\n    private void NudCanvas_LostFocus(object? sender, EventArgs e)\n    {\n        if (sender is not NumericUpDown nud)\n        {\n            return;\n        }\n\n        TextBox? textbox = nud.Controls.OfType<TextBox>().FirstOrDefault();\n        if (textbox is not null)\n        {\n            textbox.Text = Math.Round(nud.Value, nud.DecimalPlaces).ToString();\n        }\n    }\n\n    private void Rb_CheckedChanged(object? sender, EventArgs e)\n    {\n        UpdateLayersPanel();\n    }\n\n    private void LnkUseSvgSettings_Click(object? sender, EventArgs e)\n    {\n        // Restore the original sizes and show the size warning if needed\n        dontUpdate = true;\n        NudCanvasW.Value = rasterSize.Width;\n        NudCanvasH.Value = rasterSize.Height;\n        dontUpdate = false;\n        NudDpi.Value = docPpi;\n        ShowCanvasSizeWarningIfNeeded();\n    }\n\n    private void LnkGitHub_LinkClicked(object? sender, LinkLabelLinkClickedEventArgs e)\n    {\n        if (e.Button == MouseButtons.Left)\n        {\n            LaunchUrl(SvgFileTypePluginSupportInfo.Instance.WebsiteUri);\n        }\n    }\n\n    private void LnkForum_LinkClicked(object? sender, LinkLabelLinkClickedEventArgs e)\n    {\n        if (e.Button == MouseButtons.Left)\n        {\n            LaunchUrl(SvgFileTypePluginSupportInfo.Instance.ForumUri);\n        }\n    }\n\n    private async void BtnOk_Click(object? sender, EventArgs e)\n    {\n        isRunning = true;\n        try\n        {\n            DisableControlsExceptCancelButton();\n            CancellationToken ctoken = cts.Token;\n            SvgImportConfig config = GetSvgImportConfig();\n            SvgRenderer2 svgRenderer = SvgRenderer2.Create(renderer);\n            svgRenderer.ProgressChanged += OnProgressChanged;\n            Result = await Task.Run(() => svgRenderer.Rasterize(svgdata, config, ctoken), ctoken).ConfigureAwait(false);\n        }\n        catch (Exception ex) when (ex is OperationCanceledException)\n        {\n            Error = new WarningException(SR.CanceledUponYourRequest, ex);\n        }\n        catch (Exception ex)\n        {\n            Error = ex;\n        }\n        finally\n        {\n            DialogResult = Result is null ? DialogResult.Cancel : DialogResult.OK;\n        }\n    }\n\n    private void OnProgressChanged(object? sender, ProgressChangedEventArgs e)\n    {\n        if (IsDisposed)\n        {\n            return;\n        }\n\n        try\n        {\n            if (InvokeRequired)\n            {\n                Invoke(OnProgressChanged, sender, e);\n                return;\n            }\n\n            int total = (int)e.UserState!;\n            if (e.ProgressPercentage == 0)\n            {\n                if (total == 1)\n                {\n                    ProgressBar.Style = ProgressBarStyle.Marquee;\n                    ProgressLabel.Text = SR.Working;\n                }\n                else\n                {\n                    ProgressBar.Style = ProgressBarStyle.Blocks;\n                    ProgressBar.Maximum = total;\n                    ProgressLabel.Text = SR.Ready;\n                }\n            }\n            if (total > 1)\n            {\n                ProgressBar.Value = e.ProgressPercentage;\n                float percentage = e.ProgressPercentage / (float)total;\n                ProgressLabel.Text = percentage.ToString(\"P2\");\n            }\n        }\n        catch (ObjectDisposedException)\n        {\n            // ignore\n        }\n    }\n\n    private void BtnCancel_Click(object? sender, EventArgs e)\n    {\n        BtnCancel.Enabled = false;\n        try\n        {\n            cts.Cancel();\n        }\n        catch (ObjectDisposedException)\n        {\n            // This should never happen\n        }\n        finally\n        {\n            Error = new WarningException(SR.CanceledUponYourRequest);\n        }\n    }\n\n    #endregion\n\n    #region Static\n\n    private static void LaunchUrl(Uri uri)\n    {\n        Process.Start(\"explorer\", $@\"\"\"{uri}\"\"\");\n    }\n\n    #endregion\n}\n"
  },
  {
    "path": "SvgFileType/Import/SvgImportDialog.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!--\n    Microsoft ResX Schema\n\n    Version 2.0\n\n    The primary goals of this format is to allow a simple XML format\n    that is mostly human readable. The generation and parsing of the\n    various data types are done through the TypeConverter classes\n    associated with the data types.\n\n    Example:\n\n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n\n    There are any number of \"resheader\" rows that contain simple\n    name/value pairs.\n\n    Each data row contains a name, and value. The row also contains a\n    type or mimetype. Type corresponds to a .NET class that support\n    text/value conversion through the TypeConverter architecture.\n    Classes that don't support this are serialized and stored with the\n    mimetype set.\n\n    The mimetype is used for serialized objects, and tells the\n    ResXResourceReader how to depersist the object. This is currently not\n    extensible. For a given mimetype the value must be set accordingly:\n\n    Note - application/x-microsoft.net.object.binary.base64 is the format\n    that the ResXResourceWriter will generate, however the reader can\n    read any of the formats listed below.\n\n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array\n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"ToolTip1.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <metadata name=\"PbWarning.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"CbGroupBoundaries.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"RootPanel.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"StatusStrip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>115, 17</value>\n  </metadata>\n  <metadata name=\"StatusStrip.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"tableLayoutPanel3.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"LnkGitHub.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"LnkForum.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"BtnOk.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"BtnCancel.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"GbLayers.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"tableLayoutPanel1.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"RbFlatten.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"RbGroups.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"CbHiddenLayers.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"RbAllElements.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"CbOpacity.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"GbSizeSelection.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"CbKeepAR.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"tableLayoutPanel4.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"LblResolution.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"LblCanvasWH.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"NudCanvasW.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"NudCanvasH.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"label9.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"NudDpi.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"GbInfo.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"tableLayoutPanel9.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"LnkUseSvgSettings.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"tableLayoutPanel2.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"LblViewport.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"TbViewboxH.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"label6.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"TbViewportW.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"label3.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"TbViewboxW.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"TbViewportH.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"LblViewboxWH.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"LblViewboxXY.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"TbViewboxY.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"label4.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <metadata name=\"TbViewboxX.Locked\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n</root>"
  },
  {
    "path": "SvgFileType/Import/SvgRenderer2.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing System;\nusing System.Collections.Frozen;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Diagnostics;\nusing System.Drawing;\nusing System.Drawing.Drawing2D;\nusing System.Drawing.Imaging;\nusing System.Linq;\nusing System.Runtime;\nusing System.Threading;\nusing PaintDotNet;\nusing Svg;\nusing SvgFileTypePlugin.Extensions;\nusing SR = SvgFileTypePlugin.Localization.StringResources;\n\nnamespace SvgFileTypePlugin.Import;\n\ninternal abstract class SvgRenderer2(string name)\n{\n    private static readonly FrozenSet<string> TitleAttributes = [\"label\", \"title\", \"inkscape:label\"];\n    private int step, total;\n\n    public string Name { get; } = name;\n\n    public event ProgressChangedEventHandler? ProgressChanged;\n\n    #region Public\n\n    public Document Rasterize(string svgdata, SvgImportConfig config, CancellationToken ctoken = default)\n    {\n        ArgumentNullException.ThrowIfNull(config);\n\n        Logger.WriteLine($\"Using '{Name}' renderer with '{config.LayersMode}' layers mode.\");\n        return config.LayersMode == LayersMode.Flat\n            ? GetFlatDocument(svgdata, config, ctoken)\n            : GetLayeredDocument(svgdata, config, ctoken);\n    }\n\n    #endregion\n\n    #region Public Static\n\n    public static SvgRenderer2 Create(string name)\n    {\n        ArgumentNullException.ThrowIfNull(name);\n\n        return name.ToLowerInvariant() switch\n        {\n            \"resvg\" => new ResvgSvgRenderer(),\n            \"gdip\" or \"gdiplus\" or \"gdi+\" => new GdipSvgRenderer(),\n            \"direct2d\" or \"d2d\" => new Direct2DSvgRenderer(),\n            _ => throw new ArgumentOutOfRangeException(nameof(name), $\"Unknown SVG renderer: {name}\")\n        };\n    }\n\n    #endregion\n\n    #region Protected\n\n    protected abstract Document GetFlatDocument(string svgdata, SvgImportConfig config, CancellationToken ctoken = default);\n\n    protected abstract Document GetLayeredDocument(string svgdata, SvgImportConfig config, CancellationToken ctoken = default);\n\n    public virtual Document GetNoPathDocument()\n    {\n        Graphics g;\n        Size size;\n        using Font font = new Font(\"Arial\", 24, FontStyle.Bold);\n        using (g = Graphics.FromHwnd(nint.Zero))\n        {\n            size = g.MeasureString(SR.NoPath, font).ToSize();\n        }\n        using Bitmap bmp = new Bitmap(size.Width, size.Height, PixelFormat.Format24bppRgb);\n        g = Graphics.FromImage(bmp);\n        using var _ = g;\n        g.Clear(Color.LightGray);\n        Rectangle layoutRectangle = new Rectangle(Point.Empty, bmp.Size);\n        using StringFormat format = new StringFormat()\n        {\n            Alignment = StringAlignment.Center,\n            LineAlignment = StringAlignment.Center\n        };\n        g.DrawString(SR.NoPath, font, Brushes.Black, layoutRectangle, format);\n        return Document.FromImage(bmp);\n    }\n\n    protected void IncrementProgress()\n    {\n        if (ProgressChanged is null)\n        {\n            return;\n        }\n\n        int value = Interlocked.Increment(ref step);\n        value = Math.Clamp(value, 0, total);\n        ProgressChangedEventArgs args = new ProgressChangedEventArgs(value, total);\n        ProgressChanged.Invoke(this, args);\n    }\n\n    /// <exception cref=\"ArgumentOutOfRangeException\"></exception>\n    protected void ResetProgress(int total)\n    {\n        ArgumentOutOfRangeException.ThrowIfNegativeOrZero(total);\n\n        if (ProgressChanged is null)\n        {\n            return;\n        }\n\n        this.total = total;\n        int value = Interlocked.Exchange(ref step, 0);\n        ProgressChangedEventArgs args = new ProgressChangedEventArgs(value, total);\n        ProgressChanged.Invoke(this, args);\n    }\n\n    #endregion\n\n    #region Protected Static\n\n    /// <exception cref=\"ArgumentNullException\"></exception>\n    protected static List<SvgVisualElement> GetSvgVisualElements(SvgDocument svg, SvgImportConfig config, CancellationToken ctoken = default)\n    {\n        ArgumentNullException.ThrowIfNull(svg);\n        ArgumentNullException.ThrowIfNull(config);\n\n        IEnumerable<SvgVisualElement> elements = GetPreparedElements(svg.Children, ctoken);\n\n        if (config.LayersMode == LayersMode.Groups)\n        {\n            elements = FilterByGroups(elements, ctoken);\n        }\n        else\n        {\n            elements = FilterByNonGroups(elements);\n        }\n\n        if (config.LayersMode == LayersMode.Flat || !config.GroupBoundariesAsLayers)\n        {\n            elements = elements.NotOfType<GroupBoundary>();\n        }\n\n        if (config.LayersMode != LayersMode.Flat)\n        {\n            // Skip group boundaries for hidden layers.\n            elements = elements.Where(e => config.ImportHiddenElements || (e is GroupBoundary groupBoundary\n                ? groupBoundary.IsOriginallyVisible\n                : e.IsOriginallyVisible()));\n        }\n\n        return elements.ToList();\n    }\n\n    /// <exception cref=\"ArgumentNullException\"></exception>\n    protected static string GetLayerTitle(SvgElement element, bool prependElementName = true)\n    {\n        ArgumentNullException.ThrowIfNull(element);\n\n        string elementName = element.GetName();\n        string? layerName = null;\n\n        if (element.ID is not null)\n        {\n            layerName = element.ID;\n        }\n\n        if (string.IsNullOrEmpty(layerName) && element.CustomAttributes != null)\n        {\n            // get custom title attributes.\n            foreach (string attr in TitleAttributes)\n            {\n                if (element.CustomAttributes.TryGetValue(attr, out string? title) && !string.IsNullOrEmpty(title))\n                {\n                    // found a title candidate\n                    layerName = title;\n                    break;\n                }\n            }\n        }\n\n        if (string.IsNullOrEmpty(layerName) && element.Children != null)\n        {\n            // Get child title tag\n            SvgTitle? title = element.Children.OfType<SvgTitle>().FirstOrDefault();\n            if (!string.IsNullOrEmpty(title?.Content))\n            {\n                layerName = title.Content;\n            }\n        }\n\n        if (string.IsNullOrEmpty(layerName))\n        {\n            // Generate more meanfull name for a svg use node. Add reference element name in a case if it's local document.\n            if (element is SvgUse useElement and { ReferencedElement.OriginalString.Length: > 1 })\n            {\n                string str = useElement.ReferencedElement.OriginalString.Trim();\n                if (str.StartsWith('#'))\n                {\n                    layerName = str[1..];\n                }\n                prependElementName = true;\n            }\n            // Generate more meanfull name for a svg text.\n            else if (element is SvgTextBase text and { Text.Length: > 0})\n            {\n                layerName = text.Text.Truncate(maxLength: 32);\n            }\n            // Generate more meanfull name for a svg path.\n            else if (element is SvgPath path and { PathData.Count: > 0 })\n            {\n                layerName = path.PathData.ToString().Truncate(maxLength: 32);\n            }\n        }\n\n        return layerName is null\n            ? elementName\n            : prependElementName\n            ? $\"{elementName}: {layerName}\"\n            : layerName;\n    }\n\n    /// <summary>\n    /// Generates a Paint.NET document with given layers and configuration.\n    /// </summary>\n    /// <param name=\"layers\"></param>\n    /// <param name=\"config\"></param>\n    /// <returns></returns>\n    /// <exception cref=\"ArgumentNullException\"></exception>\n    /// <exception cref=\"ArgumentException\"></exception>\n    protected static Document GetDocument(List<BitmapLayer> layers, SvgImportConfig config)\n    {\n        ArgumentNullException.ThrowIfNull(layers);\n        ArgumentNullException.ThrowIfNull(config);\n        if (layers.Count == 0)\n        {\n            throw new ArgumentException(\"There aren't any layers in the collection.\", nameof(layers));\n        }\n\n        Debug.Assert(layers[0].Width == config.RasterWidth);\n        Debug.Assert(layers[0].Height == config.RasterHeight);\n\n        Document document = new Document(config.RasterWidth, config.RasterHeight);\n        try\n        {\n            layers.ForEach(document.Layers.Add);\n            document.SetDpu(config.Ppi);\n            return document;\n        }\n        catch (Exception)\n        {\n            document.Dispose();\n            layers.ForEach(layer => layer.Dispose());\n            throw;\n        }\n    }\n\n    /// <exception cref=\"ArgumentOutOfRangeException\"></exception>\n    protected static void RenderSvgUseElement(SvgUse useElement, Action<SvgElement> renderAction)\n    {\n        ArgumentNullException.ThrowIfNull(useElement);\n        ArgumentNullException.ThrowIfNull(renderAction);\n\n        if (useElement.GetCopyOfReferencedElement() is not SvgElement referencedElement)\n        {\n            return;\n        }\n        referencedElement.Visibility = \"visible\";\n        useElement.Visibility = \"hidden\";\n        SvgElementCollection children = useElement.Parent.Children;\n        children.AddAndForceUniqueID(referencedElement);\n        try\n        {\n            renderAction(referencedElement);\n        }\n        finally\n        {\n            children.Remove(referencedElement);\n        }\n    }\n\n    /// <exception cref=\"ArgumentOutOfRangeException\"></exception>\n    protected static byte ToByteOpacity(float opacity)\n    {\n        ArgumentOutOfRangeException.ThrowIfNegative(opacity);\n        ArgumentOutOfRangeException.ThrowIfGreaterThan(opacity, 1f);\n\n        int value = (int)MathF.Round(opacity * 255f);\n        value = Math.Clamp(value, byte.MinValue, byte.MaxValue);\n        return (byte)value;\n    }\n\n    /// <exception cref=\"ArgumentOutOfRangeException\"></exception>\n    /// <exception cref=\"InsufficientMemoryException\"></exception>\n    /// <exception cref=\"OverflowException\"></exception>\n    protected static MemoryFailPoint GetMemoryFailPoint(int width, int height, int count = 1)\n    {\n        ArgumentOutOfRangeException.ThrowIfNegativeOrZero(width);\n        ArgumentOutOfRangeException.ThrowIfNegativeOrZero(height);\n        ArgumentOutOfRangeException.ThrowIfNegativeOrZero(count);\n\n        int sizeInMegabytes = checked((int)(height * 4L * width * count / (1024 * 1024)));\n        sizeInMegabytes = Math.Max(sizeInMegabytes, 1);\n        return new MemoryFailPoint(sizeInMegabytes);\n    }\n\n    #endregion\n\n    #region Private Static\n\n    private static IEnumerable<SvgVisualElement> GetPreparedElements(IEnumerable<SvgElement> elements, CancellationToken ctoken = default)\n    {\n        return GetPreparedElements(elements, groupName: null, ctoken);\n    }\n\n    private static IEnumerable<SvgVisualElement> GetPreparedElements(IEnumerable<SvgElement> elements, string? groupName, CancellationToken ctoken = default)\n    {\n        // Prepare a collection of elements that about to be rendered. \n        // Don't prepare for a separate parsing def lists.\n        foreach (SvgVisualElement visual in elements.OfType<SvgVisualElement>())\n        {\n            ctoken.ThrowIfCancellationRequested();\n\n            // Fix problem that SVG visual element lib style \"display:none\" is not recognized as visible state.\n            if (visual.Visible && !visual.IsDisplayable())\n            {\n                visual.Visibility = \"hidden\";\n                visual.Display = string.Empty; // null throws exception\n            }\n\n            // Store visibility\n            visual.StoreOriginalVisibility();\n\n            // Save current group to indicate that elements inside a group.\n            if (!string.IsNullOrEmpty(groupName))\n            {\n                visual.SetGroupName(groupName); // Store group info\n            }\n\n            SvgGroup? group = visual as SvgGroup;\n            if (group is not null)\n            {\n                groupName = GetLayerTitle(group, prependElementName: false);\n\n                // Return fake node to indicate group end. (order is reversed)\n                yield return new GroupBoundary(group, groupName, isStart: false);\n            }\n\n            if (GetPreparedElements(visual.Children, groupName, ctoken) is IEnumerable<SvgVisualElement> preparedElements)\n            {\n                foreach (SvgVisualElement element in preparedElements)\n                {\n                    yield return element;\n                }\n            }\n\n            if (group is not null)\n            {\n                Debug.Assert(groupName is not null);\n\n                // Return fake node to indicate group start.\n                yield return new GroupBoundary(group, groupName, isStart: true);\n            }\n\n            // Skip text with empty content. But keep all children nodes.\n            if (visual is SvgTextBase textNode and { Text.Length: > 0 })\n            {\n                continue;\n            }\n\n            yield return visual;\n        }\n    }\n\n    private static IEnumerable<SvgVisualElement> FilterByNonGroups(IEnumerable<SvgVisualElement> elements)\n    {\n        return elements.NotOfType<SvgGroup>();\n    }\n\n    private static IEnumerable<SvgVisualElement> FilterByGroups(IEnumerable<SvgVisualElement> elements, CancellationToken ctoken = default)\n    {\n        HashSet<SvgVisualElement> groups = [];\n        foreach (SvgVisualElement element in elements.NotOfType<GroupBoundary>())\n        {\n            ctoken.ThrowIfCancellationRequested();\n\n            SvgVisualElement? visual = null;\n            if (element.GetGroupName() is not null)\n            {\n                // Get only root level\n                for (SvgElement parent = element; parent is not null; parent = parent.Parent)\n                {\n                    // TODO: render more groups. In most cases svg has only few root groups.\n                    if (parent is SvgGroup group)\n                    {\n                        visual = group;\n                    }\n                }\n            }\n\n            visual ??= element;\n            if (groups.Add(visual))\n            {\n                yield return visual;\n            }\n        }\n    }\n\n    #endregion\n\n    #region GroupBoundary\n\n    /* a private type to determine boundaries of a group. */\n    protected sealed class GroupBoundary(SvgGroup group, string name, bool isStart) : SvgVisualElement\n    {\n        private readonly SvgGroup group = group;\n\n        public override bool Visible => group.Visible;\n\n        public override float Opacity => group.Opacity;\n\n        public bool IsOriginallyVisible => group.IsOriginallyVisible();\n\n        public string Name { get; } = string.Format(isStart ? SR.LayerGroup : SR.EndLayerGroup, name);\n\n        public override RectangleF Bounds => throw new NotImplementedException();\n\n        public override SvgElement DeepCopy()\n        {\n            throw new NotImplementedException();\n        }\n\n        public override GraphicsPath Path(ISvgRenderer renderer)\n        {\n            throw new NotImplementedException();\n        }\n\n        public BitmapLayer ToEmptyLayer(int width, int height)\n        {\n            // Render empty group boundary and continue\n            BitmapLayer layer = new BitmapLayer(width, height)\n            {\n                Name = Name,\n                // Store related group opacity and visibility.\n                Opacity = ToByteOpacity(Opacity),\n                Visible = Visible\n            };\n            return layer;\n        }\n    }\n\n    #endregion\n}\n"
  },
  {
    "path": "SvgFileType/Localization/InjectResourceManager.ps1",
    "content": "(Get-Content 'Localization\\StringResources.Designer.cs').replace('new global::System.Resources.ResourceManager', 'new SingleAssemblyResourceManager') | Set-Content 'Localization\\StringResources.Designer.cs' -Encoding utf8"
  },
  {
    "path": "SvgFileType/Localization/Localize.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing System;\nusing System.Text.RegularExpressions;\nusing SR = SvgFileTypePlugin.Localization.StringResources;\n\nnamespace SvgFileTypePlugin.Localization;\n\ninternal static partial class Localize\n{\n    public static string GetDisplayName<TEnum>(TEnum @enum) where TEnum : struct, Enum\n    {\n        string name = Enum.GetName(@enum) ?? throw new ArgumentException(\"Unknown enum constant.\", nameof(@enum));\n        string key = string.Concat(typeof(TEnum).Name, name);\n        return SR.ResourceManager.GetString(key) ?? SplitCamelCase(name);\n    }\n\n    private static string SplitCamelCase(string str)\n    {\n        return CamelCaseRegex().Replace(str, \" $1\");\n    }\n\n    [GeneratedRegex(\"(\\\\B[A-Z])\")]\n    private static partial Regex CamelCaseRegex();\n}\n"
  },
  {
    "path": "SvgFileType/Localization/SingleAssemblyResourceManager.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing System;\nusing System.Collections.Concurrent;\nusing System.Globalization;\nusing System.IO;\nusing System.Reflection;\nusing System.Resources;\nusing System.Text;\n\nnamespace SvgFileTypePlugin.Localization;\n\ninternal sealed class SingleAssemblyResourceManager : ResourceManager\n{\n    private readonly ConcurrentDictionary<CultureInfo, Lazy<ResourceSet?>> resourceSets = new();\n\n    private const string DefaultCultureName = \"en-US\";\n\n    public SingleAssemblyResourceManager() : base()\n    {\n    }\n\n    public SingleAssemblyResourceManager(Type resourceSource) : base(resourceSource)\n    {\n    }\n\n    public SingleAssemblyResourceManager(string baseName, Assembly assembly) : base(baseName, assembly)\n    {\n    }\n\n    public SingleAssemblyResourceManager(string baseName, Assembly assembly, Type usingResourceSet) : base(baseName, assembly, usingResourceSet)\n    {\n    }\n\n    protected override ResourceSet? InternalGetResourceSet(CultureInfo culture, bool createIfNotExists, bool tryParents)\n    {\n        /* If you call GetOrAdd simultaneously on different threads, addValueFactory may be called \n         * multiple times, but its key/value pair might not be added to the dictionary for every call.*/\n        return resourceSets.GetOrAdd(culture, c => new Lazy<ResourceSet?>(() => CustomGetResourceSet(c, createIfNotExists, tryParents))).Value;\n    }\n\n    private ResourceSet? CustomGetResourceSet(CultureInfo culture, bool createIfNotExists, bool tryParents)\n    {\n        string filename = GetResourceFileName(culture);\n        using Stream? stream = MainAssembly?.GetManifestResourceStream(filename);\n        Logger.WriteLineIf(stream != null, $\"Translations loaded for '{culture}'.\");\n        ResourceSet? resourceSet = stream is null\n            ? base.InternalGetResourceSet(culture, createIfNotExists, tryParents)\n            : new ResourceSet(stream);\n        return resourceSet;\n    }\n\n    public override void ReleaseAllResources()\n    {\n        base.ReleaseAllResources();\n        foreach (Lazy<ResourceSet?> resourceSet in resourceSets.Values)\n        {\n            if (resourceSet.IsValueCreated && resourceSet.Value is not null)\n            {\n                resourceSet.Value.Close();\n                resourceSet.Value.Dispose();\n            }\n        }\n        resourceSets.Clear();\n    }\n\n    protected override string GetResourceFileName(CultureInfo culture)\n    {\n        StringBuilder sb = new StringBuilder(BaseName, capacity: 255);\n        // If this is the neutral culture, don't append culture name.\n        if (culture.Name != CultureInfo.InvariantCulture.Name && culture.Name != DefaultCultureName)\n        {\n            VerifyCultureName(culture.Name, throwException: true);\n            sb.Append('_');\n            sb.Append(culture.Name);\n        }\n        sb.Append(\".resources\");\n        return sb.ToString();\n    }\n\n    private static bool VerifyCultureName(string cultureName, bool throwException)\n    {\n        // This function is used by ResourceManager.GetResourceFileName().\n        // ResourceManager searches for resource using CultureInfo.Name,\n        // so we should check against CultureInfo.Name.\n        for (int i = 0; i < cultureName.Length; i++)\n        {\n            char c = cultureName[i];\n            // TODO: Names can only be RFC4646 names (ie: a-zA-Z0-9) while this allows any unicode letter/digit\n            if (char.IsLetterOrDigit(c) || c == '-' || c == '_')\n            {\n                continue;\n            }\n            if (throwException)\n            {\n                throw new ArgumentException($\"The given culture name '{cultureName}' cannot be used to locate a resource file. \" +\n                    \"Resource filenames must consist of only letters, numbers, hyphens or underscores.\");\n            }\n            return false;\n        }\n        return true;\n    }\n}\n"
  },
  {
    "path": "SvgFileType/Localization/StringResources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace SvgFileTypePlugin.Localization {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"17.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class StringResources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal StringResources() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new SingleAssemblyResourceManager(\"SvgFileTypePlugin.Localization.StringResources\", typeof(StringResources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to All Elements.\n        /// </summary>\n        internal static string AllElements {\n            get {\n                return ResourceManager.GetString(\"AllElements\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Angle.\n        /// </summary>\n        internal static string Angle {\n            get {\n                return ResourceManager.GetString(\"Angle\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to An update is available!.\n        /// </summary>\n        internal static string AnUpdateIsAvailable {\n            get {\n                return ResourceManager.GetString(\"AnUpdateIsAvailable\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Brightness Cutoff.\n        /// </summary>\n        internal static string BrightnessCutoff {\n            get {\n                return ResourceManager.GetString(\"BrightnessCutoff\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Detects areas that are darker than the threshold value and creates a path enclosing them..\n        /// </summary>\n        internal static string BrightnessCutoffDesc {\n            get {\n                return ResourceManager.GetString(\"BrightnessCutoffDesc\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Cancel.\n        /// </summary>\n        internal static string Cancel {\n            get {\n                return ResourceManager.GetString(\"Cancel\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Canceled upon your request..\n        /// </summary>\n        internal static string CanceledUponYourRequest {\n            get {\n                return ResourceManager.GetString(\"CanceledUponYourRequest\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Canvas (W×H).\n        /// </summary>\n        internal static string Canvas {\n            get {\n                return ResourceManager.GetString(\"Canvas\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Canvas is too big..\n        /// </summary>\n        internal static string CanvasIsTooBig {\n            get {\n                return ResourceManager.GetString(\"CanvasIsTooBig\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Color.\n        /// </summary>\n        internal static string Color {\n            get {\n                return ResourceManager.GetString(\"Color\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Discussion.\n        /// </summary>\n        internal static string DiscussionLink {\n            get {\n                return ResourceManager.GetString(\"DiscussionLink\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Edge Detection Mode.\n        /// </summary>\n        internal static string EdgeDetectionMode {\n            get {\n                return ResourceManager.GetString(\"EdgeDetectionMode\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Enclose.\n        /// </summary>\n        internal static string Enclose {\n            get {\n                return ResourceManager.GetString(\"Enclose\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to End Layer Group: {0}.\n        /// </summary>\n        internal static string EndLayerGroup {\n            get {\n                return ResourceManager.GetString(\"EndLayerGroup\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Export as Shape.\n        /// </summary>\n        internal static string ExportAsPdnShape {\n            get {\n                return ResourceManager.GetString(\"ExportAsPdnShape\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Fill Color.\n        /// </summary>\n        internal static string FillColor {\n            get {\n                return ResourceManager.GetString(\"FillColor\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Flatten.\n        /// </summary>\n        internal static string Flatten {\n            get {\n                return ResourceManager.GetString(\"Flatten\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to GitHub.\n        /// </summary>\n        internal static string GitHubLink {\n            get {\n                return ResourceManager.GetString(\"GitHubLink\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Group boundaries as empty layers.\n        /// </summary>\n        internal static string GroupBoundaries {\n            get {\n                return ResourceManager.GetString(\"GroupBoundaries\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Groups.\n        /// </summary>\n        internal static string Groups {\n            get {\n                return ResourceManager.GetString(\"Groups\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Highpass Filter Radius.\n        /// </summary>\n        internal static string HighpassFilterRadius {\n            get {\n                return ResourceManager.GetString(\"HighpassFilterRadius\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Suppresses large-scale irregularities such as background variations, while preserving small-scale detail such as lines..\n        /// </summary>\n        internal static string HighpassFilterRadiusDesc {\n            get {\n                return ResourceManager.GetString(\"HighpassFilterRadiusDesc\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Hidden elements.\n        /// </summary>\n        internal static string ImportHiddenElements {\n            get {\n                return ResourceManager.GetString(\"ImportHiddenElements\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Invert.\n        /// </summary>\n        internal static string Invert {\n            get {\n                return ResourceManager.GetString(\"Invert\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Keep Aspect Ratio.\n        /// </summary>\n        internal static string KeepAspectRatio {\n            get {\n                return ResourceManager.GetString(\"KeepAspectRatio\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Layer Group: {0}.\n        /// </summary>\n        internal static string LayerGroup {\n            get {\n                return ResourceManager.GetString(\"LayerGroup\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Layers.\n        /// </summary>\n        internal static string Layers {\n            get {\n                return ResourceManager.GetString(\"Layers\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Lowpass Filter Radius.\n        /// </summary>\n        internal static string LowpassFilterRadius {\n            get {\n                return ResourceManager.GetString(\"LowpassFilterRadius\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Smooths foreground details..\n        /// </summary>\n        internal static string LowpassFilterRadiusDesc {\n            get {\n                return ResourceManager.GetString(\"LowpassFilterRadiusDesc\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Make sure you&apos;ve enough memory!.\n        /// </summary>\n        internal static string MemoryWarningText {\n            get {\n                return ResourceManager.GetString(\"MemoryWarningText\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to NO PATH.\n        /// </summary>\n        internal static string NoPath {\n            get {\n                return ResourceManager.GetString(\"NoPath\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to OK.\n        /// </summary>\n        internal static string OK {\n            get {\n                return ResourceManager.GetString(\"OK\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Element opacity as layer property.\n        /// </summary>\n        internal static string OpacityAsLayerProperty {\n            get {\n                return ResourceManager.GetString(\"OpacityAsLayerProperty\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Optimize.\n        /// </summary>\n        internal static string Optimize {\n            get {\n                return ResourceManager.GetString(\"Optimize\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Try to optimize paths by joining adjacent Bezier curve segments..\n        /// </summary>\n        internal static string OptimizeDesc {\n            get {\n                return ResourceManager.GetString(\"OptimizeDesc\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Paint.NET Shape Export Options.\n        /// </summary>\n        internal static string PdnShapeExportOptions {\n            get {\n                return ResourceManager.GetString(\"PdnShapeExportOptions\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to * Enter a display name for the shape.\n        /// </summary>\n        internal static string PdnShapeExportOptionsDesc {\n            get {\n                return ResourceManager.GetString(\"PdnShapeExportOptionsDesc\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Plugin Version: {0}.\n        /// </summary>\n        internal static string PluginVersion {\n            get {\n                return ResourceManager.GetString(\"PluginVersion\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Preview Mode.\n        /// </summary>\n        internal static string PreviewMode {\n            get {\n                return ResourceManager.GetString(\"PreviewMode\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Fast.\n        /// </summary>\n        internal static string PreviewModeFast {\n            get {\n                return ResourceManager.GetString(\"PreviewModeFast\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Slow.\n        /// </summary>\n        internal static string PreviewModeSlow {\n            get {\n                return ResourceManager.GetString(\"PreviewModeSlow\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Ready!.\n        /// </summary>\n        internal static string Ready {\n            get {\n                return ResourceManager.GetString(\"Ready\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Resolution (DPI).\n        /// </summary>\n        internal static string Resolution {\n            get {\n                return ResourceManager.GetString(\"Resolution\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Scale.\n        /// </summary>\n        internal static string Scale {\n            get {\n                return ResourceManager.GetString(\"Scale\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Scale before threshold.\n        /// </summary>\n        internal static string ScaleBeforeThreshold {\n            get {\n                return ResourceManager.GetString(\"ScaleBeforeThreshold\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Scan Mode.\n        /// </summary>\n        internal static string ScanMode {\n            get {\n                return ResourceManager.GetString(\"ScanMode\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Opaque.\n        /// </summary>\n        internal static string ScanModeOpaque {\n            get {\n                return ResourceManager.GetString(\"ScanModeOpaque\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Transparent.\n        /// </summary>\n        internal static string ScanModeTransparent {\n            get {\n                return ResourceManager.GetString(\"ScanModeTransparent\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Shape.\n        /// </summary>\n        internal static string Shape {\n            get {\n                return ResourceManager.GetString(\"Shape\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The image tracing result is saved as Paint.NET Shape.\n        ///-----\n        ///{0}\n        ///-----.\n        /// </summary>\n        internal static string ShapeSaved {\n            get {\n                return ResourceManager.GetString(\"ShapeSaved\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Success.\n        /// </summary>\n        internal static string ShapeSavedCaption {\n            get {\n                return ResourceManager.GetString(\"ShapeSavedCaption\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to You must restart Paint.NET to use it..\n        /// </summary>\n        internal static string ShapeSavedRestart {\n            get {\n                return ResourceManager.GetString(\"ShapeSavedRestart\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Size selection by user.\n        /// </summary>\n        internal static string SizeSelectionByUser {\n            get {\n                return ResourceManager.GetString(\"SizeSelectionByUser\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Size settings given in SVG file.\n        /// </summary>\n        internal static string SizeSettingsGivenInSvgFile {\n            get {\n                return ResourceManager.GetString(\"SizeSettingsGivenInSvgFile\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Smooth Corners.\n        /// </summary>\n        internal static string SmoothCorners {\n            get {\n                return ResourceManager.GetString(\"SmoothCorners\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Smooth out sharp corners of the trace..\n        /// </summary>\n        internal static string SmoothCornersDesc {\n            get {\n                return ResourceManager.GetString(\"SmoothCornersDesc\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Suppress Speckles.\n        /// </summary>\n        internal static string SuppressSpeckles {\n            get {\n                return ResourceManager.GetString(\"SuppressSpeckles\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Ignore small spots (speckles) in the bitmap..\n        /// </summary>\n        internal static string SuppressSpecklesDesc {\n            get {\n                return ResourceManager.GetString(\"SuppressSpecklesDesc\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Tight.\n        /// </summary>\n        internal static string Tight {\n            get {\n                return ResourceManager.GetString(\"Tight\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Turn Policy.\n        /// </summary>\n        internal static string TurnPolicy {\n            get {\n                return ResourceManager.GetString(\"TurnPolicy\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Black.\n        /// </summary>\n        internal static string TurnPolicyBlack {\n            get {\n                return ResourceManager.GetString(\"TurnPolicyBlack\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Determines how to resolve ambiguities during decomposition of bitmaps into paths..\n        /// </summary>\n        internal static string TurnPolicyDesc {\n            get {\n                return ResourceManager.GetString(\"TurnPolicyDesc\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Left.\n        /// </summary>\n        internal static string TurnPolicyLeft {\n            get {\n                return ResourceManager.GetString(\"TurnPolicyLeft\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Majority.\n        /// </summary>\n        internal static string TurnPolicyMajority {\n            get {\n                return ResourceManager.GetString(\"TurnPolicyMajority\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Minority.\n        /// </summary>\n        internal static string TurnPolicyMinority {\n            get {\n                return ResourceManager.GetString(\"TurnPolicyMinority\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Random.\n        /// </summary>\n        internal static string TurnPolicyRandom {\n            get {\n                return ResourceManager.GetString(\"TurnPolicyRandom\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Right.\n        /// </summary>\n        internal static string TurnPolicyRight {\n            get {\n                return ResourceManager.GetString(\"TurnPolicyRight\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to White.\n        /// </summary>\n        internal static string TurnPolicyWhite {\n            get {\n                return ResourceManager.GetString(\"TurnPolicyWhite\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Untitled.\n        /// </summary>\n        internal static string Untitled {\n            get {\n                return ResourceManager.GetString(\"Untitled\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to ▼ Use size settings given in SVG ▼.\n        /// </summary>\n        internal static string UseSizeSettingsGivenInSvg {\n            get {\n                return ResourceManager.GetString(\"UseSizeSettingsGivenInSvg\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to ViewBox (W×H).\n        /// </summary>\n        internal static string ViewBoxWH {\n            get {\n                return ResourceManager.GetString(\"ViewBoxWH\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to ViewBox (X,Y).\n        /// </summary>\n        internal static string ViewBoxXY {\n            get {\n                return ResourceManager.GetString(\"ViewBoxXY\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Viewport (W×H).\n        /// </summary>\n        internal static string Viewport {\n            get {\n                return ResourceManager.GetString(\"Viewport\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Working....\n        /// </summary>\n        internal static string Working {\n            get {\n                return ResourceManager.GetString(\"Working\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "SvgFileType/Localization/StringResources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"AllElements\" xml:space=\"preserve\">\n    <value>All Elements</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Angle\" xml:space=\"preserve\">\n    <value>Angle</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"AnUpdateIsAvailable\" xml:space=\"preserve\">\n    <value>An update is available!</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"BrightnessCutoff\" xml:space=\"preserve\">\n    <value>Brightness Cutoff</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"BrightnessCutoffDesc\" xml:space=\"preserve\">\n    <value>Detects areas that are darker than the threshold value and creates a path enclosing them.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Cancel\" xml:space=\"preserve\">\n    <value>Cancel</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"CanceledUponYourRequest\" xml:space=\"preserve\">\n    <value>Canceled upon your request.</value>\n    <comment>Generic</comment>\n  </data>\n  <data name=\"Canvas\" xml:space=\"preserve\">\n    <value>Canvas (W×H)</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"CanvasIsTooBig\" xml:space=\"preserve\">\n    <value>Canvas is too big.</value>\n    <comment>Generic</comment>\n  </data>\n  <data name=\"Color\" xml:space=\"preserve\">\n    <value>Color</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"DiscussionLink\" xml:space=\"preserve\">\n    <value>Discussion</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"EdgeDetectionMode\" xml:space=\"preserve\">\n    <value>Edge Detection Mode</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Enclose\" xml:space=\"preserve\">\n    <value>Enclose</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"EndLayerGroup\" xml:space=\"preserve\">\n    <value>End Layer Group: {0}</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"ExportAsPdnShape\" xml:space=\"preserve\">\n    <value>Export as Shape</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"FillColor\" xml:space=\"preserve\">\n    <value>Fill Color</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Flatten\" xml:space=\"preserve\">\n    <value>Flatten</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"GitHubLink\" xml:space=\"preserve\">\n    <value>GitHub</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"GroupBoundaries\" xml:space=\"preserve\">\n    <value>Group boundaries as empty layers</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Groups\" xml:space=\"preserve\">\n    <value>Groups</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"HighpassFilterRadius\" xml:space=\"preserve\">\n    <value>Highpass Filter Radius</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"HighpassFilterRadiusDesc\" xml:space=\"preserve\">\n    <value>Suppresses large-scale irregularities such as background variations, while preserving small-scale detail such as lines.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ImportHiddenElements\" xml:space=\"preserve\">\n    <value>Hidden elements</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Invert\" xml:space=\"preserve\">\n    <value>Invert</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"KeepAspectRatio\" xml:space=\"preserve\">\n    <value>Keep Aspect Ratio</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"LayerGroup\" xml:space=\"preserve\">\n    <value>Layer Group: {0}</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Layers\" xml:space=\"preserve\">\n    <value>Layers</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"LowpassFilterRadius\" xml:space=\"preserve\">\n    <value>Lowpass Filter Radius</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"LowpassFilterRadiusDesc\" xml:space=\"preserve\">\n    <value>Smooths foreground details.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"MemoryWarningText\" xml:space=\"preserve\">\n    <value>Make sure you've enough memory!</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"NoPath\" xml:space=\"preserve\">\n    <value>NO PATH</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"OK\" xml:space=\"preserve\">\n    <value>OK</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"OpacityAsLayerProperty\" xml:space=\"preserve\">\n    <value>Element opacity as layer property</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Optimize\" xml:space=\"preserve\">\n    <value>Optimize</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"OptimizeDesc\" xml:space=\"preserve\">\n    <value>Try to optimize paths by joining adjacent Bezier curve segments.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PdnShapeExportOptions\" xml:space=\"preserve\">\n    <value>Paint.NET Shape Export Options</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PdnShapeExportOptionsDesc\" xml:space=\"preserve\">\n    <value>* Enter a display name for the shape</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PluginVersion\" xml:space=\"preserve\">\n    <value>Plugin Version: {0}</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PreviewMode\" xml:space=\"preserve\">\n    <value>Preview Mode</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PreviewModeFast\" xml:space=\"preserve\">\n    <value>Fast</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PreviewModeSlow\" xml:space=\"preserve\">\n    <value>Slow</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Ready\" xml:space=\"preserve\">\n    <value>Ready!</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Resolution\" xml:space=\"preserve\">\n    <value>Resolution (DPI)</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Scale\" xml:space=\"preserve\">\n    <value>Scale</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ScaleBeforeThreshold\" xml:space=\"preserve\">\n    <value>Scale before threshold</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ScanMode\" xml:space=\"preserve\">\n    <value>Scan Mode</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ScanModeOpaque\" xml:space=\"preserve\">\n    <value>Opaque</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ScanModeTransparent\" xml:space=\"preserve\">\n    <value>Transparent</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Shape\" xml:space=\"preserve\">\n    <value>Shape</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ShapeSaved\" xml:space=\"preserve\">\n    <value>The image tracing result is saved as Paint.NET Shape.\n-----\n{0}\n-----</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ShapeSavedCaption\" xml:space=\"preserve\">\n    <value>Success</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ShapeSavedRestart\" xml:space=\"preserve\">\n    <value>You must restart Paint.NET to use it.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"SizeSelectionByUser\" xml:space=\"preserve\">\n    <value>Size selection by user</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"SizeSettingsGivenInSvgFile\" xml:space=\"preserve\">\n    <value>Size settings given in SVG file</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"SmoothCorners\" xml:space=\"preserve\">\n    <value>Smooth Corners</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"SmoothCornersDesc\" xml:space=\"preserve\">\n    <value>Smooth out sharp corners of the trace.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"SuppressSpeckles\" xml:space=\"preserve\">\n    <value>Suppress Speckles</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"SuppressSpecklesDesc\" xml:space=\"preserve\">\n    <value>Ignore small spots (speckles) in the bitmap.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Tight\" xml:space=\"preserve\">\n    <value>Tight</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicy\" xml:space=\"preserve\">\n    <value>Turn Policy</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyBlack\" xml:space=\"preserve\">\n    <value>Black</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyDesc\" xml:space=\"preserve\">\n    <value>Determines how to resolve ambiguities during decomposition of bitmaps into paths.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyLeft\" xml:space=\"preserve\">\n    <value>Left</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyMajority\" xml:space=\"preserve\">\n    <value>Majority</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyMinority\" xml:space=\"preserve\">\n    <value>Minority</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyRandom\" xml:space=\"preserve\">\n    <value>Random</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyRight\" xml:space=\"preserve\">\n    <value>Right</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyWhite\" xml:space=\"preserve\">\n    <value>White</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Untitled\" xml:space=\"preserve\">\n    <value>Untitled</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"UseSizeSettingsGivenInSvg\" xml:space=\"preserve\">\n    <value>▼ Use size settings given in SVG ▼</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"ViewBoxWH\" xml:space=\"preserve\">\n    <value>ViewBox (W×H)</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"ViewBoxXY\" xml:space=\"preserve\">\n    <value>ViewBox (X,Y)</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Viewport\" xml:space=\"preserve\">\n    <value>Viewport (W×H)</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Working\" xml:space=\"preserve\">\n    <value>Working...</value>\n    <comment>Import</comment>\n  </data>\n</root>"
  },
  {
    "path": "SvgFileType/Localization/StringResources_de.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"AllElements\" xml:space=\"preserve\">\n    <value>Alle Elemente</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Angle\" xml:space=\"preserve\">\n    <value>Winkel</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"AnUpdateIsAvailable\" xml:space=\"preserve\">\n    <value>Ein Update ist verfügbar!</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"BrightnessCutoff\" xml:space=\"preserve\">\n    <value>Helligkeitsabschaltung</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"BrightnessCutoffDesc\" xml:space=\"preserve\">\n    <value>Erkennt Bereiche, die dunkler als der Schwellenwert sind, und erstellt einen Pfad, der sie einschließt.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Cancel\" xml:space=\"preserve\">\n    <value>Abbruch</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"CanceledUponYourRequest\" xml:space=\"preserve\">\n    <value>Auf Ihren Wunsch abgebrochen.</value>\n    <comment>Generic</comment>\n  </data>\n  <data name=\"Canvas\" xml:space=\"preserve\">\n    <value>Leinwand (B×H)</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"CanvasIsTooBig\" xml:space=\"preserve\">\n    <value>Leinwand ist zu groß.</value>\n    <comment>Generic</comment>\n  </data>\n  <data name=\"Color\" xml:space=\"preserve\">\n    <value>Farbe</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"DiscussionLink\" xml:space=\"preserve\">\n    <value>Diskussion</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"EdgeDetectionMode\" xml:space=\"preserve\">\n    <value>Kantenerkennungsmodus</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Enclose\" xml:space=\"preserve\">\n    <value>Einschließen</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"EndLayerGroup\" xml:space=\"preserve\">\n    <value>Ebenengruppe beenden: {0}</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"ExportAsPdnShape\" xml:space=\"preserve\">\n    <value>Exportieren als Form</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"FillColor\" xml:space=\"preserve\">\n    <value>Füllfarbe</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Flatten\" xml:space=\"preserve\">\n    <value>Glätten</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"GitHubLink\" xml:space=\"preserve\">\n    <value>GitHub</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"GroupBoundaries\" xml:space=\"preserve\">\n    <value>Gruppenbegrenzungen als leere Ebenen</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Groups\" xml:space=\"preserve\">\n    <value>Gruppen</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"HighpassFilterRadius\" xml:space=\"preserve\">\n    <value>Radius des Hochpassfilters</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"HighpassFilterRadiusDesc\" xml:space=\"preserve\">\n    <value>Unterdrückt großflächige Unregelmäßigkeiten wie Hintergrundvariationen, während kleinräumige Details wie Linien erhalten bleiben.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ImportHiddenElements\" xml:space=\"preserve\">\n    <value>Versteckte Elemente</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Invert\" xml:space=\"preserve\">\n    <value>Invertieren</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"KeepAspectRatio\" xml:space=\"preserve\">\n    <value>Seitenverhältnis beibehalten</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"LayerGroup\" xml:space=\"preserve\">\n    <value>Ebenengruppen: {0}</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Layers\" xml:space=\"preserve\">\n    <value>Ebenen</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"LowpassFilterRadius\" xml:space=\"preserve\">\n    <value>Radius des Lowpassfilters</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"LowpassFilterRadiusDesc\" xml:space=\"preserve\">\n    <value>Glättet Details im Vordergrund.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"MemoryWarningText\" xml:space=\"preserve\">\n    <value>Stelle sicher, dass genügend Speicherplatz vorhanden ist!</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"NoPath\" xml:space=\"preserve\">\n    <value>KEIN PFAD</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"OK\" xml:space=\"preserve\">\n    <value>OK</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"OpacityAsLayerProperty\" xml:space=\"preserve\">\n    <value>Elementdeckkraft als Ebeneneigenschaft</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Optimize\" xml:space=\"preserve\">\n    <value>Optimieren</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"OptimizeDesc\" xml:space=\"preserve\">\n    <value>Versuche Pfade zu optimieren, indem benachbarte Bezier-Kurvensegmente verbunden werden.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PdnShapeExportOptions\" xml:space=\"preserve\">\n    <value>Paint.NET Form Exporteinstellungen</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PdnShapeExportOptionsDesc\" xml:space=\"preserve\">\n    <value>* Geben Sie einen Anzeigenamen für die Form ein.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PluginVersion\" xml:space=\"preserve\">\n    <value>Plugin Version: {0}</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PreviewMode\" xml:space=\"preserve\">\n    <value>Vorschaumodus</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PreviewModeFast\" xml:space=\"preserve\">\n    <value>Schnell</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PreviewModeSlow\" xml:space=\"preserve\">\n    <value>Langsam</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Ready\" xml:space=\"preserve\">\n    <value>Bereit!</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Resolution\" xml:space=\"preserve\">\n    <value>Auflösung (DPI)</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Scale\" xml:space=\"preserve\">\n    <value>Maßstab</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ScaleBeforeThreshold\" xml:space=\"preserve\">\n    <value>Maßstab vor Schwellenwert</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ScanMode\" xml:space=\"preserve\">\n    <value>Scanmodus</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ScanModeOpaque\" xml:space=\"preserve\">\n    <value>Undurchsichtig</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ScanModeTransparent\" xml:space=\"preserve\">\n    <value>Transparent</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Shape\" xml:space=\"preserve\">\n    <value>Form</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ShapeSaved\" xml:space=\"preserve\">\n    <value>Das Ergebnis der Nachverfolgung wird als Paint.NET Form gespeichert.\n-----\n{0}\n-----</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ShapeSavedCaption\" xml:space=\"preserve\">\n    <value>Erfolg</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ShapeSavedRestart\" xml:space=\"preserve\">\n    <value>Paint.NET muß neu gestartet werden, um es zu verwenden.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"SizeSelectionByUser\" xml:space=\"preserve\">\n    <value>Größenauswahl durch den Benutzer</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"SizeSettingsGivenInSvgFile\" xml:space=\"preserve\">\n    <value>Größeneinstellungen aus der SVG-Datei</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"SmoothCorners\" xml:space=\"preserve\">\n    <value>Kanten glätten</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"SmoothCornersDesc\" xml:space=\"preserve\">\n    <value>Glättet scharfe Kanten einer Kurve.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"SuppressSpeckles\" xml:space=\"preserve\">\n    <value>Flecken unterdrücken</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"SuppressSpecklesDesc\" xml:space=\"preserve\">\n    <value>Kleine Flecken (Sprenkel) in der Bitmap werden ignoriert.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Tight\" xml:space=\"preserve\">\n    <value>Dicht</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicy\" xml:space=\"preserve\">\n    <value>Richtlinie ändern</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyBlack\" xml:space=\"preserve\">\n    <value>Schwarz</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyDesc\" xml:space=\"preserve\">\n    <value>Legt fest, wie Mehrdeutigkeiten bei der Vektorisierung von Bitmaps in Pfade aufgelöst werden sollen.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyLeft\" xml:space=\"preserve\">\n    <value>Links</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyMajority\" xml:space=\"preserve\">\n    <value>Mehrheit</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyMinority\" xml:space=\"preserve\">\n    <value>Minderheit</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyRandom\" xml:space=\"preserve\">\n    <value>Zufällig</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyRight\" xml:space=\"preserve\">\n    <value>Rechts</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyWhite\" xml:space=\"preserve\">\n    <value>Weiss</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Untitled\" xml:space=\"preserve\">\n    <value>Unbenannt</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"UseSizeSettingsGivenInSvg\" xml:space=\"preserve\">\n    <value>▼ Größeneinstellungen aus der SVG-Datei verwenden ▼</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"ViewBoxWH\" xml:space=\"preserve\">\n    <value>ViewBox (B×H)</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"ViewBoxXY\" xml:space=\"preserve\">\n    <value>ViewBox (X,Y)</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Viewport\" xml:space=\"preserve\">\n    <value>Viewport (B×H)</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Working\" xml:space=\"preserve\">\n    <value>Arbeite...</value>\n    <comment>Import</comment>\n  </data>\n</root>"
  },
  {
    "path": "SvgFileType/Localization/StringResources_fr.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"AllElements\" xml:space=\"preserve\">\n    <value>Tous les éléments</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Angle\" xml:space=\"preserve\">\n    <value>Angle</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"AnUpdateIsAvailable\" xml:space=\"preserve\">\n    <value>Une mise à jour est disponible !</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"BrightnessCutoff\" xml:space=\"preserve\">\n    <value>Extinction de la luminosité</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"BrightnessCutoffDesc\" xml:space=\"preserve\">\n    <value>Détecte les zones plus foncées que le seuil et crée un chemin les entourant.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Cancel\" xml:space=\"preserve\">\n    <value>Annuler</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"CanceledUponYourRequest\" xml:space=\"preserve\">\n    <value>Annulée à votre demande.</value>\n    <comment>Generic</comment>\n  </data>\n  <data name=\"Canvas\" xml:space=\"preserve\">\n    <value>Canevas (L × H)</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"CanvasIsTooBig\" xml:space=\"preserve\">\n    <value>Le canevas est trop grand.</value>\n    <comment>Generic</comment>\n  </data>\n  <data name=\"Color\" xml:space=\"preserve\">\n    <value>Couleur</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"DiscussionLink\" xml:space=\"preserve\">\n    <value>Discussion</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"EdgeDetectionMode\" xml:space=\"preserve\">\n    <value>Mode de détection des bords</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Enclose\" xml:space=\"preserve\">\n    <value>Joindre</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"EndLayerGroup\" xml:space=\"preserve\">\n    <value>Groupe de calques finaux : {0}</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"ExportAsPdnShape\" xml:space=\"preserve\">\n    <value>Exporter en tant que forme</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"FillColor\" xml:space=\"preserve\">\n    <value>Couleur de remplissage</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Flatten\" xml:space=\"preserve\">\n    <value>Aplatir</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"GitHubLink\" xml:space=\"preserve\">\n    <value>GitHub</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"GroupBoundaries\" xml:space=\"preserve\">\n    <value>Limites de groupe comme calques vides</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Groups\" xml:space=\"preserve\">\n    <value>Groupes</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"HighpassFilterRadius\" xml:space=\"preserve\">\n    <value>Rayon du filtre passe-haut</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"HighpassFilterRadiusDesc\" xml:space=\"preserve\">\n    <value>Supprime les irrégularités à grande échelle comme les variations d'arrière-plan, tout en préservant les détails à petite échelle comme les lignes.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ImportHiddenElements\" xml:space=\"preserve\">\n    <value>Éléments masqués</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Invert\" xml:space=\"preserve\">\n    <value>Inverser</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"KeepAspectRatio\" xml:space=\"preserve\">\n    <value>Conserver le rapport d'aspect</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"LayerGroup\" xml:space=\"preserve\">\n    <value>Groupe de calques : {0}</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Layers\" xml:space=\"preserve\">\n    <value>Calques</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"LowpassFilterRadius\" xml:space=\"preserve\">\n    <value>Rayon du filtre passe-bas</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"LowpassFilterRadiusDesc\" xml:space=\"preserve\">\n    <value>Adoucit les détails du premier plan.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"MemoryWarningText\" xml:space=\"preserve\">\n    <value>Assurez-vous d'avoir assez de mémoire !</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"NoPath\" xml:space=\"preserve\">\n    <value>AUCUN CHEMIN</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"OK\" xml:space=\"preserve\">\n    <value>OK</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"OpacityAsLayerProperty\" xml:space=\"preserve\">\n    <value>Opacité de l'élément comme propriété de calque</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Optimize\" xml:space=\"preserve\">\n    <value>Optimiser</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"OptimizeDesc\" xml:space=\"preserve\">\n    <value>Tenter d'optimiser les chemins en joignant des segments de courbe de Bézier adjacents.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PdnShapeExportOptions\" xml:space=\"preserve\">\n    <value>Options d'exportation de formes Paint.NET</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PdnShapeExportOptionsDesc\" xml:space=\"preserve\">\n    <value>* Entrez un nom d'affichage pour la forme</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PluginVersion\" xml:space=\"preserve\">\n    <value>Version du plug-in : {0}</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PreviewMode\" xml:space=\"preserve\">\n    <value>Mode aperçu</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PreviewModeFast\" xml:space=\"preserve\">\n    <value>Rapide</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PreviewModeSlow\" xml:space=\"preserve\">\n    <value>Lent</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Ready\" xml:space=\"preserve\">\n    <value>Prêt !</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Resolution\" xml:space=\"preserve\">\n    <value>Résolution (DPI)</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Scale\" xml:space=\"preserve\">\n    <value>Échelle</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ScaleBeforeThreshold\" xml:space=\"preserve\">\n    <value>Échelle avant le seuil</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ScanMode\" xml:space=\"preserve\">\n    <value>Mode de numérisation</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ScanModeOpaque\" xml:space=\"preserve\">\n    <value>Opaque</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ScanModeTransparent\" xml:space=\"preserve\">\n    <value>Transparent</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Shape\" xml:space=\"preserve\">\n    <value>Forme</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ShapeSaved\" xml:space=\"preserve\">\n    <value>Le résultat du traçage de l'image est enregistré en tant que Forme Paint.NET.\n-----\n{0}\n-----</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ShapeSavedCaption\" xml:space=\"preserve\">\n    <value>Réussi</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ShapeSavedRestart\" xml:space=\"preserve\">\n    <value>Vous devez redémarrer Paint.NET pour l'utiliser.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"SizeSelectionByUser\" xml:space=\"preserve\">\n    <value>Sélection de la taille par l'utilisateur</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"SizeSettingsGivenInSvgFile\" xml:space=\"preserve\">\n    <value>Paramètres de taille indiqués dans le fichier SVG</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"SmoothCorners\" xml:space=\"preserve\">\n    <value>Lisser les coins</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"SmoothCornersDesc\" xml:space=\"preserve\">\n    <value>Lisser les angles pointus du traçage.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"SuppressSpeckles\" xml:space=\"preserve\">\n    <value>Enlever les salissures</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"SuppressSpecklesDesc\" xml:space=\"preserve\">\n    <value>Ignorer les petites taches (salissures) dans l'image bitmap.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Tight\" xml:space=\"preserve\">\n    <value>Resserrer</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicy\" xml:space=\"preserve\">\n    <value>Stratégie de direction</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyBlack\" xml:space=\"preserve\">\n    <value>Noir</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyDesc\" xml:space=\"preserve\">\n    <value>Détermine comment résoudre les ambiguïtés lors de la décomposition des bitmaps en chemins.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyLeft\" xml:space=\"preserve\">\n    <value>Gauche</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyMajority\" xml:space=\"preserve\">\n    <value>Majorité</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyMinority\" xml:space=\"preserve\">\n    <value>Minorité</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyRandom\" xml:space=\"preserve\">\n    <value>Aléatoire</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyRight\" xml:space=\"preserve\">\n    <value>Droite</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyWhite\" xml:space=\"preserve\">\n    <value>Blanc</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Untitled\" xml:space=\"preserve\">\n    <value>Sans titre</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"UseSizeSettingsGivenInSvg\" xml:space=\"preserve\">\n    <value>▼ Utiliser les paramètres de taille dans le SVG ▼</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"ViewBoxWH\" xml:space=\"preserve\">\n    <value>ViewBox (L x H)</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"ViewBoxXY\" xml:space=\"preserve\">\n    <value>ViewBox (X, Y)</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Viewport\" xml:space=\"preserve\">\n    <value>Viewport (L x H)</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Working\" xml:space=\"preserve\">\n    <value>Traitement en cours…</value>\n    <comment>Import</comment>\n  </data>\n</root>\n"
  },
  {
    "path": "SvgFileType/Localization/StringResources_ru.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"AllElements\" xml:space=\"preserve\">\n    <value>Все элементы</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Angle\" xml:space=\"preserve\">\n    <value>Угол</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"AnUpdateIsAvailable\" xml:space=\"preserve\">\n    <value>Доступно обновление!</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"BrightnessCutoff\" xml:space=\"preserve\">\n    <value>Порог яркости</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"BrightnessCutoffDesc\" xml:space=\"preserve\">\n    <value>Обнаруживает области, темнее порогового значения, и создаёт путь, их охватывающий.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Cancel\" xml:space=\"preserve\">\n    <value>Отмена</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"CanceledUponYourRequest\" xml:space=\"preserve\">\n    <value>Отменено по вашему запросу.</value>\n    <comment>Generic</comment>\n  </data>\n  <data name=\"Canvas\" xml:space=\"preserve\">\n    <value>Холст (Ш×В)</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"CanvasIsTooBig\" xml:space=\"preserve\">\n    <value>Холст слишком большой.</value>\n    <comment>Generic</comment>\n  </data>\n  <data name=\"Color\" xml:space=\"preserve\">\n    <value>Цвет</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"DiscussionLink\" xml:space=\"preserve\">\n    <value>Обсуждение</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"EdgeDetectionMode\" xml:space=\"preserve\">\n    <value>Режим обнаружения границ</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Enclose\" xml:space=\"preserve\">\n    <value>Охватить</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"EndLayerGroup\" xml:space=\"preserve\">\n    <value>Конец группы слоёв: {0}</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"ExportAsPdnShape\" xml:space=\"preserve\">\n    <value>Экспорт как форму</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"FillColor\" xml:space=\"preserve\">\n    <value>Цвет заливки</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Flatten\" xml:space=\"preserve\">\n    <value>Сплющить</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"GitHubLink\" xml:space=\"preserve\">\n    <value>GitHub</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"GroupBoundaries\" xml:space=\"preserve\">\n    <value>Группировать границы как пустые слои</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Groups\" xml:space=\"preserve\">\n    <value>Группы</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"HighpassFilterRadius\" xml:space=\"preserve\">\n    <value>Радиус высокочастотного фильтра</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"HighpassFilterRadiusDesc\" xml:space=\"preserve\">\n    <value>Подавляет крупномасштабные искажения, такие как фоновая неоднородность, сохраняя мелкие детали, например линии.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ImportHiddenElements\" xml:space=\"preserve\">\n    <value>Скрытые элементы</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Invert\" xml:space=\"preserve\">\n    <value>Инвертировать</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"KeepAspectRatio\" xml:space=\"preserve\">\n    <value>Сохранять пропорции</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"LayerGroup\" xml:space=\"preserve\">\n    <value>Группа слоёв: {0}</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Layers\" xml:space=\"preserve\">\n    <value>Слои</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"LowpassFilterRadius\" xml:space=\"preserve\">\n    <value>Радиус низкочастотного фильтра</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"LowpassFilterRadiusDesc\" xml:space=\"preserve\">\n    <value>Сглаживает детали переднего плана.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"MemoryWarningText\" xml:space=\"preserve\">\n    <value>Убедитесь, что у вас достаточно памяти!</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"NoPath\" xml:space=\"preserve\">\n    <value>НЕТ ПУТИ</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"OK\" xml:space=\"preserve\">\n    <value>ОК</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"OpacityAsLayerProperty\" xml:space=\"preserve\">\n    <value>Прозрачность элемента как свойство слоя</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Optimize\" xml:space=\"preserve\">\n    <value>Оптимизировать</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"OptimizeDesc\" xml:space=\"preserve\">\n    <value>Пробует оптимизировать пути, объединяя соседние сегменты кривых Безье.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PdnShapeExportOptions\" xml:space=\"preserve\">\n    <value>Параметры экспорта формы Paint.NET</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PdnShapeExportOptionsDesc\" xml:space=\"preserve\">\n    <value>* Введите отображаемое имя для формы</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PluginVersion\" xml:space=\"preserve\">\n    <value>Версия плагина: {0}</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PreviewMode\" xml:space=\"preserve\">\n    <value>Режим предпросмотра</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PreviewModeFast\" xml:space=\"preserve\">\n    <value>Быстрый</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PreviewModeSlow\" xml:space=\"preserve\">\n    <value>Медленный</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Ready\" xml:space=\"preserve\">\n    <value>Готово!</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Resolution\" xml:space=\"preserve\">\n    <value>Разрешение (DPI)</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Scale\" xml:space=\"preserve\">\n    <value>Масштаб</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ScaleBeforeThreshold\" xml:space=\"preserve\">\n    <value>Масштабировать до применения порога</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ScanMode\" xml:space=\"preserve\">\n    <value>Режим сканирования</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ScanModeOpaque\" xml:space=\"preserve\">\n    <value>Непрозрачный</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ScanModeTransparent\" xml:space=\"preserve\">\n    <value>Прозрачный</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Shape\" xml:space=\"preserve\">\n    <value>Форма</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ShapeSaved\" xml:space=\"preserve\">\n    <value>Результат трассировки изображения сохранён как форма Paint.NET.\n  -----\n  {0}\n  -----</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ShapeSavedCaption\" xml:space=\"preserve\">\n    <value>Успех</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ShapeSavedRestart\" xml:space=\"preserve\">\n    <value>Для использования необходимо перезапустить Paint.NET.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"SizeSelectionByUser\" xml:space=\"preserve\">\n    <value>Выбор размера пользователем</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"SizeSettingsGivenInSvgFile\" xml:space=\"preserve\">\n    <value>Параметры размера указаны в файле SVG</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"SmoothCorners\" xml:space=\"preserve\">\n    <value>Сглаживание углов</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"SmoothCornersDesc\" xml:space=\"preserve\">\n    <value>Сглаживает резкие углы трассировки.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"SuppressSpeckles\" xml:space=\"preserve\">\n    <value>Подавление пятен</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"SuppressSpecklesDesc\" xml:space=\"preserve\">\n    <value>Игнорирует мелкие пятна (помехи) на изображении.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Tight\" xml:space=\"preserve\">\n    <value>Плотно</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicy\" xml:space=\"preserve\">\n    <value>Политика поворота</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyBlack\" xml:space=\"preserve\">\n    <value>Чёрный</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyDesc\" xml:space=\"preserve\">\n    <value>Определяет, как разрешать неоднозначности при разложении битмапов на пути.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyLeft\" xml:space=\"preserve\">\n    <value>Влево</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyMajority\" xml:space=\"preserve\">\n    <value>Большинство</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyMinority\" xml:space=\"preserve\">\n    <value>Меньшинство</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyRandom\" xml:space=\"preserve\">\n    <value>Случайно</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyRight\" xml:space=\"preserve\">\n    <value>Вправо</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyWhite\" xml:space=\"preserve\">\n    <value>Белый</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Untitled\" xml:space=\"preserve\">\n    <value>Без названия</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"UseSizeSettingsGivenInSvg\" xml:space=\"preserve\">\n    <value>▼ Использовать параметры размера из SVG ▼</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"ViewBoxWH\" xml:space=\"preserve\">\n    <value>ViewBox (Ш×В)</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"ViewBoxXY\" xml:space=\"preserve\">\n    <value>ViewBox (X,Y)</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Viewport\" xml:space=\"preserve\">\n    <value>Область просмотра (Ш×В)</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Working\" xml:space=\"preserve\">\n    <value>Обработка...</value>\n    <comment>Import</comment>\n  </data>\n</root>"
  },
  {
    "path": "SvgFileType/Localization/StringResources_tr.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"AllElements\" xml:space=\"preserve\">\n    <value>Tüm Öğeler</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Angle\" xml:space=\"preserve\">\n    <value>Döndür</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"AnUpdateIsAvailable\" xml:space=\"preserve\">\n    <value>Bir güncelleme mevcut!</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"BrightnessCutoff\" xml:space=\"preserve\">\n    <value>Parlaklık Kesme</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"BrightnessCutoffDesc\" xml:space=\"preserve\">\n    <value>Eşik değerinden daha koyu olan alanları algılar ve onları çevreleyen bir yol oluşturur.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Cancel\" xml:space=\"preserve\">\n    <value>İptal</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"CanceledUponYourRequest\" xml:space=\"preserve\">\n    <value>Talebiniz üzerine iptal edildi.</value>\n    <comment>Generic</comment>\n  </data>\n  <data name=\"Canvas\" xml:space=\"preserve\">\n    <value>Tuval (G×Y)</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"CanvasIsTooBig\" xml:space=\"preserve\">\n    <value>Tuval çok büyük.</value>\n    <comment>Generic</comment>\n  </data>\n  <data name=\"Color\" xml:space=\"preserve\">\n    <value>Renk</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"DiscussionLink\" xml:space=\"preserve\">\n    <value>Tartışma</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"EdgeDetectionMode\" xml:space=\"preserve\">\n    <value>Kenar Algılama Modu</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Enclose\" xml:space=\"preserve\">\n    <value>Çevrele</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"EndLayerGroup\" xml:space=\"preserve\">\n    <value>Bitiş Katman Grubu: {0}</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"ExportAsPdnShape\" xml:space=\"preserve\">\n    <value>Şekil olarak kaydet</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"FillColor\" xml:space=\"preserve\">\n    <value>Dolgu Rengi</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Flatten\" xml:space=\"preserve\">\n    <value>Düzleştirilmiş</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"GitHubLink\" xml:space=\"preserve\">\n    <value>GitHub</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"GroupBoundaries\" xml:space=\"preserve\">\n    <value>Grup sınırlarını boş katman olarak içe aktar</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Groups\" xml:space=\"preserve\">\n    <value>Gruplar</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"HighpassFilterRadius\" xml:space=\"preserve\">\n    <value>Yüksek Geçiş</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"HighpassFilterRadiusDesc\" xml:space=\"preserve\">\n    <value>Arka plan varyasyonları gibi büyük ölçekli düzensizlikleri bastırırken çizgiler gibi küçük ölçekli ayrıntıları korur.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ImportHiddenElements\" xml:space=\"preserve\">\n    <value>Gizli elementler</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Invert\" xml:space=\"preserve\">\n    <value>Ters çevir</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"KeepAspectRatio\" xml:space=\"preserve\">\n    <value>En-boy oranını koru</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"LayerGroup\" xml:space=\"preserve\">\n    <value>Başlangıç Katman Grubu: {0}</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Layers\" xml:space=\"preserve\">\n    <value>Katmanlar</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"LowpassFilterRadius\" xml:space=\"preserve\">\n    <value>Düşük Geçiş</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"LowpassFilterRadiusDesc\" xml:space=\"preserve\">\n    <value>Ön plan ayrıntılarını yumuşatır.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"MemoryWarningText\" xml:space=\"preserve\">\n    <value>Yeterli miktarda kullanılabilir bellek olduğundan emin olunuz!</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"NoPath\" xml:space=\"preserve\">\n    <value>YOL YOK</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"OK\" xml:space=\"preserve\">\n    <value>TAMAM</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"OpacityAsLayerProperty\" xml:space=\"preserve\">\n    <value>Element saydamlığı katman niteliği olarak</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Optimize\" xml:space=\"preserve\">\n    <value>Optimize et</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"OptimizeDesc\" xml:space=\"preserve\">\n    <value>Bitişik Bezier eğrilerini birleştirerek yolları optimize etmeye çalışır.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PdnShapeExportOptions\" xml:space=\"preserve\">\n    <value>Paint.NET Şekil Dışa Aktarma Seçenekleri</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PdnShapeExportOptionsDesc\" xml:space=\"preserve\">\n    <value>* Şekil için bir isim giriniz</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PluginVersion\" xml:space=\"preserve\">\n    <value>Eklenti Sürümü: {0}</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PreviewMode\" xml:space=\"preserve\">\n    <value>Önizleme Modu</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PreviewModeFast\" xml:space=\"preserve\">\n    <value>Hızlı</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"PreviewModeSlow\" xml:space=\"preserve\">\n    <value>Yavaş</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Ready\" xml:space=\"preserve\">\n    <value>Hazır</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Resolution\" xml:space=\"preserve\">\n    <value>Çözünürlük (DPI)</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Scale\" xml:space=\"preserve\">\n    <value>Ölçekle</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ScaleBeforeThreshold\" xml:space=\"preserve\">\n    <value>Eşikten önce ölçeklendir</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ScanMode\" xml:space=\"preserve\">\n    <value>Tarama Modu</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ScanModeOpaque\" xml:space=\"preserve\">\n    <value>Opak</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ScanModeTransparent\" xml:space=\"preserve\">\n    <value>Saydam</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Shape\" xml:space=\"preserve\">\n    <value>Şekil</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ShapeSaved\" xml:space=\"preserve\">\n    <value>Resim taraması Paint.NET Şekli olarak kaydedildi.\n-----\n{0}\n-----</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ShapeSavedCaption\" xml:space=\"preserve\">\n    <value>Başarılı</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"ShapeSavedRestart\" xml:space=\"preserve\">\n    <value>Kullanmak için Paint.NET'i yeniden başlatmalısınız.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"SizeSelectionByUser\" xml:space=\"preserve\">\n    <value>Kullanıcı tarafından istenen boyutlar</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"SizeSettingsGivenInSvgFile\" xml:space=\"preserve\">\n    <value>SVG dosyasında belirtilen boyut değerleri</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"SmoothCorners\" xml:space=\"preserve\">\n    <value>Pürüzsüz Köşeler</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"SmoothCornersDesc\" xml:space=\"preserve\">\n    <value>Keskin köşeleri yumuşatır.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"SuppressSpeckles\" xml:space=\"preserve\">\n    <value>Benekleri Yoksay</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"SuppressSpecklesDesc\" xml:space=\"preserve\">\n    <value>Biteşlemdeki küçük noktaları (benekleri) yoksay.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Tight\" xml:space=\"preserve\">\n    <value>Sıkı</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicy\" xml:space=\"preserve\">\n    <value>Dönüş Politikası</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyBlack\" xml:space=\"preserve\">\n    <value>Siyah</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyDesc\" xml:space=\"preserve\">\n    <value>Bit eşlemlerin yollara ayrıştırılması sırasında belirsizliklerin nasıl çözüleceğini belirler.</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyLeft\" xml:space=\"preserve\">\n    <value>Sol</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyMajority\" xml:space=\"preserve\">\n    <value>Çoğunluk</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyMinority\" xml:space=\"preserve\">\n    <value>Azınlık</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyRandom\" xml:space=\"preserve\">\n    <value>Rastgele</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyRight\" xml:space=\"preserve\">\n    <value>Sağ</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"TurnPolicyWhite\" xml:space=\"preserve\">\n    <value>Beyaz</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"Untitled\" xml:space=\"preserve\">\n    <value>İsimsiz</value>\n    <comment>Export</comment>\n  </data>\n  <data name=\"UseSizeSettingsGivenInSvg\" xml:space=\"preserve\">\n    <value>▼ SVG'de belirtilen boyut değerlerini kullan ▼</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"ViewBoxWH\" xml:space=\"preserve\">\n    <value>ViewBox (G×Y)</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Viewport\" xml:space=\"preserve\">\n    <value>Viewport (G×Y)</value>\n    <comment>Import</comment>\n  </data>\n  <data name=\"Working\" xml:space=\"preserve\">\n    <value>Çalışıyor...</value>\n    <comment>Import</comment>\n  </data>\n</root>"
  },
  {
    "path": "SvgFileType/Logger.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing System.Diagnostics;\n\nnamespace SvgFileTypePlugin;\n\ninternal static class Logger\n{\n    private const string Category = $\"[{nameof(SvgFileTypePlugin)}]\";\n\n    public static void WriteLine(string message)\n    {\n        Trace.WriteLine(message, Category);\n    }\n\n    public static void WriteLineIf(bool condition, string message)\n    {\n        Trace.WriteLineIf(condition, message, Category);\n    }\n}\n"
  },
  {
    "path": "SvgFileType/Services.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing System;\nusing PaintDotNet;\n\nnamespace SvgFileTypePlugin;\n\ninternal static class Services\n{\n    private static IServiceProvider? Provider;\n\n    public static void Init(IServiceProvider provider)\n    {\n        ArgumentNullException.ThrowIfNull(provider);\n\n        Provider = provider;\n    }\n\n    public static TService Get<TService>() where TService : class\n    {\n        if (Provider is null)\n        {\n            throw new InvalidOperationException(\"No service provider has been configured. Call Init(IServiceProvider) first.\");\n        }\n\n        TService? service = Provider.GetService<TService>();\n        return service ?? throw new InvalidOperationException($\"Cannot find the service: '{typeof(TService)}'\");\n    }\n}\n"
  },
  {
    "path": "SvgFileType/SvgFileType.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing System;\nusing System.IO;\nusing System.Threading;\nusing BitmapVectorizer;\nusing PaintDotNet;\nusing PaintDotNet.IndirectUI;\nusing PaintDotNet.IndirectUI.Extensions;\nusing PaintDotNet.PropertySystem;\nusing SvgFileTypePlugin.Export;\nusing SvgFileTypePlugin.Import;\nusing SvgFileTypePlugin.Localization;\nusing SR = SvgFileTypePlugin.Localization.StringResources;\n\nnamespace SvgFileTypePlugin;\n\n[PluginSupportInfo(typeof(SvgFileTypePluginSupportInfo))]\npublic sealed class SvgFileType() : PropertyBasedFileType(\"SVG Plugin\", BaseOptions)\n{\n    private string shapePath = string.Empty;\n\n    #region OnLoad\n\n    protected override Document OnLoad(Stream input)\n    {\n        return SvgImport.Load(input);\n    }\n\n    #endregion\n\n    #region OnSave\n\n    protected override void OnSaveT(Document input, Stream output, PropertyBasedSaveConfigToken token, Surface scratchSurface, ProgressEventHandler progressCallback)\n    {\n        SvgExport.Export(input, output, token, scratchSurface, progressCallback, Interlocked.Exchange(ref shapePath, string.Empty));\n    }\n\n    private void PdnShape_Click(object? sender, ValueEventArgs<object> args)\n    {\n        if ((int)args.Value != int.MinValue)\n        {\n            Interlocked.Exchange(ref shapePath, SvgExport.ShowSaveShapeDialog() ?? string.Empty);\n        }\n    }\n\n    public override ControlInfo OnCreateSaveConfigUI(PropertyCollection props)\n    {\n        ArgumentNullException.ThrowIfNull(props);\n\n        PropertyControlInfo CommonSettingsF(PropertyControlInfo p)\n            => p.SliderSmallChange(.01).SliderLargeChange(.01).UpDownIncrement(.01).DecimalPlaces(2).ShowResetButton();\n\n        PropertyControlInfo CommonSettings(PropertyControlInfo p)\n            => p.SliderSmallChange(1).SliderLargeChange(1).UpDownIncrement(1).ShowResetButton();\n\n        PropertyControlInfoCollection pcic = new PropertyControlInfoCollection(props);\n        pcic.Configure(PropertyNames.ScanMode, SR.ScanMode, p => p\n                 .ValueDisplayNameCallback<ScanMode>(Localize.GetDisplayName))\n            .Configure(PropertyNames.PreviewMode, SR.PreviewMode, p => p\n                .ValueDisplayNameCallback<PreviewMode>(Localize.GetDisplayName))\n            .Configure(PropertyNames.PdnShapeName, SR.PdnShapeExportOptions, SR.PdnShapeExportOptionsDesc)\n            .Configure(PropertyNames.PdnShape, string.Empty, p => p\n                .ControlType(PropertyControlType.IncrementButton)\n                .ButtonText(SR.ExportAsPdnShape)\n                .OnValueChanged(PdnShape_Click))\n            .Configure(PropertyNames.BrightnessCutoff, SR.BrightnessCutoff, SR.BrightnessCutoffDesc, CommonSettingsF)\n            .Configure(PropertyNames.HighpassFilter, SR.HighpassFilterRadius, SR.HighpassFilterRadiusDesc, CommonSettings)\n            .Configure(PropertyNames.GreymapScale, SR.ScaleBeforeThreshold, CommonSettings)\n            .Configure(PropertyNames.LowpassFilter, SR.LowpassFilterRadius, SR.LowpassFilterRadiusDesc, CommonSettings)\n            .Configure(PropertyNames.SuppressSpeckles, SR.SuppressSpeckles, SR.SuppressSpecklesDesc, CommonSettings)\n            .Configure(PropertyNames.SmoothCorners, SR.SmoothCorners, SR.SmoothCornersDesc, CommonSettingsF)\n            .Configure(PropertyNames.Optimize, SR.Optimize, SR.OptimizeDesc, p => p\n                .ShowResetButton())\n            .Configure(PropertyNames.TurnPolicy, SR.TurnPolicy, SR.TurnPolicyDesc, p => p\n                .ValueDisplayNameCallback<TurnPolicy>(Localize.GetDisplayName))\n            .Configure(PropertyNames.Color, SR.Color, p => p\n                .ControlType(PropertyControlType.ColorWheel)\n                .ShowResetButton())\n            .Configure(PropertyNames.FillColor, SR.FillColor, p => p\n                .ControlType(PropertyControlType.ColorWheel)\n                .ShowResetButton())\n            .Configure(PropertyNames.Invert, string.Empty, SR.Invert)\n            .Configure(PropertyNames.Tight, string.Empty, SR.Tight)\n            .Configure(PropertyNames.Enclose, string.Empty, SR.Enclose)\n            .Configure(PropertyNames.Scale, SR.Scale, CommonSettingsF)\n            .Configure(PropertyNames.Angle, SR.Angle, p => p\n                .ControlType(PropertyControlType.AngleChooser)\n                .ShowResetButton())\n            .Configure(PropertyNames.GitHubLink, string.Format(SR.PluginVersion, SvgFileTypePluginSupportInfo.Instance.Version), SR.GitHubLink)\n            .Configure(PropertyNames.DiscussionLink, string.Empty, SR.DiscussionLink);\n        PanelControlInfo panel = pcic.CreatePanel();\n        return panel;\n    }\n\n    public override PropertyCollection OnCreateSavePropertyCollection()\n    {\n        PropertyName[] targets1 =\n        [\n            PropertyNames.PdnShape, \n            PropertyNames.PdnShapeName \n        ];\n\n        PropertyName[] targets2 =\n        [\n            PropertyNames.LowpassFilter,\n            PropertyNames.GreymapScale\n        ];\n\n        FluentPropertyCollection properties = new FluentPropertyCollection()\n            .AddStaticListChoice(PropertyNames.ScanMode, ScanMode.Transparent)\n            .AddStaticListChoice(PropertyNames.PreviewMode, PreviewMode.Fast)\n            .AddString(PropertyNames.PdnShapeName, SR.Untitled)\n            .AddInt32(PropertyNames.PdnShape, int.MinValue)\n            .AddDouble(PropertyNames.BrightnessCutoff, 0.45, 0.01, 1)\n            .AddInt32(PropertyNames.HighpassFilter, 0, 0, 5)\n            .AddInt32(PropertyNames.GreymapScale, 1, 1, 4)\n            .AddInt32(PropertyNames.LowpassFilter, 0, 0, 5)\n            .AddInt32(PropertyNames.SuppressSpeckles, PotraceBitmap.TurdSizeDef, PotraceBitmap.TurdSizeMin, PotraceBitmap.TurdSizeMax)\n            .AddDouble(PropertyNames.SmoothCorners, Potrace.AlphaMaxDef, Potrace.AlphaMaxMin, Potrace.AlphaMaxMax)\n            .AddDouble(PropertyNames.Optimize, Potrace.OptToleranceDef, Potrace.OptToleranceMin, Potrace.OptToleranceMax)\n            .AddStaticListChoice(PropertyNames.TurnPolicy, TurnPolicy.Minority)\n            .AddInt32(PropertyNames.Color, ColorBgra.Black)\n            .AddInt32(PropertyNames.FillColor, ColorBgra.White)\n            .AddBoolean(PropertyNames.Invert)\n            .AddBoolean(PropertyNames.Tight)\n            .AddBoolean(PropertyNames.Enclose)\n            .AddDouble(PropertyNames.Scale, 1, 0.01, 4)\n            .AddDouble(PropertyNames.Angle, 0, 0, 360)\n            .AddUri(PropertyNames.GitHubLink, SvgFileTypePluginSupportInfo.Instance.WebsiteUri)\n            .AddUri(PropertyNames.DiscussionLink, SvgFileTypePluginSupportInfo.Instance.ForumUri)\n            .WithReadOnlyRule(targets1, PropertyNames.ScanMode, ScanMode.Transparent, inverse: true)\n            .WithReadOnlyRule(targets2, PropertyNames.HighpassFilter, 0)\n            .WithReadOnlyRule(PropertyNames.FillColor, PropertyNames.ScanMode, ScanMode.Opaque, inverse: true);\n        return properties;\n    }\n\n    protected override bool ShouldSerializeTokenProperty(Property property)\n    {\n        return IsSerializable(property);\n    }\n\n    #endregion\n\n    #region Static Private\n\n    private static readonly FileTypeOptions BaseOptions = new()\n    {\n        LoadExtensions = [\".svg\", \".svgz\"],\n        SupportsCancellation = true,\n        SupportsLayers = false,\n        SaveExtensions = [\".svg\"]\n    };\n\n    private static bool IsSerializable(Property property)\n    {\n        return Enum.TryParse(property.Name, out PropertyNames prop)\n            && prop is not PropertyNames.GitHubLink\n            and not PropertyNames.DiscussionLink\n            and not PropertyNames.PdnShape\n            and not PropertyNames.PdnShapeName\n            and not PropertyNames.PreviewMode;\n    }\n\n    #endregion\n}\n"
  },
  {
    "path": "SvgFileType/SvgFileTypeFactory.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing System;\nusing PaintDotNet;\n\nnamespace SvgFileTypePlugin;\n\npublic sealed class SvgFileTypeFactory : IFileTypeFactory2\n{\n    public FileType[] GetFileTypeInstances(IFileTypeHost host)\n    {\n        ArgumentNullException.ThrowIfNull(host);\n\n        Services.Init(host.Services);\n        return [new SvgFileType()];\n    }\n}\n"
  },
  {
    "path": "SvgFileType/SvgFileTypePlugin.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk.WindowsDesktop\">\n\n  <PropertyGroup>\n    <TargetFrameworks>net9.0-windows</TargetFrameworks>\n    <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>\n    <DefineConstants>TRACE;</DefineConstants>\n    <NoWarn>FodyPackageReference;MSB3277</NoWarn>\n    <Nullable>enable</Nullable>\n    <OutputType>Library</OutputType>\n    <ProduceReferenceAssembly>false</ProduceReferenceAssembly>\n    <RootNamespace>SvgFileTypePlugin</RootNamespace>\n    <UseWindowsForms>true</UseWindowsForms>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n  <PropertyGroup Label=\"AssemblyInfo\" Condition=\"'$(GenerateAssemblyInfo)'=='true' Or '$(GenerateAssemblyInfo)'==''\">\n    <AssemblyName>SvgFileType</AssemblyName>\n    <AssemblyTitle>SVG File Type Plugin for Paint.NET</AssemblyTitle>\n    <Copyright>Copyright © 2025 Osman Tunçelli</Copyright>\n    <Company>$(Copyright)</Company>\n    <Product>$(AssemblyTitle)</Product>\n    <Version>1.0.7.3</Version>\n  </PropertyGroup>\n\n  <PropertyGroup Label=\"Base Variables\">\n    <PluginType>FileType</PluginType>\n    <PdnRoot>C:\\Program Files\\paint.net</PdnRoot>\n    <PluginDir>$(USERPROFILE)\\Documents\\paint.net App Files\\$(PluginType)s\\$(RootNamespace)\\</PluginDir>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Reference Include=\"PaintDotNet.Base\">\n      <Private>false</Private>\n      <HintPath>$(PdnRoot)\\PaintDotNet.Base.dll</HintPath>\n    </Reference>\n    <Reference Include=\"PaintDotNet.Core\">\n      <Private>false</Private>\n      <HintPath>$(PdnRoot)\\PaintDotNet.Core.dll</HintPath>\n    </Reference>\n    <Reference Include=\"PaintDotNet.Data\">\n      <Private>false</Private>\n      <HintPath>$(PdnRoot)\\PaintDotNet.Data.dll</HintPath>\n    </Reference>\n    <Reference Include=\"PaintDotNet.Effects\">\n      <Private>false</Private>\n      <HintPath>$(PdnRoot)\\PaintDotNet.Effects.dll</HintPath>\n    </Reference>\n    <Reference Include=\"PaintDotNet.PropertySystem\">\n      <Private>false</Private>\n      <HintPath>$(PdnRoot)\\PaintDotNet.PropertySystem.dll</HintPath>\n    </Reference>\n    <Reference Include=\"PaintDotNet.ComponentModel\">\n      <Private>false</Private>\n      <HintPath>$(PdnRoot)\\PaintDotNet.ComponentModel.dll</HintPath>\n    </Reference>\n    <Reference Include=\"PaintDotNet.Fundamentals\">\n      <Private>false</Private>\n      <HintPath>$(PdnRoot)\\PaintDotNet.Fundamentals.dll</HintPath>\n    </Reference>\n    <Reference Include=\"PaintDotNet.ObjectModel\">\n      <Private>false</Private>\n      <HintPath>$(PdnRoot)\\PaintDotNet.ObjectModel.dll</HintPath>\n    </Reference>\n    <Reference Include=\"PaintDotNet.Primitives\">\n      <Private>false</Private>\n      <HintPath>$(PdnRoot)\\PaintDotNet.Primitives.dll</HintPath>\n    </Reference>\n    <Reference Include=\"PaintDotNet.PropertySystem\">\n      <Private>false</Private>\n      <HintPath>$(PdnRoot)\\PaintDotNet.PropertySystem.dll</HintPath>\n    </Reference>\n    <Reference Include=\"PaintDotNet.Windows\">\n      <Private>false</Private>\n      <HintPath>$(PdnRoot)\\PaintDotNet.Windows.dll</HintPath>\n    </Reference>\n    <Reference Include=\"PaintDotNet.Windows.Core\">\n      <Private>false</Private>\n      <HintPath>$(PdnRoot)\\PaintDotNet.Windows.Core.dll</HintPath>\n    </Reference>\n    <Reference Include=\"PaintDotNet.Windows.Framework\">\n      <Private>false</Private>\n      <HintPath>$(PdnRoot)\\PaintDotNet.Windows.Framework.dll</HintPath>\n    </Reference>\n    <Reference Include=\"PaintDotNet.Effects.Core\">\n      <Private>false</Private>\n      <HintPath>$(PdnRoot)\\PaintDotNet.Effects.Core.dll</HintPath>\n    </Reference>\n    <Reference Include=\"PaintDotNet.Effects.Gpu\">\n      <Private>false</Private>\n      <HintPath>$(PdnRoot)\\PaintDotNet.Effects.Gpu.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Svg\" Version=\"3.4.7\" />\n    <Compile Update=\"Import\\SvgImportDialog.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Update=\"Localization\\StringResources.Designer.cs\">\n      <DesignTime>True</DesignTime>\n      <AutoGen>True</AutoGen>\n      <DependentUpon>StringResources.resx</DependentUpon>\n    </Compile>\n    <EmbeddedResource Update=\"Import\\SvgImportDialog.resx\">\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Update=\"Localization\\StringResources.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>StringResources.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n    <EmbeddedResource Update=\"Localization\\StringResources_de.resx\">\n      <Generator></Generator>\n    </EmbeddedResource>\n    <EmbeddedResource Update=\"Localization\\StringResources_fr.resx\">\n      <Generator></Generator>\n    </EmbeddedResource>\n    <EmbeddedResource Update=\"Localization\\StringResources_tr.resx\">\n      <Generator></Generator>\n    </EmbeddedResource>\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Fody\" Version=\"6.9.1\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n    </PackageReference>\n    <PackageReference Include=\"ILMerge.Fody\" Version=\"1.24.0\" PrivateAssets=\"all\" />\n  </ItemGroup>\n\n  <Target Name=\"Copy to plugin directory\" AfterTargets=\"PostBuildEvent\">\n    <Exec Command=\"if not exist &quot;$(PluginDir)&quot; mkdir &quot;$(PluginDir)&quot;\" />\n    <Exec Command=\"copy &quot;$(TargetPath)&quot; &quot;$(PluginDir)&quot; /y\" />\n    <Exec Command=\"copy &quot;$(TargetDir)$(TargetName).pdb&quot; &quot;$(PluginDir)&quot; /y\" Condition=\"'$(ConfigurationName)' == 'Debug'\" />\n  </Target>\n\n  <Target Name=\"OuterPreBuild\" BeforeTargets=\"DispatchToInnerBuilds\">\n    <Exec Command=\"powershell -NoProfile -ExecutionPolicy RemoteSigned -file &quot;Localization\\InjectResourceManager.ps1&quot;\" />\n  </Target>\n\n  <ItemGroup>\n    <EditorConfigFiles Remove=\".editorconfig\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\PaintDotNet.IndirectUI.Fluent\\PaintDotNet.IndirectUI.Fluent\\PaintDotNet.IndirectUI.Fluent.csproj\" />\n    <ProjectReference Include=\"..\\..\\resvg.net\\resvg.net\\resvg.net.csproj\" />\n    <ProjectReference Include=\"..\\BitmapVectorizer\\BitmapVectorizer\\BitmapVectorizer.csproj\" />\n  </ItemGroup>\n\n</Project>"
  },
  {
    "path": "SvgFileType/SvgFileTypePluginSupportInfo.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing System;\nusing System.Reflection;\nusing PaintDotNet;\n\nnamespace SvgFileTypePlugin;\n\npublic sealed class SvgFileTypePluginSupportInfo : IPluginSupportInfo, IPluginSupportInfoProvider\n{\n    #region Properties\n\n    internal static SvgFileTypePluginSupportInfo Instance { get; } = new SvgFileTypePluginSupportInfo();\n\n    #region IPluginSupportInfo\n\n    public string Author { get; } = \"Osman Tunçelli\";\n\n    public string Copyright { get; } = GetCustomAttribute<AssemblyCopyrightAttribute>()?.Copyright ?? string.Empty;\n\n    public string DisplayName { get; } = GetCustomAttribute<AssemblyProductAttribute>()?.Product ?? string.Empty;\n\n    public Version Version { get; } = GetAssembly().GetName().Version ?? new Version(1, 0);\n\n    public Uri WebsiteUri { get; } = new Uri(\"https://github.com/otuncelli/Scalable-Vector-Graphics-Plugin-for-Paint.NET\");\n\n    #endregion\n\n    internal Uri ForumUri { get; } = new Uri(\"https://forums.getpaint.net/index.php?showtopic=117086\");\n\n    #endregion\n\n    #region IPluginSupportInfoProvider\n\n    public IPluginSupportInfo GetPluginSupportInfo()\n    {\n        return new SvgFileTypePluginSupportInfo();\n    }\n\n    #endregion\n\n    #region Static Methods\n\n    private static T? GetCustomAttribute<T>() where T : Attribute\n    {\n        return GetAssembly().GetCustomAttribute<T>();\n    }\n\n    private static Assembly GetAssembly()\n    {\n        return typeof(SvgFileTypePluginSupportInfo).Assembly;\n    }\n\n    #endregion\n}\n"
  },
  {
    "path": "SvgFileType/UIHelper.cs",
    "content": "﻿// Copyright 2025 Osman Tunçelli. All rights reserved.\n// Use of this source code is governed by GNU General Public License (GPL-2.0) that can be found in the COPYING file.\n\nusing System;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Threading;\nusing System.Windows.Forms;\nusing PaintDotNet;\nusing PaintDotNet.AppModel;\nusing SvgFileTypePlugin.Extensions;\n\nnamespace SvgFileTypePlugin;\n\ninternal static partial class UIHelper\n{\n    public static Form? GetMainForm()\n    {\n        nint handle = Process.GetCurrentProcess().MainWindowHandle;\n        return (Form?)Control.FromHandle(handle) ?? Application.OpenForms[\"MainForm\"] ?? Application.OpenForms[0];\n    }\n\n    public static bool IsSaveConfigDialogVisible()\n    {\n        Form? main = GetMainForm();\n        return Application.OpenForms\n            .OfType<PdnBaseForm>()\n            .Where(form => form != main)\n            .Reverse()\n            .SelectMany(form => form.Descendants())\n            .AsParallel()\n            .OfType<SaveConfigWidget>()\n            .Any();\n    }\n\n    public static TResult? RunOnUIThread<TResult>(Func<TResult> action)\n    {\n        IUISynchronizationContext ctx = Services.Get<IUISynchronizationContext>();\n        if (ctx.IsOnUIThread)\n        {\n            return action();\n        }\n        TResult? result = default;\n        Exception? error = null;\n        ctx.Send(new SendOrPostCallback(state =>\n        {\n            try\n            {\n                result = action();\n            }\n            catch (Exception ex)\n            {\n                error = ex;\n            }\n        }), state: null);\n        if (error is not null)\n        {\n            throw error;\n        }\n        return result;\n    }\n\n    public static void RunOnUIThread(Action action)\n    {\n        IUISynchronizationContext ctx = Services.Get<IUISynchronizationContext>();\n        if (ctx.IsOnUIThread)\n        {\n            action();\n            return;\n        }\n        Exception? error = null;\n        ctx.Send(new SendOrPostCallback(state =>\n        {\n            try\n            {\n                action();\n            }\n            catch (Exception ex)\n            {\n                error = ex;\n            }\n        }), state: null);\n        if (error is not null)\n        {\n            throw error;\n        }\n    }\n}\n"
  },
  {
    "path": "SvgFileType.ThirdPartyNotices.txt",
    "content": "Scalable-Vector-Graphics-Plugin-for-Paint.NET also uses third-party \nprojects that may be distributed under different licenses. \nPlease see below for details.\n\n1.\tSVG.NET (https://github.com/svg-net/SVG)\n2. \tExCSS (https://github.com/TylerBrinks/ExCSS)\n3.\tBitmapVectorizer (https://github.com/otuncelli/BitmapVectorizer)\n4.\tresvg (https://github.com/linebender/resvg)\n5.\tresvg.net (https://github.com/otuncelli/resvg.net)\n\n%% SVG.NET NOTICES AND INFORMATION BEGIN HERE\n=========================================\n\nMicrosoft Public License (Ms-PL)\n\nThis license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software.\n\n1. Definitions\n\nThe terms \"reproduce,\" \"reproduction,\" \"derivative works,\" and \"distribution\" have the same meaning here as under U.S. copyright law.\n\nA \"contribution\" is the original software, or any additions or changes to the software.\n\nA \"contributor\" is any person that distributes its contribution under this license.\n\n\"Licensed patents\" are a contributor's patent claims that read directly on its contribution.\n\n2. Grant of Rights\n\n(A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create.\n\n(B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software.\n\n3. Conditions and Limitations\n\n(A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks.\n\n(B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically.\n\n(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software.\n\n(D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license.\n\n(E) The software is licensed \"as-is.\" You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement. \n\n=========================================\nEND OF SVG.NET NOTICES AND INFORMATION\n\n\n%% ExCSS NOTICES AND INFORMATION BEGIN HERE\n=========================================\n\nThe MIT License (MIT)\n\nCopyright (c) [year] [fullname]\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n=========================================\nEND OF ExCSS NOTICES AND INFORMATION\n\n%% BitmapVectorizer NOTICES AND INFORMATION BEGIN HERE\n=========================================\n                    GNU GENERAL PUBLIC LICENSE\n                       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\n 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Lesser General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n                            NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n                     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\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License along\n    with this program; if not, write to the Free Software Foundation, Inc.,\n    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) year name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.\n=========================================\nEND OF BitmapVectorizer NOTICES AND INFORMATION\n\n%% resvg NOTICES AND INFORMATION BEGIN HERE\n=========================================\n\nCopyright 2017 the Resvg Authors\n\nPermission is hereby granted, free of charge, to any\nperson obtaining a copy of this software and associated\ndocumentation files (the \"Software\"), to deal in the\nSoftware without restriction, including without\nlimitation the rights to use, copy, modify, merge,\npublish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software\nis furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice\nshall be included in all copies or substantial portions\nof the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\nANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\nTO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\nPARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT\nSHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\nIN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\n\n=========================================\nEND OF resvg NOTICES AND INFORMATION\n\n%% resvg.net NOTICES AND INFORMATION BEGIN HERE\n=========================================\n\nMozilla Public License Version 2.0\n==================================\n\n1. Definitions\n--------------\n\n1.1. \"Contributor\"\n    means each individual or legal entity that creates, contributes to\n    the creation of, or owns Covered Software.\n\n1.2. \"Contributor Version\"\n    means the combination of the Contributions of others (if any) used\n    by a Contributor and that particular Contributor's Contribution.\n\n1.3. \"Contribution\"\n    means Covered Software of a particular Contributor.\n\n1.4. \"Covered Software\"\n    means Source Code Form to which the initial Contributor has attached\n    the notice in Exhibit A, the Executable Form of such Source Code\n    Form, and Modifications of such Source Code Form, in each case\n    including portions thereof.\n\n1.5. \"Incompatible With Secondary Licenses\"\n    means\n\n    (a) that the initial Contributor has attached the notice described\n        in Exhibit B to the Covered Software; or\n\n    (b) that the Covered Software was made available under the terms of\n        version 1.1 or earlier of the License, but not also under the\n        terms of a Secondary License.\n\n1.6. \"Executable Form\"\n    means any form of the work other than Source Code Form.\n\n1.7. \"Larger Work\"\n    means a work that combines Covered Software with other material, in \n    a separate file or files, that is not Covered Software.\n\n1.8. \"License\"\n    means this document.\n\n1.9. \"Licensable\"\n    means having the right to grant, to the maximum extent possible,\n    whether at the time of the initial grant or subsequently, any and\n    all of the rights conveyed by this License.\n\n1.10. \"Modifications\"\n    means any of the following:\n\n    (a) any file in Source Code Form that results from an addition to,\n        deletion from, or modification of the contents of Covered\n        Software; or\n\n    (b) any new file in Source Code Form that contains any Covered\n        Software.\n\n1.11. \"Patent Claims\" of a Contributor\n    means any patent claim(s), including without limitation, method,\n    process, and apparatus claims, in any patent Licensable by such\n    Contributor that would be infringed, but for the grant of the\n    License, by the making, using, selling, offering for sale, having\n    made, import, or transfer of either its Contributions or its\n    Contributor Version.\n\n1.12. \"Secondary License\"\n    means either the GNU General Public License, Version 2.0, the GNU\n    Lesser General Public License, Version 2.1, the GNU Affero General\n    Public License, Version 3.0, or any later versions of those\n    licenses.\n\n1.13. \"Source Code Form\"\n    means the form of the work preferred for making modifications.\n\n1.14. \"You\" (or \"Your\")\n    means an individual or a legal entity exercising rights under this\n    License. For legal entities, \"You\" includes any entity that\n    controls, is controlled by, or is under common control with You. For\n    purposes of this definition, \"control\" means (a) the power, direct\n    or indirect, to cause the direction or management of such entity,\n    whether by contract or otherwise, or (b) ownership of more than\n    fifty percent (50%) of the outstanding shares or beneficial\n    ownership of such entity.\n\n2. License Grants and Conditions\n--------------------------------\n\n2.1. Grants\n\nEach Contributor hereby grants You a world-wide, royalty-free,\nnon-exclusive license:\n\n(a) under intellectual property rights (other than patent or trademark)\n    Licensable by such Contributor to use, reproduce, make available,\n    modify, display, perform, distribute, and otherwise exploit its\n    Contributions, either on an unmodified basis, with Modifications, or\n    as part of a Larger Work; and\n\n(b) under Patent Claims of such Contributor to make, use, sell, offer\n    for sale, have made, import, and otherwise transfer either its\n    Contributions or its Contributor Version.\n\n2.2. Effective Date\n\nThe licenses granted in Section 2.1 with respect to any Contribution\nbecome effective for each Contribution on the date the Contributor first\ndistributes such Contribution.\n\n2.3. Limitations on Grant Scope\n\nThe licenses granted in this Section 2 are the only rights granted under\nthis License. No additional rights or licenses will be implied from the\ndistribution or licensing of Covered Software under this License.\nNotwithstanding Section 2.1(b) above, no patent license is granted by a\nContributor:\n\n(a) for any code that a Contributor has removed from Covered Software;\n    or\n\n(b) for infringements caused by: (i) Your and any other third party's\n    modifications of Covered Software, or (ii) the combination of its\n    Contributions with other software (except as part of its Contributor\n    Version); or\n\n(c) under Patent Claims infringed by Covered Software in the absence of\n    its Contributions.\n\nThis License does not grant any rights in the trademarks, service marks,\nor logos of any Contributor (except as may be necessary to comply with\nthe notice requirements in Section 3.4).\n\n2.4. Subsequent Licenses\n\nNo Contributor makes additional grants as a result of Your choice to\ndistribute the Covered Software under a subsequent version of this\nLicense (see Section 10.2) or under the terms of a Secondary License (if\npermitted under the terms of Section 3.3).\n\n2.5. Representation\n\nEach Contributor represents that the Contributor believes its\nContributions are its original creation(s) or it has sufficient rights\nto grant the rights to its Contributions conveyed by this License.\n\n2.6. Fair Use\n\nThis License is not intended to limit any rights You have under\napplicable copyright doctrines of fair use, fair dealing, or other\nequivalents.\n\n2.7. Conditions\n\nSections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted\nin Section 2.1.\n\n3. Responsibilities\n-------------------\n\n3.1. Distribution of Source Form\n\nAll distribution of Covered Software in Source Code Form, including any\nModifications that You create or to which You contribute, must be under\nthe terms of this License. You must inform recipients that the Source\nCode Form of the Covered Software is governed by the terms of this\nLicense, and how they can obtain a copy of this License. You may not\nattempt to alter or restrict the recipients' rights in the Source Code\nForm.\n\n3.2. Distribution of Executable Form\n\nIf You distribute Covered Software in Executable Form then:\n\n(a) such Covered Software must also be made available in Source Code\n    Form, as described in Section 3.1, and You must inform recipients of\n    the Executable Form how they can obtain a copy of such Source Code\n    Form by reasonable means in a timely manner, at a charge no more\n    than the cost of distribution to the recipient; and\n\n(b) You may distribute such Executable Form under the terms of this\n    License, or sublicense it under different terms, provided that the\n    license for the Executable Form does not attempt to limit or alter\n    the recipients' rights in the Source Code Form under this License.\n\n3.3. Distribution of a Larger Work\n\nYou may create and distribute a Larger Work under terms of Your choice,\nprovided that You also comply with the requirements of this License for\nthe Covered Software. If the Larger Work is a combination of Covered\nSoftware with a work governed by one or more Secondary Licenses, and the\nCovered Software is not Incompatible With Secondary Licenses, this\nLicense permits You to additionally distribute such Covered Software\nunder the terms of such Secondary License(s), so that the recipient of\nthe Larger Work may, at their option, further distribute the Covered\nSoftware under the terms of either this License or such Secondary\nLicense(s).\n\n3.4. Notices\n\nYou may not remove or alter the substance of any license notices\n(including copyright notices, patent notices, disclaimers of warranty,\nor limitations of liability) contained within the Source Code Form of\nthe Covered Software, except that You may alter any license notices to\nthe extent required to remedy known factual inaccuracies.\n\n3.5. Application of Additional Terms\n\nYou may choose to offer, and to charge a fee for, warranty, support,\nindemnity or liability obligations to one or more recipients of Covered\nSoftware. However, You may do so only on Your own behalf, and not on\nbehalf of any Contributor. You must make it absolutely clear that any\nsuch warranty, support, indemnity, or liability obligation is offered by\nYou alone, and You hereby agree to indemnify every Contributor for any\nliability incurred by such Contributor as a result of warranty, support,\nindemnity or liability terms You offer. You may include additional\ndisclaimers of warranty and limitations of liability specific to any\njurisdiction.\n\n4. Inability to Comply Due to Statute or Regulation\n---------------------------------------------------\n\nIf it is impossible for You to comply with any of the terms of this\nLicense with respect to some or all of the Covered Software due to\nstatute, judicial order, or regulation then You must: (a) comply with\nthe terms of this License to the maximum extent possible; and (b)\ndescribe the limitations and the code they affect. Such description must\nbe placed in a text file included with all distributions of the Covered\nSoftware under this License. Except to the extent prohibited by statute\nor regulation, such description must be sufficiently detailed for a\nrecipient of ordinary skill to be able to understand it.\n\n5. Termination\n--------------\n\n5.1. The rights granted under this License will terminate automatically\nif You fail to comply with any of its terms. However, if You become\ncompliant, then the rights granted under this License from a particular\nContributor are reinstated (a) provisionally, unless and until such\nContributor explicitly and finally terminates Your grants, and (b) on an\nongoing basis, if such Contributor fails to notify You of the\nnon-compliance by some reasonable means prior to 60 days after You have\ncome back into compliance. Moreover, Your grants from a particular\nContributor are reinstated on an ongoing basis if such Contributor\nnotifies You of the non-compliance by some reasonable means, this is the\nfirst time You have received notice of non-compliance with this License\nfrom such Contributor, and You become compliant prior to 30 days after\nYour receipt of the notice.\n\n5.2. If You initiate litigation against any entity by asserting a patent\ninfringement claim (excluding declaratory judgment actions,\ncounter-claims, and cross-claims) alleging that a Contributor Version\ndirectly or indirectly infringes any patent, then the rights granted to\nYou by any and all Contributors for the Covered Software under Section\n2.1 of this License shall terminate.\n\n5.3. In the event of termination under Sections 5.1 or 5.2 above, all\nend user license agreements (excluding distributors and resellers) which\nhave been validly granted by You or Your distributors under this License\nprior to termination shall survive termination.\n\n************************************************************************\n*                                                                      *\n*  6. Disclaimer of Warranty                                           *\n*  -------------------------                                           *\n*                                                                      *\n*  Covered Software is provided under this License on an \"as is\"       *\n*  basis, without warranty of any kind, either expressed, implied, or  *\n*  statutory, including, without limitation, warranties that the       *\n*  Covered Software is free of defects, merchantable, fit for a        *\n*  particular purpose or non-infringing. The entire risk as to the     *\n*  quality and performance of the Covered Software is with You.        *\n*  Should any Covered Software prove defective in any respect, You     *\n*  (not any Contributor) assume the cost of any necessary servicing,   *\n*  repair, or correction. This disclaimer of warranty constitutes an   *\n*  essential part of this License. No use of any Covered Software is   *\n*  authorized under this License except under this disclaimer.         *\n*                                                                      *\n************************************************************************\n\n************************************************************************\n*                                                                      *\n*  7. Limitation of Liability                                          *\n*  --------------------------                                          *\n*                                                                      *\n*  Under no circumstances and under no legal theory, whether tort      *\n*  (including negligence), contract, or otherwise, shall any           *\n*  Contributor, or anyone who distributes Covered Software as          *\n*  permitted above, be liable to You for any direct, indirect,         *\n*  special, incidental, or consequential damages of any character      *\n*  including, without limitation, damages for lost profits, loss of    *\n*  goodwill, work stoppage, computer failure or malfunction, or any    *\n*  and all other commercial damages or losses, even if such party      *\n*  shall have been informed of the possibility of such damages. This   *\n*  limitation of liability shall not apply to liability for death or   *\n*  personal injury resulting from such party's negligence to the       *\n*  extent applicable law prohibits such limitation. Some               *\n*  jurisdictions do not allow the exclusion or limitation of           *\n*  incidental or consequential damages, so this exclusion and          *\n*  limitation may not apply to You.                                    *\n*                                                                      *\n************************************************************************\n\n8. Litigation\n-------------\n\nAny litigation relating to this License may be brought only in the\ncourts of a jurisdiction where the defendant maintains its principal\nplace of business and such litigation shall be governed by laws of that\njurisdiction, without reference to its conflict-of-law provisions.\nNothing in this Section shall prevent a party's ability to bring\ncross-claims or counter-claims.\n\n9. Miscellaneous\n----------------\n\nThis License represents the complete agreement concerning the subject\nmatter hereof. If any provision of this License is held to be\nunenforceable, such provision shall be reformed only to the extent\nnecessary to make it enforceable. Any law or regulation which provides\nthat the language of a contract shall be construed against the drafter\nshall not be used to construe this License against a Contributor.\n\n10. Versions of the License\n---------------------------\n\n10.1. New Versions\n\nMozilla Foundation is the license steward. Except as provided in Section\n10.3, no one other than the license steward has the right to modify or\npublish new versions of this License. Each version will be given a\ndistinguishing version number.\n\n10.2. Effect of New Versions\n\nYou may distribute the Covered Software under the terms of the version\nof the License under which You originally received the Covered Software,\nor under the terms of any subsequent version published by the license\nsteward.\n\n10.3. Modified Versions\n\nIf you create software not governed by this License, and you want to\ncreate a new license for such software, you may create and use a\nmodified version of this License if you rename the license and remove\nany references to the name of the license steward (except to note that\nsuch modified license differs from this License).\n\n10.4. Distributing Source Code Form that is Incompatible With Secondary\nLicenses\n\nIf You choose to distribute Source Code Form that is Incompatible With\nSecondary Licenses under the terms of this version of the License, the\nnotice described in Exhibit B of this License must be attached.\n\nExhibit A - Source Code Form License Notice\n-------------------------------------------\n\n  This Source Code Form is subject to the terms of the Mozilla Public\n  License, v. 2.0. If a copy of the MPL was not distributed with this\n  file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nIf it is not possible or desirable to put the notice in a particular\nfile, then You may include the notice in a location (such as a LICENSE\nfile in a relevant directory) where a recipient would be likely to look\nfor such a notice.\n\nYou may add additional accurate notices of copyright ownership.\n\nExhibit B - \"Incompatible With Secondary Licenses\" Notice\n---------------------------------------------------------\n\n  This Source Code Form is \"Incompatible With Secondary Licenses\", as\n  defined by the Mozilla Public License, v. 2.0.\n\n=========================================\nEND OF resvg.net NOTICES AND INFORMATION"
  },
  {
    "path": "SvgFileType.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.0.32014.148\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"SvgFileTypePlugin\", \"SvgFileType\\SvgFileTypePlugin.csproj\", \"{C32235C8-90B3-4C43-B589-B821C84839E9}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"BitmapVectorizer\", \"BitmapVectorizer\\BitmapVectorizer\\BitmapVectorizer.csproj\", \"{2C7479CE-42CF-4D90-9650-6ACDF868B8D2}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"resvg.net\", \"..\\resvg.net\\resvg.net\\resvg.net.csproj\", \"{AC700075-39F4-4DB8-B65A-8B0C9264225C}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"PaintDotNet.IndirectUI.Fluent\", \"..\\PaintDotNet.IndirectUI.Fluent\\PaintDotNet.IndirectUI.Fluent\\PaintDotNet.IndirectUI.Fluent.csproj\", \"{0A612B08-8FC5-4068-9437-FC38476EA808}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"resvg.net.SourceGenerator\", \"..\\resvg.net\\resvg.net.SourceGenerator\\resvg.net.SourceGenerator.csproj\", \"{829DA38A-DC43-4A9F-AEB6-C2208390B6B0}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{C32235C8-90B3-4C43-B589-B821C84839E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C32235C8-90B3-4C43-B589-B821C84839E9}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C32235C8-90B3-4C43-B589-B821C84839E9}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C32235C8-90B3-4C43-B589-B821C84839E9}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{2C7479CE-42CF-4D90-9650-6ACDF868B8D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{2C7479CE-42CF-4D90-9650-6ACDF868B8D2}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{2C7479CE-42CF-4D90-9650-6ACDF868B8D2}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{2C7479CE-42CF-4D90-9650-6ACDF868B8D2}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{AC700075-39F4-4DB8-B65A-8B0C9264225C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{AC700075-39F4-4DB8-B65A-8B0C9264225C}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{AC700075-39F4-4DB8-B65A-8B0C9264225C}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{AC700075-39F4-4DB8-B65A-8B0C9264225C}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{0A612B08-8FC5-4068-9437-FC38476EA808}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{0A612B08-8FC5-4068-9437-FC38476EA808}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{0A612B08-8FC5-4068-9437-FC38476EA808}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{0A612B08-8FC5-4068-9437-FC38476EA808}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{829DA38A-DC43-4A9F-AEB6-C2208390B6B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{829DA38A-DC43-4A9F-AEB6-C2208390B6B0}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{829DA38A-DC43-4A9F-AEB6-C2208390B6B0}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{829DA38A-DC43-4A9F-AEB6-C2208390B6B0}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {1ACF9C3B-BF8E-4939-88D4-BA7E2CE114E5}\n\tEndGlobalSection\nEndGlobal\n"
  }
]