[
  {
    "path": ".gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore\n\n# User-specific files\n*.rsuser\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/\n\n# Visual Studio 2015/2017 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# Visual Studio 2017 auto generated files\nGenerated\\ Files/\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# Benchmark Results\nBenchmarkDotNet.Artifacts/\n\n# .NET Core\nproject.lock.json\nproject.fragment.lock.json\nartifacts/\n\n# StyleCop\nStyleCopReport.xml\n\n# Files built by Visual Studio\n*_i.c\n*_p.c\n*_h.h\n*.ilk\n*.meta\n*.obj\n*.iobj\n*.pch\n*.pdb\n*.ipdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*_wpftmp.csproj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# Visual Studio Trace Files\n*.e2e\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# AxoCover is a Code Coverage Tool\n.axoCover/*\n!.axoCover/settings.json\n\n# Visual Studio code coverage results\n*.coverage\n*.coveragexml\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# Note: Comment the next line if you want to checkin your web deploy settings,\n# but database connection strings (with potential passwords) will be unencrypted\n*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\n\n# NuGet Packages\n*.nupkg\n# The packages folder can be ignored because of Package Restore\n**/[Pp]ackages/*\n# except build/, which is used as an MSBuild target.\n!**/[Pp]ackages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/[Pp]ackages/repositories.config\n# NuGet v3's project.json files produces more ignorable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\n*.appx\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.pfx\n*.publishsettings\norleans.codegen.cs\n\n# Including strong name files can present a security risk\n# (https://github.com/github/gitignore/pull/2483#issue-259490424)\n#*.snk\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\nServiceFabricBackup/\n*.rptproj.bak\n\n# SQL Server files\n*.mdf\n*.ldf\n*.ndf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n*.rptproj.rsuser\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\nnode_modules/\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)\n*.vbw\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# JetBrains Rider\n.idea/\n*.sln.iml\n\n# CodeRush personal settings\n.cr/personal\n\n# Python Tools for Visual Studio (PTVS)\n__pycache__/\n*.pyc\n\n# Cake - Uncomment if you are using it\n# tools/**\n# !tools/packages.config\n\n# Tabs Studio\n*.tss\n\n# Telerik's JustMock configuration file\n*.jmconfig\n\n# BizTalk build output\n*.btp.cs\n*.btm.cs\n*.odx.cs\n*.xsd.cs\n\n# OpenCover UI analysis results\nOpenCover/\n\n# Azure Stream Analytics local run output\nASALocalRun/\n\n# MSBuild Binary and Structured Log\n*.binlog\n\n# NVidia Nsight GPU debugger configuration file\n*.nvuser\n\n# MFractors (Xamarin productivity tool) working folder\n.mfractor/\n\n# Local History for Visual Studio\n.localhistory/\n\n*.pfx"
  },
  {
    "path": "PhotoTimeFix/App.xaml",
    "content": "﻿<Application x:Class=\"PhotoTimeFix.App\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:materialDesign=\"http://materialdesigninxaml.net/winfx/xaml/themes\"\n             StartupUri=\"Window/MainWindow.xaml\"\n             ShutdownMode=\"OnMainWindowClose\">\n    <Application.Resources>\n        <ResourceDictionary>\n            <ResourceDictionary.MergedDictionaries>\n                <materialDesign:BundledTheme BaseTheme=\"Light\" PrimaryColor=\"LightBlue\" SecondaryColor=\"Lime\" />\n                <ResourceDictionary\n                    Source=\"pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesign2.Defaults.xaml\" />\n            </ResourceDictionary.MergedDictionaries>\n        </ResourceDictionary>\n    </Application.Resources>\n</Application>"
  },
  {
    "path": "PhotoTimeFix/App.xaml.cs",
    "content": "﻿using System;\nusing System.Globalization;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing Microsoft.AppCenter;\nusing Microsoft.AppCenter.Analytics;\nusing Microsoft.AppCenter.Crashes;\n\nnamespace PhotoTimeFix\n{\n    /// <summary>\n    ///     Interaction logic for App.xaml\n    /// </summary>\n    public partial class App : Application\n    {\n#if DEBUG\n        public static readonly bool IsDebug = true;\n#else\n        public static readonly bool IsDebug = false;\n#endif\n\n        protected override void OnStartup(StartupEventArgs e)\n        {\n            base.OnStartup(e);\n            if (!IsDebug)\n            {\n                //UI线程未捕获异常处理事件\n                DispatcherUnhandledException += (sender, e1) =>\n                {\n                    MessageBox.Show(e1.Exception.Message);\n                    Crashes.TrackError(e1.Exception);\n                };\n\n                //Task线程内未捕获异常处理事件\n                TaskScheduler.UnobservedTaskException += (sender, e1) =>\n                {\n                    MessageBox.Show(e1.Exception.Message);\n                    Crashes.TrackError(e1.Exception);\n                };\n\n                //非UI线程未捕获异常处理事件\n                AppDomain.CurrentDomain.UnhandledException += delegate(object sender, UnhandledExceptionEventArgs args)\n                {\n                    var ex = args.ExceptionObject;\n                    if (ex is Exception)\n                    {\n                        MessageBox.Show((ex as Exception).Message);\n                        Crashes.TrackError(ex as Exception);\n                    }\n                };\n                //System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo(\"en-US\");\n                //System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo(\"en-US\");\n                var countryCode = RegionInfo.CurrentRegion.TwoLetterISORegionName;\n                AppCenter.SetCountryCode(countryCode);\n                AppCenter.Start(\"5aa5aa14-0bd1-45f1-bea4-72d960c9c576\", typeof(Crashes), typeof(Analytics));\n            }\n        }\n    }\n}"
  },
  {
    "path": "PhotoTimeFix/PhotoTimeFix.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n    <PropertyGroup>\n        <OutputType>WinExe</OutputType>\n        <TargetFramework>net48</TargetFramework>\n        <UseWPF>true</UseWPF>\n        <UseWindowsForms>True</UseWindowsForms>\n        <ApplicationIcon>a9ikq-xzp6j-001.ico</ApplicationIcon>\n        <Win32Resource />\n        <StartupObject>PhotoTimeFix.App</StartupObject>\n        <Authors>Cryolitia</Authors>\n        <RepositoryType>Github</RepositoryType>\n        <RepositoryUrl>https://github.com/Cryolitia/PhotoTimeFix</RepositoryUrl>\n        <Copyright>Copyright 2018-Now Cryolitia</Copyright>\n        <PackageLicenseFile>README.md</PackageLicenseFile>\n        <PackageIcon>照片时间修复.jpg</PackageIcon>\n        <PackageIconUrl />\n        <PackageProjectUrl>https://github.com/Cryolitia/PhotoTimeFix</PackageProjectUrl>\n        <PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>\n        <DelaySign>false</DelaySign>\n        <AssemblyOriginatorKeyFile>..\\cert.pfx</AssemblyOriginatorKeyFile>\n        <Nullable>disable</Nullable>\n        <PackageReadmeFile>README.md</PackageReadmeFile>\n        <PlatformTarget>AnyCPU</PlatformTarget>\n        <IsPackable>true</IsPackable>\n        <AssemblyVersion>1.3.3</AssemblyVersion>\n        <SatelliteResourceLanguages>en;zh-Hans;zh-Hant</SatelliteResourceLanguages>\n        <ApplicationManifest>app.manifest</ApplicationManifest>\n        <Version>1.3.3</Version>\n    </PropertyGroup>\n\n    <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|AnyCPU'\">\n        <DebugType>embedded</DebugType>\n        <DebugSymbols>true</DebugSymbols>\n    </PropertyGroup>\n\n    <ItemGroup>\n      <Compile Remove=\"Util\\DefaultFileProcessor.cs\" />\n    </ItemGroup>\n\n    <ItemGroup>\n      <EmbeddedResource Include=\"Util\\DefaultFileProcessor.cs\" />\n    </ItemGroup>\n\n    <ItemGroup>\n        <PackageReference Include=\"AvalonEdit\" Version=\"6.3.0.90\" />\n        <PackageReference Include=\"CS-Script\" Version=\"4.8.1\" />\n        <PackageReference Include=\"DesktopBridge.Helpers\" Version=\"1.2.2\" />\n        <PackageReference Include=\"MaterialDesignThemes\" Version=\"5.1.0\" />\n        <PackageReference Include=\"MetadataExtractor\" Version=\"2.8.1\" />\n        <PackageReference Include=\"Microsoft.AppCenter.Analytics\" Version=\"5.0.6\" />\n        <PackageReference Include=\"Microsoft.AppCenter.Crashes\" Version=\"5.0.6\" />\n        <PackageReference Include=\"Microsoft.Win32.Registry\" Version=\"5.0.0\" />\n        <PackageReference Include=\"MimeTypeMapOfficial\" Version=\"1.0.17\" />\n        <PackageReference Include=\"WPFLicensesDialog\" Version=\"1.0.1\" />\n    </ItemGroup>\n\n    <ItemGroup>\n        <None Include=\"..\\..\\README.md\">\n            <Pack>True</Pack>\n            <PackagePath>\\</PackagePath>\n        </None>\n        <None Include=\"..\\cert.pfx\">\n            <Link>cert.pfx</Link>\n        </None>\n        <None Include=\"..\\照片时间修复.jpg\">\n            <Pack>True</Pack>\n            <PackagePath>\\</PackagePath>\n        </None>\n    </ItemGroup>\n\n    <ItemGroup>\n        <Reference Include=\"M2.NSudo\">\n            <HintPath>M2.NSudo.dll</HintPath>\n        </Reference>\n    </ItemGroup>\n\n    <ItemGroup>\n        <Compile Update=\"Resouce\\Resource.Designer.cs\">\n            <DesignTime>True</DesignTime>\n            <AutoGen>True</AutoGen>\n            <DependentUpon>Resource.resx</DependentUpon>\n        </Compile>\n        <Compile Update=\"Resource\\Resource.Designer.cs\">\n          <DesignTime>True</DesignTime>\n          <AutoGen>True</AutoGen>\n          <DependentUpon>Resource.resx</DependentUpon>\n        </Compile>\n    </ItemGroup>\n\n    <ItemGroup>\n        <EmbeddedResource Update=\"Resouce\\Resource.resx\">\n            <Generator>PublicResXFileCodeGenerator</Generator>\n            <LastGenOutput>Resource.Designer.cs</LastGenOutput>\n        </EmbeddedResource>\n        <EmbeddedResource Update=\"Resouce\\Resource.zh-Hans.resx\">\n            <Generator>PublicResXFileCodeGenerator</Generator>\n        </EmbeddedResource>\n        <EmbeddedResource Update=\"Resouce\\Resource.zh-Hant.resx\">\n            <Generator>PublicResXFileCodeGenerator</Generator>\n        </EmbeddedResource>\n        <EmbeddedResource Update=\"Resource\\Resource.resx\">\n          <Generator>PublicResXFileCodeGenerator</Generator>\n          <LastGenOutput>Resource.Designer.cs</LastGenOutput>\n        </EmbeddedResource>\n        <EmbeddedResource Update=\"Resource\\Resource.zh-Hans.resx\">\n          <Generator>PublicResXFileCodeGenerator</Generator>\n        </EmbeddedResource>\n        <EmbeddedResource Update=\"Resource\\Resource.zh-Hant.resx\">\n          <Generator>PublicResXFileCodeGenerator</Generator>\n        </EmbeddedResource>\n    </ItemGroup>\n\n    <ItemGroup>\n        <None Update=\"ARM64\\NSudoAPI.dll\">\n            <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n        </None>\n        <None Update=\"cert.cer\">\n          <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n        </None>\n        <None Update=\"NSudo Shared Library\\ARM64\\NSudoAPI.dll\">\n            <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n        </None>\n        <None Update=\"NSudo Shared Library\\Win32\\NSudoAPI.dll\">\n            <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n        </None>\n        <None Update=\"NSudo Shared Library\\x64\\NSudoAPI.dll\">\n            <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n        </None>\n        <None Update=\"Win32\\NSudoAPI.dll\">\n            <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n        </None>\n        <None Update=\"x64\\NSudoAPI.dll\">\n            <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n        </None>\n    </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "PhotoTimeFix/Properties/launchSettings.json",
    "content": "{\n  \"profiles\": {\n    \"PhotoTimeFix\": {\n      \"commandName\": \"Project\"\n    }\n  }\n}"
  },
  {
    "path": "PhotoTimeFix/Resource/Resource.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     此代码由工具生成。\n//     运行时版本:4.0.30319.42000\n//\n//     对此文件的更改可能会导致不正确的行为，并且如果\n//     重新生成代码，这些更改将会丢失。\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace PhotoTimeFix.Resource {\n    using System;\n    \n    \n    /// <summary>\n    ///   一个强类型的资源类，用于查找本地化的字符串等。\n    /// </summary>\n    // 此类是由 StronglyTypedResourceBuilder\n    // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。\n    // 若要添加或移除成员，请编辑 .ResX 文件，然后重新运行 ResGen\n    // (以 /str 作为命令选项)，或重新生成 VS 项目。\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    public class Resource {\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 Resource() {\n        }\n        \n        /// <summary>\n        ///   返回此类使用的缓存的 ResourceManager 实例。\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"PhotoTimeFix.Resource.Resource\", typeof(Resource).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   重写当前线程的 CurrentUICulture 属性，对\n        ///   使用此强类型资源类的所有资源查找执行重写。\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        public static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Author:  的本地化字符串。\n        /// </summary>\n        public static string About_Author {\n            get {\n                return ResourceManager.GetString(\"About_Author\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Cryolitia 的本地化字符串。\n        /// </summary>\n        public static string About_Neuron {\n            get {\n                return ResourceManager.GetString(\"About_Neuron\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Open Source License 的本地化字符串。\n        /// </summary>\n        public static string About_OpenSourceLicense {\n            get {\n                return ResourceManager.GetString(\"About_OpenSourceLicense\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Github repo:  的本地化字符串。\n        /// </summary>\n        public static string About_OpenSourceLink {\n            get {\n                return ResourceManager.GetString(\"About_OpenSourceLink\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Telegram:  的本地化字符串。\n        /// </summary>\n        public static string About_Telegram {\n            get {\n                return ResourceManager.GetString(\"About_Telegram\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Thanks to all open source software contributors for going forward 的本地化字符串。\n        /// </summary>\n        public static string About_ThanksToOpenSource {\n            get {\n                return ResourceManager.GetString(\"About_ThanksToOpenSource\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Photo Time Fix 的本地化字符串。\n        /// </summary>\n        public static string App_Name {\n            get {\n                return ResourceManager.GetString(\"App_Name\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Compile 的本地化字符串。\n        /// </summary>\n        public static string CodeEditWindow_Compile {\n            get {\n                return ResourceManager.GetString(\"CodeEditWindow_Compile\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Compiled successfully 的本地化字符串。\n        /// </summary>\n        public static string CodeEditWindow_CompileSuccess {\n            get {\n                return ResourceManager.GetString(\"CodeEditWindow_CompileSuccess\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Current creation time:  的本地化字符串。\n        /// </summary>\n        public static string MainWindow_CurrentCreationTime {\n            get {\n                return ResourceManager.GetString(\"MainWindow_CurrentCreationTime\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Current last write time:  的本地化字符串。\n        /// </summary>\n        public static string MainWindow_CurrentModificationTime {\n            get {\n                return ResourceManager.GetString(\"MainWindow_CurrentModificationTime\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Current user:  的本地化字符串。\n        /// </summary>\n        public static string MainWindow_CurrentUser {\n            get {\n                return ResourceManager.GetString(\"MainWindow_CurrentUser\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Current user group:  的本地化字符串。\n        /// </summary>\n        public static string MainWindow_CurrentUserGroup {\n            get {\n                return ResourceManager.GetString(\"MainWindow_CurrentUserGroup\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Custom filename parser 的本地化字符串。\n        /// </summary>\n        public static string MainWindow_CustomFileProcessingClass {\n            get {\n                return ResourceManager.GetString(\"MainWindow_CustomFileProcessingClass\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 File Name 的本地化字符串。\n        /// </summary>\n        public static string MainWindow_FileName {\n            get {\n                return ResourceManager.GetString(\"MainWindow_FileName\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 File System Metadata 的本地化字符串。\n        /// </summary>\n        public static string MainWindow_FileSystem {\n            get {\n                return ResourceManager.GetString(\"MainWindow_FileSystem\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 File or folder path 的本地化字符串。\n        /// </summary>\n        public static string MainWindow_FolderFilePath {\n            get {\n                return ResourceManager.GetString(\"MainWindow_FolderFilePath\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 New Time:  的本地化字符串。\n        /// </summary>\n        public static string MainWIndow_NewTime {\n            get {\n                return ResourceManager.GetString(\"MainWIndow_NewTime\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Run As Admin 的本地化字符串。\n        /// </summary>\n        public static string MainWindow_RunAsAdmin {\n            get {\n                return ResourceManager.GetString(\"MainWindow_RunAsAdmin\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Run As Trust Installer 的本地化字符串。\n        /// </summary>\n        public static string MainWindow_RunAsTrustInstaller {\n            get {\n                return ResourceManager.GetString(\"MainWindow_RunAsTrustInstaller\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Start 的本地化字符串。\n        /// </summary>\n        public static string MainWindow_Start {\n            get {\n                return ResourceManager.GetString(\"MainWindow_Start\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Open Log File 的本地化字符串。\n        /// </summary>\n        public static string ProcessWindow_Copy {\n            get {\n                return ResourceManager.GetString(\"ProcessWindow_Copy\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Detail 的本地化字符串。\n        /// </summary>\n        public static string ProcessWindow_Detail {\n            get {\n                return ResourceManager.GetString(\"ProcessWindow_Detail\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 File 的本地化字符串。\n        /// </summary>\n        public static string ProcessWindow_File {\n            get {\n                return ResourceManager.GetString(\"ProcessWindow_File\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 New Time 的本地化字符串。\n        /// </summary>\n        public static string ProcessWindow_NewTime {\n            get {\n                return ResourceManager.GetString(\"ProcessWindow_NewTime\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Status 的本地化字符串。\n        /// </summary>\n        public static string ProcessWindow_Status {\n            get {\n                return ResourceManager.GetString(\"ProcessWindow_Status\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Path should not be empty 的本地化字符串。\n        /// </summary>\n        public static string Rule_PathNonNull {\n            get {\n                return ResourceManager.GetString(\"Rule_PathNonNull\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Path not exist 的本地化字符串。\n        /// </summary>\n        public static string Rule_PathNotExist {\n            get {\n                return ResourceManager.GetString(\"Rule_PathNotExist\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Process only media files 的本地化字符串。\n        /// </summary>\n        public static string Setting_MediaOnly {\n            get {\n                return ResourceManager.GetString(\"Setting_MediaOnly\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Only process files with MIME type &quot;image/*&quot; or &quot;video/*&quot; when batch processing 的本地化字符串。\n        /// </summary>\n        public static string Setting_MediaOnlySummary {\n            get {\n                return ResourceManager.GetString(\"Setting_MediaOnlySummary\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Open media 的本地化字符串。\n        /// </summary>\n        public static string Setting_OpenMedia {\n            get {\n                return ResourceManager.GetString(\"Setting_OpenMedia\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Prefer EXIF 的本地化字符串。\n        /// </summary>\n        public static string Setting_PreferExif {\n            get {\n                return ResourceManager.GetString(\"Setting_PreferExif\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Try to read EXIF tag firstly 的本地化字符串。\n        /// </summary>\n        public static string Setting_PreferExifSummary {\n            get {\n                return ResourceManager.GetString(\"Setting_PreferExifSummary\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Safe mode 的本地化字符串。\n        /// </summary>\n        public static string Setting_SafeMode {\n            get {\n                return ResourceManager.GetString(\"Setting_SafeMode\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Prevent time from being set before 1970 or after the current time 的本地化字符串。\n        /// </summary>\n        public static string Setting_SafeModeSummary {\n            get {\n                return ResourceManager.GetString(\"Setting_SafeModeSummary\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 Save Log file 的本地化字符串。\n        /// </summary>\n        public static string Setting_SaveLog {\n            get {\n                return ResourceManager.GetString(\"Setting_SaveLog\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   查找类似 This operation will attempt to manipulate the file itself and write the EXIF ​​tag, which may cause irrecoverable damage to the file. Please back up before proceeding! 的本地化字符串。\n        /// </summary>\n        public static string Warning_EXIF {\n            get {\n                return ResourceManager.GetString(\"Warning_EXIF\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "PhotoTimeFix/Resource/Resource.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=\"About_Author\" xml:space=\"preserve\">\n    <value>Author: </value>\n  </data>\n  <data name=\"About_Neuron\" xml:space=\"preserve\">\n    <value>Cryolitia</value>\n  </data>\n  <data name=\"About_OpenSourceLicense\" xml:space=\"preserve\">\n    <value>Open Source License</value>\n  </data>\n  <data name=\"About_OpenSourceLink\" xml:space=\"preserve\">\n    <value>Github repo: </value>\n  </data>\n  <data name=\"About_ThanksToOpenSource\" xml:space=\"preserve\">\n    <value>Thanks to all open source software contributors for going forward</value>\n  </data>\n  <data name=\"App_Name\" xml:space=\"preserve\">\n    <value>Photo Time Fix</value>\n  </data>\n  <data name=\"CodeEditWindow_Compile\" xml:space=\"preserve\">\n    <value>Compile</value>\n  </data>\n  <data name=\"MainWindow_CurrentCreationTime\" xml:space=\"preserve\">\n    <value>Current creation time: </value>\n  </data>\n  <data name=\"MainWindow_CurrentModificationTime\" xml:space=\"preserve\">\n    <value>Current last write time: </value>\n  </data>\n  <data name=\"MainWindow_CurrentUser\" xml:space=\"preserve\">\n    <value>Current user: </value>\n  </data>\n  <data name=\"MainWindow_CurrentUserGroup\" xml:space=\"preserve\">\n    <value>Current user group: </value>\n  </data>\n  <data name=\"MainWindow_CustomFileProcessingClass\" xml:space=\"preserve\">\n    <value>Custom filename parser</value>\n  </data>\n  <data name=\"MainWindow_FolderFilePath\" xml:space=\"preserve\">\n    <value>File or folder path</value>\n  </data>\n  <data name=\"MainWIndow_NewTime\" xml:space=\"preserve\">\n    <value>New Time: </value>\n  </data>\n  <data name=\"MainWindow_RunAsAdmin\" xml:space=\"preserve\">\n    <value>Run As Admin</value>\n  </data>\n  <data name=\"MainWindow_RunAsTrustInstaller\" xml:space=\"preserve\">\n    <value>Run As Trust Installer</value>\n  </data>\n  <data name=\"MainWindow_Start\" xml:space=\"preserve\">\n    <value>Start</value>\n  </data>\n  <data name=\"Rule_PathNonNull\" xml:space=\"preserve\">\n    <value>Path should not be empty</value>\n  </data>\n  <data name=\"Rule_PathNotExist\" xml:space=\"preserve\">\n    <value>Path not exist</value>\n  </data>\n  <data name=\"About_Telegram\" xml:space=\"preserve\">\n    <value>Telegram: </value>\n  </data>\n  <data name=\"Setting_SafeMode\" xml:space=\"preserve\">\n    <value>Safe mode</value>\n  </data>\n  <data name=\"CodeEditWindow_CompileSuccess\" xml:space=\"preserve\">\n    <value>Compiled successfully</value>\n  </data>\n  <data name=\"ProcessWindow_File\" xml:space=\"preserve\">\n    <value>File</value>\n  </data>\n  <data name=\"ProcessWindow_Status\" xml:space=\"preserve\">\n    <value>Status</value>\n  </data>\n  <data name=\"ProcessWindow_NewTime\" xml:space=\"preserve\">\n    <value>New Time</value>\n  </data>\n  <data name=\"ProcessWindow_Detail\" xml:space=\"preserve\">\n    <value>Detail</value>\n  </data>\n  <data name=\"Setting_SafeModeSummary\" xml:space=\"preserve\">\n    <value>Prevent time from being set before 1970 or after the current time</value>\n  </data>\n  <data name=\"Setting_PreferExif\" xml:space=\"preserve\">\n    <value>Prefer EXIF</value>\n  </data>\n  <data name=\"Setting_PreferExifSummary\" xml:space=\"preserve\">\n    <value>Try to read EXIF tag firstly</value>\n  </data>\n  <data name=\"Setting_MediaOnly\" xml:space=\"preserve\">\n    <value>Process only media files</value>\n  </data>\n  <data name=\"Setting_MediaOnlySummary\" xml:space=\"preserve\">\n    <value>Only process files with MIME type \"image/*\" or \"video/*\" when batch processing</value>\n  </data>\n  <data name=\"Setting_OpenMedia\" xml:space=\"preserve\">\n    <value>Open media</value>\n  </data>\n  <data name=\"ProcessWindow_Copy\" xml:space=\"preserve\">\n    <value>Open Log File</value>\n  </data>\n  <data name=\"Setting_SaveLog\" xml:space=\"preserve\">\n    <value>Save Log file</value>\n  </data>\n  <data name=\"MainWindow_FileName\" xml:space=\"preserve\">\n    <value>File Name</value>\n  </data>\n  <data name=\"MainWindow_FileSystem\" xml:space=\"preserve\">\n    <value>File System Metadata</value>\n  </data>\n  <data name=\"Warning_EXIF\" xml:space=\"preserve\">\n    <value>This operation will attempt to manipulate the file itself and write the EXIF ​​tag, which may cause irrecoverable damage to the file. Please back up before proceeding!</value>\n  </data>\n</root>"
  },
  {
    "path": "PhotoTimeFix/Resource/Resource.zh-Hans.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=\"App_Name\" xml:space=\"preserve\">\n    <value>照片时间修复</value>\n  </data>\n  <data name=\"MainWindow_FolderFilePath\" xml:space=\"preserve\">\n    <value>文件或文件夹路径</value>\n  </data>\n  <data name=\"MainWindow_CurrentCreationTime\" xml:space=\"preserve\">\n    <value>当前创建时间</value>\n  </data>\n  <data name=\"MainWindow_CurrentModificationTime\" xml:space=\"preserve\">\n    <value>当前修改时间</value>\n  </data>\n  <data name=\"MainWIndow_NewTime\" xml:space=\"preserve\">\n    <value>新时间：</value>\n  </data>\n  <data name=\"MainWindow_CustomFileProcessingClass\" xml:space=\"preserve\">\n    <value>自定义文件名解析方法</value>\n  </data>\n  <data name=\"MainWindow_Start\" xml:space=\"preserve\">\n    <value>开始</value>\n  </data>\n  <data name=\"MainWindow_CurrentUser\" xml:space=\"preserve\">\n    <value>当前用户：</value>\n  </data>\n  <data name=\"MainWindow_CurrentUserGroup\" xml:space=\"preserve\">\n    <value>当前用户组：</value>\n  </data>\n  <data name=\"MainWindow_RunAsAdmin\" xml:space=\"preserve\">\n    <value>以管理员权限运行</value>\n  </data>\n  <data name=\"MainWindow_RunAsTrustInstaller\" xml:space=\"preserve\">\n    <value>以Trust Installer权限运行</value>\n  </data>\n  <data name=\"About_Author\" xml:space=\"preserve\">\n    <value>作者：</value>\n  </data>\n  <data name=\"About_Neuron\" xml:space=\"preserve\">\n    <value>神经元/Cryolitia</value>\n  </data>\n  <data name=\"About_OpenSourceLink\" xml:space=\"preserve\">\n    <value>开源地址：</value>\n  </data>\n  <data name=\"About_OpenSourceLicense\" xml:space=\"preserve\">\n    <value>开放源代码许可</value>\n  </data>\n  <data name=\"About_ThanksToOpenSource\" xml:space=\"preserve\">\n    <value>感谢所有开源软件的贡献者们的一往无前</value>\n  </data>\n  <data name=\"CodeEditWindow_Compile\" xml:space=\"preserve\">\n    <value>编译</value>\n  </data>\n  <data name=\"Rule_PathNonNull\" xml:space=\"preserve\">\n    <value>路径不应为空</value>\n  </data>\n  <data name=\"Rule_PathNotExist\" xml:space=\"preserve\">\n    <value>路径不存在</value>\n  </data>\n  <data name=\"Setting_SafeMode\" xml:space=\"preserve\">\n    <value>安全模式</value>\n  </data>\n  <data name=\"CodeEditWindow_CompileSuccess\" xml:space=\"preserve\">\n    <value>编译成功</value>\n  </data>\n  <data name=\"ProcessWindow_File\" xml:space=\"preserve\">\n    <value>文件</value>\n  </data>\n  <data name=\"ProcessWindow_Status\" xml:space=\"preserve\">\n    <value>状态</value>\n  </data>\n  <data name=\"ProcessWindow_NewTime\" xml:space=\"preserve\">\n    <value>新时间</value>\n  </data>\n  <data name=\"ProcessWindow_Detail\" xml:space=\"preserve\">\n    <value>细节</value>\n  </data>\n  <data name=\"Setting_SafeModeSummary\" xml:space=\"preserve\">\n    <value>阻止将时间设置为1970年之前或当前时间之后</value>\n  </data>\n  <data name=\"Setting_PreferExif\" xml:space=\"preserve\">\n    <value>EXIF优先</value>\n  </data>\n  <data name=\"Setting_PreferExifSummary\" xml:space=\"preserve\">\n    <value>优先尝试读取EXIF信息</value>\n  </data>\n  <data name=\"Setting_MediaOnly\" xml:space=\"preserve\">\n    <value>仅处理媒体文件</value>\n  </data>\n  <data name=\"Setting_MediaOnlySummary\" xml:space=\"preserve\">\n    <value>批处理时仅处理MIME类型为\"image/*\"或\"video/*\"的文件</value>\n  </data>\n  <data name=\"Setting_OpenMedia\" xml:space=\"preserve\">\n    <value>打开媒体</value>\n  </data>\n  <data name=\"ProcessWindow_Copy\" xml:space=\"preserve\">\n    <value>打开日志文件</value>\n  </data>\n  <data name=\"Setting_SaveLog\" xml:space=\"preserve\">\n    <value>保存日志文件</value>\n  </data>\n  <data name=\"MainWindow_FileName\" xml:space=\"preserve\">\n    <value>文件名</value>\n  </data>\n  <data name=\"MainWindow_FileSystem\" xml:space=\"preserve\">\n    <value>文件系统元数据</value>\n  </data>\n  <data name=\"Warning_EXIF\" xml:space=\"preserve\">\n    <value>该操作会尝试操作文件本身并写入EXIF标签，可能造成文件不可恢复的损坏，请先备份再进行操作！</value>\n  </data>\n</root>"
  },
  {
    "path": "PhotoTimeFix/Resource/Resource.zh-Hant.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=\"App_Name\" xml:space=\"preserve\">\n    <value>照片時間修復</value>\n  </data>\n  <data name=\"MainWindow_FolderFilePath\" xml:space=\"preserve\">\n    <value>檔案或資料夾路徑</value>\n  </data>\n  <data name=\"MainWindow_CurrentCreationTime\" xml:space=\"preserve\">\n    <value>當前建立時間</value>\n  </data>\n  <data name=\"MainWindow_CurrentModificationTime\" xml:space=\"preserve\">\n    <value>當前修改時間</value>\n  </data>\n  <data name=\"MainWIndow_NewTime\" xml:space=\"preserve\">\n    <value>新時間：</value>\n  </data>\n  <data name=\"MainWindow_CustomFileProcessingClass\" xml:space=\"preserve\">\n    <value>自定義檔名解析方法</value>\n  </data>\n  <data name=\"MainWindow_Start\" xml:space=\"preserve\">\n    <value>開始</value>\n  </data>\n  <data name=\"MainWindow_CurrentUser\" xml:space=\"preserve\">\n    <value>當前使用者：</value>\n  </data>\n  <data name=\"MainWindow_CurrentUserGroup\" xml:space=\"preserve\">\n    <value>當前使用者組：</value>\n  </data>\n  <data name=\"MainWindow_RunAsAdmin\" xml:space=\"preserve\">\n    <value>以管理員許可權執行</value>\n  </data>\n  <data name=\"MainWindow_RunAsTrustInstaller\" xml:space=\"preserve\">\n    <value>以Trust Installer許可權執行</value>\n  </data>\n  <data name=\"About_Author\" xml:space=\"preserve\">\n    <value>作者：</value>\n  </data>\n  <data name=\"About_Neuron\" xml:space=\"preserve\">\n    <value>神經元/Cryolitia</value>\n  </data>\n  <data name=\"About_OpenSourceLink\" xml:space=\"preserve\">\n    <value>開源地址：</value>\n  </data>\n  <data name=\"About_OpenSourceLicense\" xml:space=\"preserve\">\n    <value>開放原始碼許可</value>\n  </data>\n  <data name=\"About_ThanksToOpenSource\" xml:space=\"preserve\">\n    <value>感謝所有開源軟體的貢獻者們的一往無前</value>\n  </data>\n  <data name=\"CodeEditWindow_Compile\" xml:space=\"preserve\">\n    <value>編譯</value>\n  </data>\n  <data name=\"Rule_PathNonNull\" xml:space=\"preserve\">\n    <value>路徑不應為空</value>\n  </data>\n  <data name=\"Rule_PathNotExist\" xml:space=\"preserve\">\n    <value>路徑不存在</value>\n  </data>\n  <data name=\"Setting_SafeMode\" xml:space=\"preserve\">\n    <value>安全模式</value>\n  </data>\n  <data name=\"CodeEditWindow_CompileSuccess\" xml:space=\"preserve\">\n    <value>編譯成功</value>\n  </data>\n  <data name=\"ProcessWindow_File\" xml:space=\"preserve\">\n    <value>檔案</value>\n  </data>\n  <data name=\"ProcessWindow_Status\" xml:space=\"preserve\">\n    <value>狀態</value>\n  </data>\n  <data name=\"ProcessWindow_NewTime\" xml:space=\"preserve\">\n    <value>新時間</value>\n  </data>\n  <data name=\"ProcessWindow_Detail\" xml:space=\"preserve\">\n    <value>細節</value>\n  </data>\n  <data name=\"Setting_SafeModeSummary\" xml:space=\"preserve\">\n    <value>阻止將時間設定為1970年之前或當前時間之後</value>\n  </data>\n  <data name=\"Setting_PreferExif\" xml:space=\"preserve\">\n    <value>EXIF優先</value>\n  </data>\n  <data name=\"Setting_PreferExifSummary\" xml:space=\"preserve\">\n    <value>優先嚐試讀取EXIF資訊</value>\n  </data>\n  <data name=\"Setting_MediaOnly\" xml:space=\"preserve\">\n    <value>僅處理媒體檔案</value>\n  </data>\n  <data name=\"Setting_MediaOnlySummary\" xml:space=\"preserve\">\n    <value>批處理時僅處理MIME型別為\"image/*\"或\"video/*\"的檔案</value>\n  </data>\n  <data name=\"Setting_OpenMedia\" xml:space=\"preserve\">\n    <value>開啟媒體</value>\n  </data>\n  <data name=\"ProcessWindow_Copy\" xml:space=\"preserve\">\n    <value>開啟日誌檔案</value>\n  </data>\n  <data name=\"Setting_SaveLog\" xml:space=\"preserve\">\n    <value>儲存日誌檔案</value>\n  </data>\n  <data name=\"MainWindow_FileName\" xml:space=\"preserve\">\n    <value>檔案名稱</value>\n  </data>\n  <data name=\"MainWindow_FileSystem\" xml:space=\"preserve\">\n    <value>檔案系統元資料</value>\n  </data>\n  <data name=\"Warning_EXIF\" xml:space=\"preserve\">\n    <value>該操作會嘗試操作檔案本身並寫入EXIF標籤，可能造成檔案不可恢復的損壞，請先備份再進行操作！</value>\n  </data>\n</root>"
  },
  {
    "path": "PhotoTimeFix/Util/DefaultFileProcessor.cs",
    "content": "﻿using System;\nusing System.Globalization;\nusing System.IO;\nusing System.Text.RegularExpressions;\nusing PhotoTimeFix.Util;\npublic class DefaultFileProcessor : IFileProcessor {\n    \n    private const string regexString =\n            \"(19|20)[0-9]{2}[^0-9]*?(0[1-9]|1[0-2])[^0-9]*?([0-2][0-9]|[3][0-1])[^0-9]*?([01][0-9]|2[0-3])[^0-9]*?[0-5][0-9][^0-9]*?[0-5][0-9]\";\n\n    private static Regex regex = new Regex(regexString, RegexOptions.Compiled);\n\n    private static Regex regex2 = new Regex(@\"\\d{13}\", RegexOptions.Compiled);\n\n    private static Regex regex3 = new Regex(@\"\\d{10}\", RegexOptions.Compiled);\n\n    private static Regex spaceRemover = new Regex(@\"\\D+\", RegexOptions.Compiled);\n        \n    public DateTime? GetFileDateTime(FileInfo fileInfo)\n    {\n        var mathch = regex.Match(fileInfo.Name);\n        if (mathch.Success)\n        {\n            string result = mathch.Value;\n            result = spaceRemover.Replace(result, \"\");\n            return DateTime.ParseExact(result, \"yyyyMMddHHmmss\", CultureInfo.InvariantCulture);\n        }\n        else\n        {\n            var match2 = regex2.Match(fileInfo.Name);\n            Int64 result2 = -1;\n            if (match2.Success)\n            {\n                result2 = Int64.Parse(match2.Value)/1000;\n            } else\n            {\n                var match3 = regex3.Match(fileInfo.Name);\n                if (match3.Success)\n                {\n                    result2 = Int64.Parse(match3.Value);\n                }\n            }\n            if (result2!=-1)\n            {\n                return TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)).AddSeconds(result2);\n            }\n            else\n            {\n                return null;\n            }\n        }\n    }\n}"
  },
  {
    "path": "PhotoTimeFix/Util/FileExistValidationRule.cs",
    "content": "﻿using System.Globalization;\nusing System.IO;\nusing System.Windows.Controls;\n\nnamespace PhotoTimeFix.Util\n{\n    public class FileExistValidationRule : ValidationRule\n    {\n        public override ValidationResult Validate(object value, CultureInfo cultureInfo)\n        {\n            if (value == null || string.IsNullOrWhiteSpace((value ?? \"\").ToString()))\n                return new ValidationResult(false, Resource.Resource.Rule_PathNonNull);\n\n            var path = value.ToString();\n            return File.Exists(path) || Directory.Exists(path)\n                ? ValidationResult.ValidResult\n                : new ValidationResult(false, Resource.Resource.Rule_PathNotExist);\n        }\n    }\n}"
  },
  {
    "path": "PhotoTimeFix/Util/IFileProcessor.cs",
    "content": "﻿using System;\nusing System.IO;\n\nnamespace PhotoTimeFix.Util\n{\n    public interface IFileProcessor\n    {\n        DateTime? GetFileDateTime(FileInfo fileInfo);\n    }\n}"
  },
  {
    "path": "PhotoTimeFix/Util/ProcessResult.cs",
    "content": "﻿namespace PhotoTimeFix.Util\n{\n    public class ProcessResult\n    {\n        public ProcessResult(string mFileName, string mDateTime, string mStatus, string mDetail)\n        {\n            FileName = mFileName;\n            DateTime = mDateTime;\n            Status = mStatus;\n            Detail = mDetail;\n        }\n\n        public string FileName { get; set; }\n\n        public string DateTime { get; set; }\n\n        public string Status { get; set; }\n\n        public string Detail { get; set; }\n    }\n}"
  },
  {
    "path": "PhotoTimeFix/Util/ProcessResultList.cs",
    "content": "﻿using System.Collections.ObjectModel;\n\nnamespace PhotoTimeFix.Util\n{\n    public class ProcessResultList : ObservableCollection<ProcessResult>\n    {\n        public void Add(string mFileName, string mDateTime, string mStatus, string mDetail)\n        {\n            Add(new ProcessResult(mFileName, mDateTime, mStatus, mDetail));\n        }\n    }\n}"
  },
  {
    "path": "PhotoTimeFix/Util/SettingItemAttribute.cs",
    "content": "﻿using System;\nusing System.Windows.Forms;\n\nnamespace PhotoTimeFix.Util\n{\n    [AttributeUsage(AttributeTargets.Property)]\n    public class SettingItemAttribute : Attribute\n    {\n        public SettingItemAttribute(string name, string summary)\n        {\n            Name = name;\n            Summary = summary;\n        }\n\n        public SettingItemAttribute(string res)\n        {\n            try\n            {\n                Name = typeof(Resource.Resource).GetProperty(\"Setting_\" + res).GetValue(null) as string;\n            }\n            catch (Exception e)\n            {\n                MessageBox.Show(e.Message);\n            }\n            try\n            {\n                Summary = typeof(Resource.Resource).GetProperty(\"Setting_\" + res+ \"Summary\").GetValue(null) as string;\n            }\n            catch (Exception e)\n            {\n                //ignore\n            }\n        }\n\n        public string Name { get; set; }\n\n        public string Summary { get; set; }\n    }\n}"
  },
  {
    "path": "PhotoTimeFix/Util/ThemeHelper.cs",
    "content": "﻿using System;\nusing System.Text;\nusing System.Windows;\nusing System.Windows.Media;\nusing Windows.Foundation.Metadata;\nusing Windows.UI.ViewManagement;\nusing MaterialDesignThemes.Wpf;\nusing Microsoft.Win32;\n\nnamespace PhotoTimeFix.Util\n{\n    public static class ThemeHelper\n    {\n        private static bool eventInitial;\n\n        //https://kira-96.github.io/posts/%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96Windows10%E4%B8%BB%E9%A2%98%E9%A2%9C%E8%89%B2/\n        public static void InitTheme()\n        {\n            var paletteHelper = new PaletteHelper();\n            var isLight = true;\n            try\n            {\n                var registryValue =\n                    Registry.GetValue(@\"HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize\",\n                        \"AppsUseLightTheme\", null);\n                isLight = Convert.ToBoolean(registryValue);\n            }\n            catch (Exception exception)\n            {\n                MessageBox.Show(exception.ToString());\n            }\n\n            var theme = new Theme();\n            if (isLight)\n                theme.SetLightTheme();\n            else\n                theme.SetDarkTheme();\n            var color = isLight ? Color.FromRgb(66, 133, 244) : Color.FromRgb(130, 168, 231);\n            theme.SetPrimaryColor(color);\n\n            RequireSystemTheme(theme, isLight);\n\n            if (!eventInitial)\n            {\n                SystemEvents.UserPreferenceChanged += (sender, args) => { InitTheme(); };\n                eventInitial = true;\n            }\n\n            paletteHelper.SetTheme(theme);\n        }\n\n        public static void RequireSystemTheme(Theme theme, bool isLight)\n        {\n            try\n            {\n#pragma warning disable CA1416 // 验证平台兼容性\n                if (ApiInformation.IsTypePresent(\"Windows.UI.ViewManagement.UISettings\"))\n                {\n                    var uiSettings = new UISettings();\n                    var accentColor = uiSettings.GetColorValue(UIColorType.Accent);\n                    theme.SetPrimaryColor(Color.FromRgb(accentColor.R, accentColor.G, accentColor.B));\n                    theme.SetSecondaryColor(Color.FromRgb(accentColor.R, accentColor.G, accentColor.B));\n                    if (!isLight)\n                    {\n                        theme.Cards.Background = Color.FromRgb(18, 18, 18);\n                        theme.Background = Colors.Black;\n                    }\n                }\n#pragma warning restore CA1416 // 验证平台兼容性\n            }\n            catch (Exception e)\n            {\n                MessageBox.Show(e.ToString());\n            }\n        }\n\n        public static void ShowSystemColor()\n        {\n            var uiSettings = new UISettings();\n            var builder = new StringBuilder();\n            builder.Append(\"System Colors: \" + '\\n');\n\n            foreach (UIColorType type in Enum.GetValues(typeof(UIColorType)))\n                if (type != UIColorType.Complement)\n                    builder.Append(type + \": \" + uiSettings.GetColorValue(type) + '\\n');\n\n            builder.Append('\\n');\n\n            foreach (UIElementType type in Enum.GetValues(typeof(UIElementType)))\n                builder.Append(type + \": \" + uiSettings.UIElementColor(type) + '\\n');\n\n            System.Windows.Forms.MessageBox.Show(builder.ToString());\n        }\n    }\n}"
  },
  {
    "path": "PhotoTimeFix/ViewBinding/MainWindowBinding.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.IO;\nusing System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Windows;\nusing CSScriptLib;\nusing ICSharpCode.AvalonEdit.Document;\nusing PhotoTimeFix.Util;\n\nnamespace PhotoTimeFix.ViewBinding\n{\n    public class MainWindowBinding : INotifyPropertyChanged\n    {\n        private IEnumerable<string> _detailTags;\n\n        private string _filePath;\n\n        private IFileProcessor _fileProcessor;\n\n        private TextDocument _fileProcessorCode;\n\n        private Visibility _isFile = Visibility.Collapsed;\n\n        private DateTime? _nowDate;\n\n        private DateTime? _nowTime;\n\n        private Visibility _pathExist = Visibility.Collapsed;\n\n        public bool IsDebug => App.IsDebug;\n\n        public string FilePath\n        {\n            get => _filePath;\n            set\n            {\n                _filePath = value;\n                OnPropertyChanged(nameof(FilePath));\n            }\n        }\n\n        public Visibility IsFile\n        {\n            get => _isFile;\n            set\n            {\n                _isFile = value;\n                OnPropertyChanged(nameof(IsFile));\n                OnPropertyChanged(nameof(StartEnabled));\n            }\n        }\n\n        public Visibility PathExist\n        {\n            get => _pathExist;\n            set\n            {\n                _pathExist = value;\n                OnPropertyChanged(nameof(PathExist));\n                OnPropertyChanged(nameof(StartEnabled));\n            }\n        }\n\n        public IEnumerable<string> DetailTags\n        {\n            get => _detailTags;\n            set\n            {\n                _detailTags = value;\n                OnPropertyChanged(nameof(DetailTags));\n            }\n        }\n\n        public DateTime? NowDate\n        {\n            get => _nowDate;\n            set\n            {\n                _nowDate = value;\n                OnPropertyChanged(nameof(NowDate));\n                OnPropertyChanged(nameof(StartEnabled));\n            }\n        }\n\n        public DateTime? NowTime\n        {\n            get => _nowTime;\n            set\n            {\n                _nowTime = value;\n                OnPropertyChanged(nameof(NowTime));\n                OnPropertyChanged(nameof(StartEnabled));\n            }\n        }\n\n        public bool StartEnabled => NowDate != null && NowTime != null && IsFile == Visibility.Visible ||\n                                    IsFile == Visibility.Collapsed && PathExist == Visibility.Visible;\n\n        public TextDocument FileProcessorCode\n        {\n            get\n            {\n                if (_fileProcessorCode == null)\n                {\n                    var assembly = Assembly.GetExecutingAssembly();\n                    var stream =\n                        assembly.GetManifestResourceStream(assembly.GetName().Name + \".Util.DefaultFileProcessor.cs\");\n                    var reader = new StreamReader(stream);\n                    _fileProcessorCode = new TextDocument(reader.ReadToEnd());\n                    _fileProcessorCode.SetOwnerThread(Application.Current.Dispatcher.Thread);\n                }\n\n                return _fileProcessorCode;\n            }\n            set\n            {\n                _fileProcessorCode = value;\n                OnPropertyChanged(nameof(FileProcessorCode));\n            }\n        }\n\n        public IFileProcessor FileProcessor\n        {\n            get\n            {\n                if (_fileProcessor == null)\n                {\n                    var code = Application.Current.Dispatcher.Invoke(() => FileProcessorCode.Text);\n                    _fileProcessor = (IFileProcessor) CSScript.Evaluator.LoadCode(code);\n                }\n\n                return _fileProcessor;\n            }\n            set => _fileProcessor = value;\n        }\n\n        public event PropertyChangedEventHandler PropertyChanged;\n\n        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)\n        {\n            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));\n        }\n    }\n}"
  },
  {
    "path": "PhotoTimeFix/ViewBinding/SettingBinding.cs",
    "content": "﻿using System.ComponentModel;\nusing System.Runtime.CompilerServices;\nusing PhotoTimeFix.Util;\n\nnamespace PhotoTimeFix.ViewBinding\n{\n    public class SettingBinding : INotifyPropertyChanged\n    {\n        private bool _onlyMedia = true;\n\n        private bool _safetyMode = true;\n\n        private bool _showMedia = false;\n\n        private bool _saveLog = false;\n\n        [SettingItem(\"SafeMode\")]\n        public bool SafetyMode\n        {\n            get => _safetyMode;\n            set\n            {\n                _safetyMode = value;\n                OnPropertyChanged(nameof(SafetyMode));\n            }\n        }\n\n        [SettingItem(\"MediaOnly\")]\n        public bool OnlyMedia\n        {\n            get => _onlyMedia;\n            set\n            {\n                _onlyMedia = value;\n                OnPropertyChanged(nameof(OnlyMedia));\n            }\n        }\n\n        [SettingItem(\"OpenMedia\")]\n        public bool ShowMedia\n        {\n            get => _showMedia;\n            set\n            {\n                _showMedia = value;\n                OnPropertyChanged(nameof(ShowMedia));\n            }\n        }\n\n        [SettingItem(\"SaveLog\")]\n        public bool SaveLog\n        {\n            get => _saveLog;\n            set\n            {\n                _saveLog = value;\n                OnPropertyChanged(nameof(SaveLog));\n            }\n        }\n\n        public event PropertyChangedEventHandler PropertyChanged;\n\n        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)\n        {\n            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));\n        }\n    }\n}"
  },
  {
    "path": "PhotoTimeFix/Window/CodeEditWindow.xaml",
    "content": "﻿<Window x:Class=\"PhotoTimeFix.Window.CodeEditWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:res=\"clr-namespace:PhotoTimeFix.Resource\"\n        xmlns:avalonedit=\"http://icsharpcode.net/sharpdevelop/avalonedit\"\n        mc:Ignorable=\"d\"\n        Title=\"CodeEditWindow\" SizeToContent=\"WidthAndHeight\"\n        WindowStyle=\"ToolWindow\">\n    <Grid>\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"*\" />\n            <RowDefinition Height=\"Auto\" />\n        </Grid.RowDefinitions>\n        <avalonedit:TextEditor\n            Grid.Row=\"0\"\n            Name=\"CodeEditor\"\n            ShowLineNumbers=\"True\"\n            SyntaxHighlighting=\"C#\"\n            FontFamily=\"Global Monospace\" />\n        <Button Grid.Row=\"1\"\n                Content=\"{x:Static res:Resource.CodeEditWindow_Compile}\"\n                Margin=\"5\"\n                Click=\"Compile_OnClick\" />\n    </Grid>\n</Window>"
  },
  {
    "path": "PhotoTimeFix/Window/CodeEditWindow.xaml.cs",
    "content": "﻿using System;\nusing System.Windows;\nusing CSScriptLib;\nusing PhotoTimeFix.Util;\nusing PhotoTimeFix.ViewBinding;\n\nnamespace PhotoTimeFix.Window\n{\n    public partial class CodeEditWindow : System.Windows.Window\n    {\n        private MainWindowBinding _binding;\n\n        public CodeEditWindow()\n        {\n            InitializeComponent();\n        }\n\n        public MainWindowBinding Binding\n        {\n            set => _binding = value;\n        }\n\n        private async void Compile_OnClick(object sender, RoutedEventArgs e)\n        {\n            try\n            {\n                var code = CodeEditor.Text;\n                await ProcessBarWindow.StartTask(action =>\n                {\n                    _binding.FileProcessor = (IFileProcessor) CSScript.Evaluator.LoadCode(code);\n                    MessageBox.Show(Resource.Resource.CodeEditWindow_CompileSuccess);\n                    action.Invoke();\n                });\n            }\n            catch (Exception ex)\n            {\n                MessageBox.Show(ex.Message);\n            }\n        }\n    }\n}"
  },
  {
    "path": "PhotoTimeFix/Window/ImageWindow.xaml",
    "content": "﻿<Window x:Class=\"PhotoTimeFix.Window.ImageWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        mc:Ignorable=\"d\"\n        WindowStyle=\"ToolWindow\"\n        SizeToContent=\"WidthAndHeight\">\n    <Image Name=\"ImageView\" />\n\n</Window>"
  },
  {
    "path": "PhotoTimeFix/Window/ImageWindow.xaml.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Windows.Media.Imaging;\n\nnamespace PhotoTimeFix.Window\n{\n    /// <summary>\n    ///     ImageWindow.xaml 的交互逻辑\n    /// </summary>\n    public partial class ImageWindow : System.Windows.Window\n    {\n        public ImageWindow(string path)\n        {\n            InitializeComponent();\n            Title = new FileInfo(path).Name;\n            ImageView.Source = new BitmapImage(new Uri(path));\n        }\n    }\n}"
  },
  {
    "path": "PhotoTimeFix/Window/MainWindow.xaml",
    "content": "﻿<Window x:Class=\"PhotoTimeFix.Window.MainWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:res=\"clr-namespace:PhotoTimeFix.Resource\"\n        xmlns:viewBinding=\"clr-namespace:PhotoTimeFix.ViewBinding\"\n        xmlns:materialDesign=\"http://materialdesigninxaml.net/winfx/xaml/themes\"\n        xmlns:util=\"clr-namespace:PhotoTimeFix.Util\"\n        mc:Ignorable=\"d\"\n        Title=\"{x:Static res:Resource.App_Name}\"\n        TextElement.Foreground=\"{DynamicResource MaterialDesignBody}\"\n        Background=\"{DynamicResource MaterialDesignPaper}\"\n        SizeToContent=\"WidthAndHeight\">\n\n    <Window.Resources>\n        <viewBinding:MainWindowBinding x:Key=\"MainWindowBinding\" />\n    </Window.Resources>\n\n    <Grid\n        Name=\"TopGrid\"\n        DataContext=\"{StaticResource MainWindowBinding}\"\n        Margin=\"10\"\n        ShowGridLines=\"{Binding Path=IsDebug}\"\n        LayoutUpdated=\"Grid_OnLayoutUpdated\"\n        AllowDrop=\"True\" DragEnter=\"Grid_DragEnter\" Drop=\"Grid_Drop\">\n        <Grid.ColumnDefinitions>\n            <ColumnDefinition Width=\"Auto\" />\n            <ColumnDefinition Width=\"Auto\" />\n            <ColumnDefinition Width=\"*\" />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"Auto\" />\n            <RowDefinition Height=\"*\" />\n        </Grid.RowDefinitions>\n        <materialDesign:Card Padding=\"20\" Margin=\"10\" Grid.Row=\"0\" Grid.ColumnSpan=\"3\" Grid.Column=\"0\" Height=\"auto\" \n                             Name=\"SelectCard\">\n            <Grid HorizontalAlignment=\"Center\" Name=\"SelectStackPanel\">\n                <Grid.ColumnDefinitions>\n                    <ColumnDefinition Width=\"*\" />\n                    <ColumnDefinition Width=\"Auto\" />\n                    <ColumnDefinition Width=\"Auto\" />\n                </Grid.ColumnDefinitions>\n                <TextBox Grid.Column=\"0\" AllowDrop=\"True\" PreviewDragOver=\"Grid_DragEnter\" PreviewDrop=\"Grid_Drop\" \n                         materialDesign:HintAssist.Hint=\"{x:Static res:Resource.MainWindow_FolderFilePath}\" TextWrapping=\"Wrap\" Cursor=\"IBeam\"\n                         TextChanged=\"PathTextBox_OnTextChanged\" Name=\"PathTextBox\"\n                         HorizontalContentAlignment=\"Stretch\" HorizontalAlignment=\"Stretch\"\n                         HorizontalScrollBarVisibility=\"Hidden\" MinWidth=\"200\" MaxWidth=\"1000\">\n                    <TextBox.Text>\n                        <Binding\n                            Path=\"FilePath\"\n                            UpdateSourceTrigger=\"PropertyChanged\">\n                            <Binding.ValidationRules>\n                                <util:FileExistValidationRule\n                                    ValidatesOnTargetUpdated=\"True\" />\n                            </Binding.ValidationRules>\n                        </Binding>\n                    </TextBox.Text>\n                </TextBox>\n                <Button Grid.Column=\"1\" Click=\"FileButton_OnClick\" Cursor=\"Hand\" Margin=\"10,0,10,0\">\n                    <materialDesign:PackIcon Kind=\"FileImage\" />\n                </Button>\n                <Button Grid.Column=\"2\" Click=\"DictionaryButton_OnClick\" Cursor=\"Hand\">\n                    <materialDesign:PackIcon Kind=\"Folder\" />\n                </Button>\n            </Grid>\n        </materialDesign:Card>\n        <StackPanel Name =\"Panel1\"  Grid.Row=\"1\" Grid.Column=\"0\">\n            <materialDesign:Card Margin=\"10\" Padding=\"10\" Visibility=\"{Binding Path=PathExist}\">\n                <StackPanel>\n                    <Grid Visibility=\"{Binding Path=IsFile}\">\n                        <Grid.ColumnDefinitions>\n                            <ColumnDefinition Width=\"Auto\" />\n                            <ColumnDefinition Width=\"Auto\" />\n                            <ColumnDefinition Width=\"Auto\" />\n                        </Grid.ColumnDefinitions>\n                        <Grid.RowDefinitions>\n                            <RowDefinition Height=\"Auto\" />\n                            <RowDefinition Height=\"Auto\" />\n                            <RowDefinition Height=\"Auto\" />\n                        </Grid.RowDefinitions>\n                        <Label Grid.Column=\"0\" Grid.Row=\"0\" Content=\"{x:Static res:Resource.MainWindow_CurrentCreationTime}\" VerticalAlignment=\"Center\" />\n                        <TextBox Grid.Column=\"1\" Grid.ColumnSpan=\"2\" Grid.Row=\"0\" Margin=\"10\" IsEnabled=\"False\"\n                                 Name=\"CurrentCreateTime\" />\n                        <Label Grid.Column=\"0\" Grid.Row=\"1\" Content=\"{x:Static res:Resource.MainWindow_CurrentModificationTime}\" VerticalAlignment=\"Center\" />\n                        <TextBox Grid.Column=\"1\" Grid.ColumnSpan=\"2\" Grid.Row=\"1\" Margin=\"10\" IsEnabled=\"False\"\n                                 Name=\"CurrentModifyTime\" />\n                        <Label Grid.Column=\"0\" Grid.Row=\"2\" Content=\"{x:Static res:Resource.MainWIndow_NewTime}\" VerticalAlignment=\"Center\" />\n                        <DatePicker Grid.Column=\"1\" Grid.Row=\"2\" MinWidth=\"100\"\n                                    Style=\"{StaticResource MaterialDesignFloatingHintDatePicker}\"\n                                    VerticalAlignment=\"Bottom\" Margin=\"10\" Width=\"Auto\"\n                                    SelectedDate=\"{Binding Path=NowDate}\" />\n                        <materialDesign:TimePicker Grid.Column=\"2\" Grid.Row=\"2\" Is24Hours=\"True\" WithSeconds=\"True\"\n                                                   MinWidth=\"100\" Margin=\"10\" VerticalAlignment=\"Bottom\" Width=\"Auto\"\n                                                   SelectedTime=\"{Binding Path=NowTime}\" />\n                    </Grid>\n                    <Button\n                        Click=\"EditCode_OnClick\"\n                        Margin=\"5\"\n                        Content=\"{x:Static res:Resource.MainWindow_CustomFileProcessingClass}\"\n                        Style=\"{StaticResource MaterialDesignFlatButton}\" />\n                    <Button\n                        IsEnabled=\"{Binding Path=StartEnabled}\"\n                        Click=\"Start_OnClick\"\n                        Margin=\"5\"\n                        Content=\"{x:Static res:Resource.MainWindow_Start}\" />\n                </StackPanel>\n            </materialDesign:Card>\n            <materialDesign:Card Margin=\"10\" Padding=\"10\">\n                <Grid Name=\"SettingContainer\" ShowGridLines=\"{Binding Path=IsDebug}\">\n                    <Grid.ColumnDefinitions>\n                        <ColumnDefinition Width=\"Auto\" />\n                        <ColumnDefinition Width=\"Auto\" />\n                    </Grid.ColumnDefinitions>\n                </Grid>\n            </materialDesign:Card>\n        </StackPanel>\n        <StackPanel Name=\"Panel2\" Grid.Row=\"1\" Grid.Column=\"1\">\n            <materialDesign:Card Margin=\"10\" Padding=\"10\" Visibility=\"{Binding Path=PathExist}\">\n                <Grid>\n                    <Grid.ColumnDefinitions>\n                        <ColumnDefinition Width=\"Auto\" />\n                        <ColumnDefinition Width=\"*\" />\n                        <ColumnDefinition Width=\"Auto\" />\n                    </Grid.ColumnDefinitions>\n                    <GroupBox Header=\"Source\" Style=\"{x:Null}\" Grid.Column=\"0\">\n                        <StackPanel>\n                            <CheckBox Name=\"ExifSourceCheck\" Content=\"EXIF\" Margin=\"10\" IsChecked=\"True\" Checked=\"SourceDestPanel_Checked\" Unchecked=\"SourceDestPanel_Checked\"/>\n                            <CheckBox Name=\"FileNameSourceCheck\" Content=\"{x:Static res:Resource.MainWindow_FileName}\" Margin=\"10\" IsChecked=\"True\" Checked=\"SourceDestPanel_Checked\" Unchecked=\"SourceDestPanel_Checked\"/>\n                            <CheckBox Name=\"FileSystemSourceCheck\" Content=\"{x:Static res:Resource.MainWindow_FileSystem}\" Margin=\"10\" IsEnabled=\"False\" Checked=\"SourceDestPanel_Checked\" Unchecked=\"SourceDestPanel_Checked\"/>\n                        </StackPanel>\n                    </GroupBox>\n                    <Label Content=\"=>\"\n                           FontSize=\"18pt\"\n                           Margin=\"10\"\n                           Grid.Column=\"1\"\n                           FontFamily=\"Global Monospace\"\n                           HorizontalContentAlignment=\"Center\"\n                           VerticalContentAlignment=\"Center\" />\n                    <GroupBox Header=\"Dest\" Style=\"{x:Null}\" Grid.Column=\"2\">\n                        <StackPanel>\n                            <CheckBox Name=\"ExifDestCheck\" Content=\"EXIF\" Margin=\"10\" IsEnabled=\"False\" Checked=\"SourceDestPanel_Checked\" Unchecked=\"SourceDestPanel_Checked\"/>\n                            <CheckBox Name=\"FileNameDestCheck\" Content=\"{x:Static res:Resource.MainWindow_FileName}\" Margin=\"10\" IsEnabled=\"False\" Checked=\"SourceDestPanel_Checked\" Unchecked=\"SourceDestPanel_Checked\"/>\n                            <CheckBox Name=\"FileSystemDestCheck\" Content=\"{x:Static res:Resource.MainWindow_FileSystem}\" Margin=\"10\" IsChecked=\"True\" Checked=\"SourceDestPanel_Checked\" Unchecked=\"SourceDestPanel_Checked\"/>\n                        </StackPanel>\n                    </GroupBox>\n                </Grid>\n            </materialDesign:Card>\n            <materialDesign:Card Margin=\"10\" Padding=\"10\">\n                <StackPanel>\n                    <Grid ShowGridLines=\"{Binding Path=IsDebug}\">\n                        <Grid.ColumnDefinitions>\n                            <ColumnDefinition Width=\"Auto\" />\n                            <ColumnDefinition Width=\"Auto\" />\n                        </Grid.ColumnDefinitions>\n                        <Grid.RowDefinitions>\n                            <RowDefinition Height=\"Auto\" />\n                            <RowDefinition Height=\"Auto\" />\n                        </Grid.RowDefinitions>\n                        <Label Content=\"{x:Static res:Resource.MainWindow_CurrentUser}\" Grid.Column=\"0\" Grid.Row=\"0\" />\n                        <Label Name=\"UserNameText\" Grid.Column=\"1\" Grid.Row=\"0\" />\n                        <Label Content=\"{x:Static res:Resource.MainWindow_CurrentUserGroup}\" Grid.Column=\"0\" Grid.Row=\"1\" />\n                        <Label Name=\"GroupText\" Grid.Column=\"1\" Grid.Row=\"1\" />\n                    </Grid>\n                    <Button\n                        Margin=\"5\"\n                        Name=\"RunAsAdminButton\"\n                        Style=\"{StaticResource MaterialDesignOutlinedButton}\"\n                        Content=\"{x:Static res:Resource.MainWindow_RunAsAdmin}\"\n                        Click=\"RunAsAdmin_OnClick\" />\n                    <Button\n                        Margin=\"5\"\n                        Name=\"RunAsTrustInstallerButton\"\n                        Style=\"{StaticResource MaterialDesignOutlinedButton}\"\n                        Content=\"{x:Static res:Resource.MainWindow_RunAsTrustInstaller}\"\n                        Click=\"RunAsTrustInstaller_OnClick\" />\n                </StackPanel>\n            </materialDesign:Card>\n            <materialDesign:Card Margin=\"10\" Padding=\"10\">\n                <StackPanel Orientation=\"Vertical\">\n                    <Grid ShowGridLines=\"{Binding Path=IsDebug}\">\n                        <Grid.ColumnDefinitions>\n                            <ColumnDefinition Width=\"Auto\" />\n                            <ColumnDefinition Width=\"Auto\" />\n                        </Grid.ColumnDefinitions>\n                        <Grid.RowDefinitions>\n                            <RowDefinition Height=\"Auto\" />\n                            <RowDefinition Height=\"Auto\" />\n                            <RowDefinition Height=\"Auto\" />\n                        </Grid.RowDefinitions>\n                        <Label Content=\"{x:Static res:Resource.About_Author}\" Grid.Column=\"0\" Grid.Row=\"0\" />\n                        <Label Content=\"{x:Static res:Resource.About_Neuron}\" Grid.Column=\"1\" Grid.Row=\"0\" />\n                        <Label Content=\"{x:Static res:Resource.About_OpenSourceLink}\" Grid.Column=\"0\" Grid.Row=\"1\" />\n                        <TextBlock Grid.Column=\"1\" Grid.Row=\"1\">\n                            <Hyperlink NavigateUri=\"https://github.com/Cryolitia/PhotoTimeFix\" Click=\"Hyperlink_Click\">\n                                https://github.com/Cryolitia/PhotoTimeFix\n                            </Hyperlink>\n                        </TextBlock>\n                        <Label Grid.Column=\"0\" Grid.Row=\"2\" Content=\"{x:Static res:Resource.About_Telegram}\" />\n                        <TextBlock Grid.Column=\"1\" Grid.Row=\"2\">\n                            <Hyperlink NavigateUri=\"https://t.me/NeuronDevelopChannel\" Click=\"Hyperlink_Click\">\n                                某元的原神頻道\n                            </Hyperlink>\n                        </TextBlock>\n                    </Grid>\n                    <Button\n                        x:Name=\"OpenSourceLicense\"\n                        Margin=\"5\"\n                        ToolTip=\"{x:Static res:Resource.About_ThanksToOpenSource}\"\n                        Style=\"{StaticResource MaterialDesignOutlinedButton}\"\n                        Content=\"{x:Static res:Resource.About_OpenSourceLicense}\" Cursor=\"Hand\" Click=\"OpenSourceLicense_Click\" />\n                </StackPanel>\n            </materialDesign:Card>\n        </StackPanel>\n        <materialDesign:Card\n            Grid.Row=\"1\"\n            Grid.RowSpan=\"2\"\n            Grid.Column=\"2\"\n            Margin=\"10\"\n            Padding=\"10\"\n            Visibility=\"{Binding Path=IsFile}\"\n            Name=\"DetailCard\">\n            <StackPanel>\n                <ListBox\n                    Name=\"DetailListBox\"\n                    SelectionMode=\"Multiple\"\n                    SelectionChanged=\"DetailListBox_OnSelectionChanged\"\n                    Margin=\"0,0,0,10\"\n                    Style=\"{StaticResource MaterialDesignFilterChipPrimaryOutlineListBox}\"\n                    ItemsSource=\"{Binding Path=DetailTags}\" />\n                <TextBox\n                    Name=\"DetailTextBox\"\n                    Style=\"{StaticResource MaterialDesignOutlinedTextBox}\"\n                    AcceptsReturn=\"True\"\n                    TextWrapping=\"Wrap\"\n                    HorizontalScrollBarVisibility=\"Visible\"\n                    VerticalScrollBarVisibility=\"Visible\"\n                    IsReadOnly=\"True\" />\n            </StackPanel>\n        </materialDesign:Card>\n    </Grid>\n\n</Window>"
  },
  {
    "path": "PhotoTimeFix/Window/MainWindow.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Drawing.Imaging;\nusing System.Globalization;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing System.Runtime.Serialization;\nusing System.Security.Principal;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Controls.Primitives;\nusing System.Windows.Documents;\nusing System.Windows.Forms;\nusing DesktopBridge;\nusing ICSharpCode.AvalonEdit;\nusing LicensesDialog;\nusing LicensesDialog.Licenses;\nusing M2.NSudo;\nusing MetadataExtractor;\nusing MetadataExtractor.Formats.Exif;\nusing MimeTypes;\nusing PhotoTimeFix.Util;\nusing PhotoTimeFix.ViewBinding;\nusing Application = System.Windows.Forms.Application;\nusing Binding = System.Windows.Data.Binding;\nusing CheckBox = System.Windows.Controls.CheckBox;\nusing DataFormats = System.Windows.DataFormats;\nusing Directory = System.IO.Directory;\nusing DragDropEffects = System.Windows.DragDropEffects;\nusing DragEventArgs = System.Windows.DragEventArgs;\nusing Image = System.Drawing.Image;\nusing Label = System.Windows.Controls.Label;\nusing MessageBox = System.Windows.MessageBox;\nusing OpenFileDialog = Microsoft.Win32.OpenFileDialog;\n\nnamespace PhotoTimeFix.Window\n{\n    /// <summary>\n    ///     Interaction logic for MainWindow.xaml\n    /// </summary>\n    public partial class MainWindow : System.Windows.Window\n    {\n        private readonly MainWindowBinding _binding;\n        private readonly SettingBinding _setting;\n\n        private Dictionary<string, string> _exifInfos = new Dictionary<string, string>();\n\n        public MainWindow()\n        {\n            InitializeComponent();\n            _binding = (MainWindowBinding)Resources[nameof(MainWindowBinding)];\n            ThemeHelper.InitTheme();\n\n            InitUser();\n            _setting = new SettingBinding();\n            InitSetting();\n        }\n\n        private Dictionary<string, string> ExifInfos\n        {\n            get => _exifInfos;\n            set\n            {\n                _exifInfos = value;\n                _binding.DetailTags = value.Keys;\n                DetailTextBox.Text = \"\";\n            }\n        }\n\n        private void InitUser()\n        {\n            var identity = WindowsIdentity.GetCurrent();\n            UserNameText.Content = identity.Name;\n            var principal = new WindowsPrincipal(identity);\n            var wbirFields = Enum.GetValues(typeof(WindowsBuiltInRole));\n            var groups = \"\";\n            foreach (WindowsBuiltInRole roleName in wbirFields)\n                if (principal.IsInRole(roleName))\n                    groups += roleName.ToString() + '\\n';\n\n            GroupText.Content = groups;\n\n            var windowsPrincipal = new WindowsPrincipal(identity);\n\n            if (new Helpers().IsRunningAsUwp())\n            {\n                RunAsAdminButton.Visibility = Visibility.Collapsed;\n                RunAsTrustInstallerButton.Visibility = Visibility.Collapsed;\n            }\n            else if (windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator))\n            {\n                RunAsAdminButton.Visibility = Visibility.Collapsed;\n            }\n            else\n            {\n                RunAsTrustInstallerButton.Visibility = Visibility.Collapsed;\n            }\n        }\n\n        private void InitSetting()\n        {\n            var i = 0;\n            foreach (var info in typeof(SettingBinding).GetProperties())\n            {\n                var attribute = info.GetCustomAttribute<SettingItemAttribute>();\n                if (attribute != null)\n                {\n                    var label = new Label();\n                    label.Content = attribute.Name;\n                    label.ToolTip = attribute.Summary;\n                    label.Margin = new Thickness(5, 5, 0, 5);\n                    var button = new ToggleButton();\n                    button.IsChecked = (bool)info.GetValue(_setting);\n                    button.Style = (Style)FindResource(\"MaterialDesignSwitchToggleButton\");\n                    button.Margin = new Thickness(0, 5, 5, 5);\n                    var binding = new Binding(info.Name);\n                    binding.Source = _setting;\n                    button.SetBinding(ToggleButton.IsCheckedProperty, binding);\n                    SettingContainer.RowDefinitions.Add(new RowDefinition());\n                    SettingContainer.Children.Add(label);\n                    SettingContainer.Children.Add(button);\n                    Grid.SetColumn(label, 0);\n                    Grid.SetRow(label, i);\n                    Grid.SetColumn(button, 1);\n                    Grid.SetRow(button, i);\n                    i++;\n                }\n            }\n        }\n\n        private void FileButton_OnClick(object sender, RoutedEventArgs e)\n        {\n            var dialog = new OpenFileDialog();\n            if (dialog.ShowDialog() ?? false) _binding.FilePath = dialog.FileName;\n        }\n\n        private void DictionaryButton_OnClick(object sender, RoutedEventArgs e)\n        {\n            var dialog = new FolderBrowserDialog();\n            if (dialog.ShowDialog().Equals(System.Windows.Forms.DialogResult.OK))\n                _binding.FilePath = dialog.SelectedPath;\n        }\n\n        private void Grid_OnLayoutUpdated(object sender, EventArgs e)\n        {\n            var height = DetailCard.ActualHeight - DetailListBox.ActualHeight - 30d;\n            if (height > 0) DetailTextBox.Height = height;\n\n            var minWidth = Panel1.ActualWidth + Panel2.ActualWidth + 30d;\n            var minHeight = SelectCard.ActualHeight + Math.Max(Panel1.ActualHeight, Panel2.ActualHeight) + 60d;\n            if (DetailCard.Visibility == Visibility.Visible) minWidth += 480d;\n            MinWidth = minWidth;\n            MinHeight = minHeight;\n        }\n\n        private async void PathTextBox_OnTextChanged(object sender, TextChangedEventArgs e)\n        {\n            var value = PathTextBox.Text;\n            if (File.Exists(value))\n            {\n                await ProcessBarWindow.StartTask(action =>\n                {\n                    Dispatcher.Invoke(async () =>\n                    {\n                        await UpdateCurrentTime(true, action);\n                        if (File.Exists(value))\n                        {\n                            _binding.IsFile = Visibility.Visible;\n                            _binding.PathExist = Visibility.Visible;\n                            await UpdateExif(value);\n                            DetailListBox.SelectAll();\n                            if (_setting.ShowMedia) ShowImage(value);\n                        }\n                    });\n                });\n            }\n            else\n            {\n                if (Directory.Exists(value))\n                    _binding.PathExist = Visibility.Visible;\n                else\n                    _binding.PathExist = Visibility.Collapsed;\n                _binding.IsFile = Visibility.Collapsed;\n                ExifInfos = new Dictionary<string, string>();\n                DetailTextBox.Text = \"\";\n            }\n        }\n\n        private async Task UpdateCurrentTime(bool resetNow = true, Action action = null)\n        {\n            var path = PathTextBox.Text;\n            if (resetNow)\n            {\n                _binding.NowDate = null;\n                _binding.NowTime = null;\n            }\n\n            if (File.Exists(path))\n            {\n                var info = new FileInfo(path);\n\n                CurrentCreateTime.Text = info.CreationTime.ToString(CultureInfo.CurrentCulture);\n                CurrentModifyTime.Text = info.LastWriteTime.ToString(CultureInfo.CurrentCulture);\n\n                try\n                {\n                    var dateTime = await TryGetDatetimeFromFile(info);\n                    _binding.NowDate = dateTime;\n                    _binding.NowTime = dateTime;\n                }\n                catch (Exception e)\n                {\n                    MessageBox.Show(e.Message);\n                }\n            }\n            else\n            {\n                CurrentCreateTime.Text = \"\";\n                CurrentModifyTime.Text = \"\";\n            }\n\n            action?.Invoke();\n        }\n\n        private async Task UpdateExif(string path)\n        {\n            var dictionary = new Dictionary<string, string>();\n            try\n            {\n                var directories = await Task.Run(() => ImageMetadataReader.ReadMetadata(path));\n                try\n                {\n                    var subIfdDirectory = directories.OfType<ExifIfd0Directory>().FirstOrDefault();\n                    if (subIfdDirectory?.TryGetDateTime(ExifDirectoryBase.TagDateTime, out var dateTime) == true)\n                    {\n                        _binding.NowDate = dateTime;\n                        _binding.NowTime = dateTime;\n                    }\n                }\n                catch (Exception e)\n                {\n                    MessageBox.Show(e.Message);\n                }\n\n                foreach (var directory in directories)\n                {\n                    var value = \"\";\n                    foreach (var tag in directory.Tags) value += $\"[{directory.Name}] {tag.Name} = {tag.Description}\\n\";\n                    if (directory.HasError)\n                        foreach (var error in directory.Errors)\n                            value += $\"ERROR: {error}\\n\";\n                    var name = directory.Name;\n                    var i = 2;\n                    var exist = dictionary.ContainsKey(name);\n                    while (dictionary.ContainsKey(name + \"-\" + i)) i++;\n                    if (exist) name += \"-\" + i;\n                    dictionary.Add(name, value);\n                }\n            }\n            catch (Exception e)\n            {\n                dictionary.Add(\"Error\", e.ToString());\n            }\n\n            ExifInfos = dictionary;\n        }\n\n        private static void ShowImage(string path)\n        {\n            try\n            {\n                var image = Image.FromFile(path);\n                var imageWindow = new ImageWindow(path);\n                imageWindow.Show();\n            }\n            catch (Exception e)\n            {\n                MessageBox.Show(e.ToString());\n            }\n        }\n\n        private void DetailListBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)\n        {\n            var value = \"\";\n            foreach (var info in ExifInfos)\n                if (DetailListBox.SelectedItems.Contains(info.Key))\n                    value += info.Value;\n            DetailTextBox.Text = value;\n        }\n\n        private void RunAsAdmin_OnClick(object sender, RoutedEventArgs args)\n        {\n            var startInfo = new ProcessStartInfo();\n            startInfo.UseShellExecute = true;\n            startInfo.WorkingDirectory = Environment.CurrentDirectory;\n            startInfo.FileName = Application.ExecutablePath;\n            startInfo.Verb = \"runas\";\n            try\n            {\n                Process.Start(startInfo);\n            }\n            catch (Exception e)\n            {\n                MessageBox.Show(e.ToString());\n            }\n\n            Close();\n            Application.Exit();\n        }\n\n        private void RunAsTrustInstaller_OnClick(object sender, RoutedEventArgs args)\n        {\n            try\n            {\n                var instance = new NSudoInstance();\n                instance.CreateProcess(\n                    NSUDO_USER_MODE_TYPE.TRUSTED_INSTALLER,\n                    NSUDO_PRIVILEGES_MODE_TYPE.ENABLE_ALL_PRIVILEGES,\n                    NSUDO_MANDATORY_LABEL_TYPE.SYSTEM,\n                    NSUDO_PROCESS_PRIORITY_CLASS_TYPE.NORMAL,\n                    NSUDO_SHOW_WINDOW_MODE_TYPE.DEFAULT,\n                    0,\n                    true,\n                    Application.ExecutablePath,\n                    Environment.CurrentDirectory\n                );\n                Close();\n                Application.Exit();\n            }\n            catch (Exception e)\n            {\n                MessageBox.Show(e.ToString());\n            }\n        }\n\n        private void Grid_DragEnter(object sender, DragEventArgs e)\n        {\n            var fileData = (Array)e.Data.GetData(DataFormats.FileDrop, true);\n            if (fileData != null && fileData.Length == 1)\n            {\n                e.Effects = DragDropEffects.Link;\n                e.Handled = true;\n            }\n            else\n            {\n                e.Effects = DragDropEffects.None;\n            }\n        }\n\n        private void Grid_Drop(object sender, DragEventArgs e)\n        {\n            try\n            {\n                var fileData = (Array)e.Data.GetData(DataFormats.FileDrop, true);\n                if (fileData != null)\n                {\n                    var fileName = fileData.GetValue(0).ToString();\n                    if (!string.IsNullOrWhiteSpace(fileName)) PathTextBox.Text = fileName;\n                    e.Handled = true;\n                }\n            }\n            catch (Exception exception)\n            {\n                MessageBox.Show(exception.ToString());\n            }\n        }\n\n        private void Hyperlink_Click(object sender, RoutedEventArgs e)\n        {\n            var link = sender as Hyperlink;\n            Process.Start(new ProcessStartInfo\n            {\n                FileName = link?.NavigateUri.AbsoluteUri ?? throw new InvalidOperationException(),\n                UseShellExecute = true\n            });\n        }\n\n        private void OpenSourceLicense_Click(object sender, RoutedEventArgs e)\n        {\n            var noticeList = new List<Notice>();\n            noticeList.Add(new Notice(\"PhotoTimeFix\", \"https://github.com/Cryolitia/PhotoTimeFix\",\n                \"Copyroght 2018-Now Cryolitia\", new MITLicense()));\n            noticeList.Add(new Notice(\"MetadataExtractor\", \"https://github.com/drewnoakes/metadata-extractor-dotnet\",\n                \"Drew Noakes\", new ApacheSoftwareLicense20()));\n            noticeList.Add(new Notice(\"Material Design In XAML Toolkit\",\n                \"https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit\", \"MaterialDesignInXAML\",\n                new MITLicense()));\n            noticeList.Add(new Notice(\"AvalonEdit\", \"https://github.com/icsharpcode/AvalonEdit\",\n                \"Copyright (c) AvalonEdit Contributors\", new MITLicense()));\n            noticeList.Add(new Notice(\"CS-Script\", \"https://github.com/oleg-shilo/cs-script\",\n                \"Copyright (c) 2018 oleg-shilo\", new MITLicense()));\n            noticeList.Add(new Notice(\"MimeTypeMap\", \"https://github.com/samuelneff/MimeTypeMap\",\n                \"Copyright (c) 2014 Samuel Neff\", new MITLicense()));\n            new LicensesDialog.LicensesDialog.Builder().SetNotices(noticeList).SetShowOwnLicense(true).Build().Show();\n        }\n\n        private async void EditCode_OnClick(object sender, RoutedEventArgs e)\n        {\n            await Dispatcher.BeginInvoke(new Action(() =>\n            {\n                var window = new CodeEditWindow();\n                var binding = new Binding(\"FileProcessorCode\");\n                binding.Source = _binding;\n                window.CodeEditor.SetBinding(TextEditor.DocumentProperty, binding);\n                window.Binding = _binding;\n                window.ShowDialog();\n            }));\n        }\n\n        private async void Start_OnClick(object sender, RoutedEventArgs e)\n        {\n            var window = new ProcessWindow(_setting.SaveLog);\n            if (_setting.SaveLog)\n            {\n                var dialog = new SaveFileDialog();\n                dialog.Title = Resource.Resource.Setting_SaveLog;\n                dialog.OverwritePrompt = true;\n                dialog.CreatePrompt = true;\n                dialog.Filter = \"Log File (*.csv)|*.csv\";\n                if (dialog.ShowDialog() != System.Windows.Forms.DialogResult.OK) return;\n                window.LogFile = dialog.FileName;\n            }\n\n            await window.ShowDialogAsync();\n            if (File.Exists(_binding.FilePath) && _binding.NowDate.HasValue && _binding.NowTime.HasValue)\n            {\n                var result = await Task.Run(() => ProcessFile(new FileInfo(_binding.FilePath),\n                    new DateTime(_binding.NowDate.Value.Year, _binding.NowDate.Value.Month,\n                        _binding.NowDate.Value.Day,\n                        _binding.NowTime.Value.Hour, _binding.NowTime.Value.Minute, _binding.NowTime.Value.Second)));\n                await Dispatcher.BeginInvoke(new Action(() => { window.ProcessResultList.Add(result); }));\n                await UpdateCurrentTime(false);\n            }\n            else if (Directory.Exists(_binding.FilePath))\n            {\n                await Task.Run(() => ProcessDirectory(new DirectoryInfo(_binding.FilePath), window.ProcessResultList));\n            }\n            await Dispatcher.BeginInvoke(new Action(() =>\n            {\n                window.Closable = true;\n            }));\n        }\n\n        private async void ProcessDirectory(DirectoryInfo info, ProcessResultList list)\n        {\n            try\n            {\n                foreach (var mInfo in info.GetDirectories()) ProcessDirectory(mInfo, list);\n                foreach (var mInfo in info.GetFiles())\n                    try\n                    {\n                        var dateTime = await TryGetDatetimeFromFile(mInfo);\n                        if (dateTime != null)\n                        {\n                            var result = ProcessFile(mInfo, dateTime.Value);\n                            await Dispatcher.BeginInvoke(new Action(() => { list.Add(result); }));\n                        }\n                        else\n                        {\n                            await Dispatcher.BeginInvoke(new Action(() =>\n                            {\n                                list.Add(mInfo.FullName, \"Null\", \"Skip\", \"\");\n                            }));\n                        }\n                    }\n                    catch (Exception e)\n                    {\n                        await Dispatcher.BeginInvoke(new Action(() =>\n                        {\n                            list.Add(mInfo.FullName, \"\", \"Error\", e.Message);\n                        }));\n                    }\n            }\n            catch (Exception e)\n            {\n                await Dispatcher.BeginInvoke(new Action(() => { list.Add(info.FullName, \"\", \"Error\", e.Message); }));\n            }\n        }\n\n        private async Task<DateTime?> TryGetDatetimeFromFile(FileInfo mInfo)\n        {\n            bool exifSource = Dispatcher.Invoke(() => { return ExifSourceCheck.IsChecked == true; });\n            bool fileNameSource = Dispatcher.Invoke(() => { return FileNameSourceCheck.IsChecked == true; });\n            bool fileSystemSource = Dispatcher.Invoke(() => { return FileSystemSourceCheck.IsChecked == true; });\n\n            IReadOnlyList<MetadataExtractor.Directory> directories = null;\n            DateTime? dateTime = null;\n            if (exifSource)\n                try\n                {\n                    directories = ImageMetadataReader.ReadMetadata(mInfo.FullName);\n                    foreach(var subIfdDirectory in directories)\n                    {\n                        if (subIfdDirectory?.TryGetDateTime(ExifDirectoryBase.TagDateTime, out var mDateTime) == true)\n                            dateTime = mDateTime;\n                        if (dateTime == null)\n                        {\n                            if (subIfdDirectory?.TryGetDateTime(ExifDirectoryBase.TagDateTimeOriginal, out var m2DateTime) == true)\n                                dateTime = m2DateTime;\n                        }\n                        if (dateTime != null)\n                        {\n                            break;\n                        }\n                    }\n                }\n                catch (Exception e)\n                {\n                    //ignore\n                }\n\n            if (fileNameSource && dateTime == null)\n                dateTime = await Task.Run(() =>\n                {\n                    var processor = _binding.FileProcessor;\n                    return processor.GetFileDateTime(mInfo);\n                });\n            if (fileSystemSource && dateTime == null)\n            {\n                dateTime = mInfo.CreationTime;\n                if (dateTime == null) dateTime = mInfo.LastWriteTime;\n            }\n\n            return dateTime;\n        }\n\n        private ProcessResult ProcessFile(FileInfo info, DateTime dateTime)\n        {\n            try\n            {\n                bool exifDest = Dispatcher.Invoke(() => { return ExifDestCheck.IsChecked == true; });\n                bool fileNameDest = Dispatcher.Invoke(() => { return FileNameDestCheck.IsChecked == true; });\n                bool fileSystemDest = Dispatcher.Invoke(() => { return FileSystemDestCheck.IsChecked == true; });\n\n                var mime = MimeTypeMap.GetMimeType(info.Extension).ToLower();\n                if (_setting.OnlyMedia && !mime.StartsWith(\"image/\") && !mime.StartsWith(\"video/\"))\n                    return new ProcessResult(info.FullName, \"\", \"Skip\", \"MINE unmatch: \" + mime);\n                if (_setting.SafetyMode && (dateTime > DateTime.Now || dateTime < new DateTime(1970, 1, 1)))\n                    return new ProcessResult(info.FullName, \"\", \"Skip\",\n                        \"Date unbelievable: \" + dateTime.ToString(CultureInfo.CurrentCulture));\n                if (fileSystemDest)\n                {\n                    info.CreationTime = dateTime;\n                    info.LastWriteTime = dateTime;\n                }\n\n                if (exifDest)\n                {\n                    var image = Image.FromFile(info.FullName);\n                    // https://stackoverflow.com/questions/18820525/how-to-get-and-set-propertyitems-for-an-image\n                    var item = (PropertyItem)FormatterServices.GetUninitializedObject(typeof(PropertyItem));\n                    // https://learn.microsoft.com/zh-cn/windows/win32/gdiplus/-gdiplus-constant-property-item-descriptions#propertytagdatetime\n                    item.Id = 0x0132;\n                    // https://github.com/microsoft/win32metadata/blob/1ba2527a59da3f1c1b4809bb053d03f300af3c09/generation/WinSDK/RecompiledIdlHeaders/um/gdiplusimaging.h#L302\n                    item.Type = 2;\n                    item.Value = Encoding.ASCII.GetBytes(dateTime.ToString(\"yyyy:MM:dd HH:mm:ss\"));\n                    item.Len = item.Value.Length;\n                    image.SetPropertyItem(item);\n                    var name = info.DirectoryName + \"\\\\new_\" + info.Name;\n                    if (fileNameDest)\n                        name = info.DirectoryName + \"\\\\\" + dateTime.ToString(\"yyyy-MM-dd HHmmss\") + info.Extension;\n                    image.Save(name);\n                    if (_binding.IsFile == Visibility)\n                        Dispatcher.Invoke(() => { PathTextBox.Text = name; });\n                }\n\n                if (!exifDest && fileNameDest)\n                {\n                    var name = info.DirectoryName + \"\\\\\" + dateTime.ToString(\"yyyy-MM-dd HHmmss\") + \" \" + info.Name;\n                    info.MoveTo(name);\n                    if (_binding.IsFile == Visibility)\n                        Dispatcher.Invoke(() => { PathTextBox.Text = name; });\n                }\n\n                return new ProcessResult(info.FullName, dateTime.ToString(CultureInfo.CurrentCulture), \"Success\", \"\");\n            }\n            catch (Exception e)\n            {\n                return new ProcessResult(info.FullName, \"\", \"Error\", e.Message);\n            }\n        }\n\n        private async void SourceDestPanel_Checked(object sender, RoutedEventArgs e)\n        {\n            if (ExifSourceCheck == null || ExifDestCheck == null || FileNameSourceCheck == null ||\n                FileNameDestCheck == null || FileSystemSourceCheck == null || FileSystemDestCheck == null) return;\n            if (sender is CheckBox)\n            {\n                var sender1 = sender as CheckBox;\n                if (sender1.Name == ExifSourceCheck.Name)\n                {\n                    await ProcessSourceDestPanel(ExifSourceCheck, ExifDestCheck);\n                }\n                else if (sender1.Name == ExifDestCheck.Name)\n                {\n                    MessageBox.Show(Resource.Resource.Warning_EXIF);\n                    await ProcessSourceDestPanel(ExifDestCheck, ExifSourceCheck);\n                }\n                else if (sender1.Name == FileNameSourceCheck.Name)\n                {\n                    await ProcessSourceDestPanel(FileNameSourceCheck, FileNameDestCheck);\n                }\n                else if (sender1.Name == FileNameDestCheck.Name)\n                {\n                    await ProcessSourceDestPanel(FileNameDestCheck, FileNameSourceCheck);\n                }\n                else if (sender1.Name == FileSystemSourceCheck.Name)\n                {\n                    await ProcessSourceDestPanel(FileSystemSourceCheck, FileSystemDestCheck);\n                }\n                else if (sender1.Name == FileSystemDestCheck.Name)\n                {\n                    await ProcessSourceDestPanel(FileSystemDestCheck, FileSystemSourceCheck);\n                }\n            }\n        }\n\n        private async Task ProcessSourceDestPanel(CheckBox source, CheckBox dest)\n        {\n            switch (source.IsChecked)\n            {\n                case true:\n                {\n                    if (dest.IsEnabled == false) return;\n                    dest.IsEnabled = false;\n                    dest.IsChecked = false;\n                    break;\n                }\n                case false:\n                {\n                    if (dest.IsEnabled) return;\n                    dest.IsEnabled = true;\n                    break;\n                }\n            }\n\n            await UpdateCurrentTime();\n        }\n    }\n}"
  },
  {
    "path": "PhotoTimeFix/Window/ProcessBarWindow.xaml",
    "content": "﻿<Window x:Class=\"PhotoTimeFix.Window.ProcessBarWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        mc:Ignorable=\"d\"\n        WindowStyle=\"None\"\n        ShowInTaskbar=\"False\"\n        Background=\"{DynamicResource MaterialDesignPaper}\"\n        Title=\"ProcessBarWindow\" SizeToContent=\"WidthAndHeight\">\n    <ProgressBar\n        Width=\"50\" Height=\"50\"\n        Style=\"{StaticResource MaterialDesignCircularProgressBar}\"\n        Value=\"0\"\n        IsIndeterminate=\"True\" />\n</Window>"
  },
  {
    "path": "PhotoTimeFix/Window/ProcessBarWindow.xaml.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\nusing System.Threading.Tasks;\nusing System.Windows;\n\nnamespace PhotoTimeFix.Window\n{\n    public partial class ProcessBarWindow : System.Windows.Window\n    {\n        public bool Closable;\n\n        private ProcessBarWindow()\n        {\n            InitializeComponent();\n        }\n\n        public static async Task StartTask(Action<Action> action)\n        {\n            var window = new ProcessBarWindow();\n            try\n            {\n                await window.Dispatcher.BeginInvoke(new Func<Task>(async () => { await window.ShowDialogAsync(); }));\n                await Task.WhenAll(Task.Run(() =>\n                {\n                    action.Invoke(() =>\n                    {\n                        window.Closable = true;\n                        window.Dispatcher.BeginInvoke(new Action(window.Close));\n                    });\n                }));\n            }\n            catch (Exception e)\n            {\n                MessageBox.Show(e.Message);\n                window.Close();\n            }\n        }\n\n        public async Task ShowDialogAsync()\n        {\n            await Task.Run(() => { Dispatcher.BeginInvoke(new Action(() => { ShowDialog(); })); });\n        }\n\n        protected override void OnClosing(CancelEventArgs e)\n        {\n            if (Closable)\n                base.OnClosing(e);\n            else\n                e.Cancel = true;\n        }\n    }\n}"
  },
  {
    "path": "PhotoTimeFix/Window/ProcessWindow.xaml",
    "content": "﻿<Window x:Class=\"PhotoTimeFix.Window.ProcessWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:res=\"clr-namespace:PhotoTimeFix.Resource\"\n        xmlns:util=\"clr-namespace:PhotoTimeFix.Util\"\n        Background=\"{DynamicResource MaterialDesignPaper}\"\n        mc:Ignorable=\"d\"\n        WindowStyle=\"ToolWindow\"\n        Title=\"ProcessWindow\"\n        SizeToContent=\"WidthAndHeight\">\n    <Window.Resources>\n        <util:ProcessResultList x:Key=\"ProcessResultList\" />\n    </Window.Resources>\n    <Grid>\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"Auto\" />\n            <RowDefinition Height=\"Auto\" />\n            <RowDefinition Height=\"*\" />\n        </Grid.RowDefinitions>\n        <ProgressBar Grid.Row=\"0\" Name=\"ProgressBar\" IsIndeterminate=\"True\" MinWidth=\"200\" MinHeight=\"10\" Margin=\"0,5,0,5\" />\n        <Label Grid.Row=\"1\" Name=\"ProcessingNow\" Margin=\"0,10,0,10\" />\n        <ListView Grid.Row=\"2\"\n                  ScrollViewer.HorizontalScrollBarVisibility=\"Visible\"\n                  ScrollViewer.VerticalScrollBarVisibility=\"Visible\"\n                  Margin=\"0\"\n                  Visibility=\"Collapsed\"\n                  Name=\"ListView\"\n                  ItemsSource=\"{Binding Source={StaticResource ProcessResultList}}\"\n                  VirtualizingPanel.VirtualizationMode=\"Recycling\"\n                  VirtualizingPanel.IsVirtualizing=\"True\" >\n            <ListView.View>\n                <GridView>\n                    <GridViewColumn DisplayMemberBinding=\"{Binding Path=FileName}\" Header=\"{x:Static res:Resource.ProcessWindow_File}\" />\n                    <GridViewColumn DisplayMemberBinding=\"{Binding Path=Status}\" Header=\"{x:Static res:Resource.ProcessWindow_Status}\" />\n                    <GridViewColumn DisplayMemberBinding=\"{Binding Path=DateTime}\" Header=\"{x:Static res:Resource.ProcessWindow_NewTime}\" />\n                    <GridViewColumn DisplayMemberBinding=\"{Binding Path=Detail}\" Header=\"{x:Static res:Resource.ProcessWindow_Detail}\" />\n                </GridView>\n            </ListView.View>\n        </ListView>\n    </Grid>\n</Window>"
  },
  {
    "path": "PhotoTimeFix/Window/ProcessWindow.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.IO;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing MaterialDesignThemes.Wpf;\nusing PhotoTimeFix.Util;\n\nnamespace PhotoTimeFix.Window\n{\n    public partial class ProcessWindow : System.Windows.Window\n    {\n        private bool _closable;\n        private FileStream _logFile;\n        private UTF8Encoding utF8Encoding = new UTF8Encoding();\n        Dictionary<string, int> result = new Dictionary<string, int>();\n\n        public ProcessWindow(bool saveFile)\n        {\n            InitializeComponent();\n            MaxHeight = SystemParameters.WorkArea.Height;\n            MaxWidth = SystemParameters.WorkArea.Width;\n\n            ProcessResultList.CollectionChanged += (sender, args) =>\n            {\n                if (args.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)\n                {\n                    StringBuilder builder = null;\n                    foreach (var item in args.NewItems)\n                    {\n                        if (item is ProcessResult)\n                        {\n                            var item1 = item as ProcessResult;\n\n                            if (result.ContainsKey(item1.Status))\n                            {\n                                result[item1.Status] += 1;\n                            }\n                            else\n                            {\n                                result[item1.Status] = 1;\n                            }\n\n                            builder = new StringBuilder();\n                            builder.Append(item1.FileName);\n                            if (item1.DateTime != \"\")\n                            {\n                                builder.Append(\"\\t\\t=>\\t\\t\");\n                                builder.Append(item1.DateTime);\n                            }\n                        }\n                    }\n                    Dispatcher.BeginInvoke(new Action(() => {\n                        if (!Closable)\n                        {\n                            if (builder != null)\n                            {\n                                ProcessingNow.Content = builder.ToString();\n                            }\n                        }\n                        else\n                        {\n                            StringBuilder builder1 = new StringBuilder();\n                            foreach (var item in result)\n                            {\n                                builder1.Append(item.Key);\n                                builder1.Append(\": \");\n                                builder1.Append(item.Value);\n                                builder1.Append(\"\\t\\t\");\n                            }\n                            ProcessingNow.Content = builder1.ToString();\n                        }\n                    }));\n                }\n            };\n\n            if (saveFile)\n            {\n                ProcessResultList.CollectionChanged += (sender, args) =>\n                {\n                    if (args.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)\n                    {\n                        var builder = new StringBuilder();\n                        foreach (var item in args.NewItems)\n                        {\n                            if (item is ProcessResult)\n                            {\n                                var item1 = item as ProcessResult;\n                                builder.Append(item1.FileName);\n                                builder.Append(',');\n                                builder.Append(item1.Status);\n                                builder.Append(',');\n                                builder.Append(item1.DateTime);\n                                builder.Append(',');\n                                builder.Append(item1.Detail);\n                                builder.AppendLine();\n                            }\n                        }\n                        try\n                        {\n                            byte[] bytes = utF8Encoding.GetBytes(builder.ToString());\n                            _logFile.WriteAsync(bytes, 0, bytes.Length) ;\n                        }\n                        catch(Exception e)\n                        {\n                            //ignore\n                        }\n                    }\n                };\n            }\n        }\n\n        public string LogFile\n        {\n            set\n            {\n                _logFile = File.OpenWrite(value);\n            }\n        }\n\n        public bool Closable\n        {\n            get => _closable;\n            set\n            {\n                _closable = value;\n                ProgressBar.Visibility = value ? Visibility.Collapsed : Visibility.Visible;\n                ListView.Visibility = Visibility.Visible;\n\n                StringBuilder builder = new StringBuilder();\n                foreach(var item in result)\n                {\n                    builder.Append(item.Key);\n                    builder.Append(\": \");\n                    builder.Append(item.Value);\n                    builder.Append(\"\\t\\t\");\n                }\n                ProcessingNow.Content = builder.ToString();\n\n                if (_logFile != null)\n                {\n                    try\n                    {\n                        _logFile.Dispose();\n                    }\n                    catch(Exception e)\n                    {\n                        //ignore\n                    }\n                }\n                MessageBox.Show(\"OK\");\n            }\n        }\n\n        public ProcessResultList ProcessResultList => FindResource(\"ProcessResultList\") as ProcessResultList;\n\n        public async Task ShowDialogAsync()\n        {\n            await Task.Run(() => { Dispatcher.BeginInvoke(new Action(() => { ShowDialog(); })); });\n        }\n\n        protected override void OnClosing(CancelEventArgs e)\n        {\n            if (Closable)\n                base.OnClosing(e);\n            else\n                e.Cancel = true;\n        }\n    }\n}"
  },
  {
    "path": "PhotoTimeFix/app.manifest",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<assembly manifestVersion=\"1.0\" xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n  <assemblyIdentity version=\"1.0.0.0\" name=\"MyApplication.app\"/>\n  <trustInfo xmlns=\"urn:schemas-microsoft-com:asm.v2\">\n    <security>\n      <requestedPrivileges xmlns=\"urn:schemas-microsoft-com:asm.v3\">\n        <!-- UAC 清单选项\n             如果想要更改 Windows 用户帐户控制级别，请使用\n             以下节点之一替换 requestedExecutionLevel 节点。n\n        <requestedExecutionLevel  level=\"asInvoker\" uiAccess=\"false\" />\n        <requestedExecutionLevel  level=\"requireAdministrator\" uiAccess=\"false\" />\n        <requestedExecutionLevel  level=\"highestAvailable\" uiAccess=\"false\" />\n\n            指定 requestedExecutionLevel 元素将禁用文件和注册表虚拟化。\n            如果你的应用程序需要此虚拟化来实现向后兼容性，则删除此\n            元素。\n        -->\n        <requestedExecutionLevel level=\"asInvoker\" uiAccess=\"false\" />\n      </requestedPrivileges>\n    </security>\n  </trustInfo>\n\n  <compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\">\n    <application>\n      <!-- 设计此应用程序与其一起工作且已针对此应用程序进行测试的\n           Windows 版本的列表。取消评论适当的元素，\n           Windows 将自动选择最兼容的环境。 -->\n\n      <!-- Windows Vista -->\n      <!--<supportedOS Id=\"{e2011457-1546-43c5-a5fe-008deee3d3f0}\" />-->\n\n      <!-- Windows 7 -->\n      <!--<supportedOS Id=\"{35138b9a-5d96-4fbd-8e2d-a2440225f93a}\" />-->\n\n      <!-- Windows 8 -->\n      <!--<supportedOS Id=\"{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}\" />-->\n\n      <!-- Windows 8.1 -->\n      <!--<supportedOS Id=\"{1f676c76-80e1-4239-95bb-83d0f6d0da78}\" />-->\n\n      <!-- Windows 10 -->\n      <!--<supportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\" />-->\n\n    </application>\n  </compatibility>\n\n  <!-- 指示该应用程序可感知 DPI 且 Windows 在 DPI 较高时将不会对其进行\n       自动缩放。Windows Presentation Foundation (WPF)应用程序自动感知 DPI，无需\n       选择加入。选择加入此设置的 Windows 窗体应用程序(面向 .NET Framework 4.6)还应\n       在其 app.config 中将 \"EnableWindowsFormsHighDpiAutoResizing\" 设置设置为 \"true\"。\n       \n       将应用程序设为感知长路径。请参阅 https://docs.microsoft.com/windows/win32/fileio/maximum-file-path-limitation -->\n  <application xmlns=\"urn:schemas-microsoft-com:asm.v3\">\n    <windowsSettings>\n      <dpiAware xmlns=\"http://schemas.microsoft.com/SMI/2005/WindowsSettings\">true</dpiAware>\n      <dpiAwareness xmlns=\"http://schemas.microsoft.com/SMI/2016/WindowsSettings\">system</dpiAwareness>\n      <longPathAware xmlns=\"http://schemas.microsoft.com/SMI/2016/WindowsSettings\">true</longPathAware>\n    </windowsSettings>\n  </application>\n\n  <!-- 启用 Windows 公共控件和对话框的主题(Windows XP 和更高版本) -->\n  <dependency>\n    <dependentAssembly>\n      <assemblyIdentity\n          type=\"win32\"\n          name=\"Microsoft.Windows.Common-Controls\"\n          version=\"6.0.0.0\"\n          processorArchitecture=\"*\"\n          publicKeyToken=\"6595b64144ccf1df\"\n          language=\"*\"\n        />\n    </dependentAssembly>\n  </dependency>\n\n</assembly>\n"
  },
  {
    "path": "PhotoTimeFix.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.0.32112.339\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"PhotoTimeFix\", \"PhotoTimeFix\\PhotoTimeFix.csproj\", \"{CB9D52F9-1DEA-4A5F-97B9-B2B46C2F2125}\"\nEndProject\nProject(\"{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}\") = \"WapProject\", \"WapProject\\WapProject.wapproj\", \"{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|ARM = Debug|ARM\n\t\tDebug|ARM64 = Debug|ARM64\n\t\tDebug|x64 = Debug|x64\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|ARM = Release|ARM\n\t\tRelease|ARM64 = Release|ARM64\n\t\tRelease|x64 = Release|x64\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{CB9D52F9-1DEA-4A5F-97B9-B2B46C2F2125}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{CB9D52F9-1DEA-4A5F-97B9-B2B46C2F2125}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{CB9D52F9-1DEA-4A5F-97B9-B2B46C2F2125}.Debug|ARM.ActiveCfg = Debug|Any CPU\n\t\t{CB9D52F9-1DEA-4A5F-97B9-B2B46C2F2125}.Debug|ARM.Build.0 = Debug|Any CPU\n\t\t{CB9D52F9-1DEA-4A5F-97B9-B2B46C2F2125}.Debug|ARM64.ActiveCfg = Debug|Any CPU\n\t\t{CB9D52F9-1DEA-4A5F-97B9-B2B46C2F2125}.Debug|ARM64.Build.0 = Debug|Any CPU\n\t\t{CB9D52F9-1DEA-4A5F-97B9-B2B46C2F2125}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{CB9D52F9-1DEA-4A5F-97B9-B2B46C2F2125}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{CB9D52F9-1DEA-4A5F-97B9-B2B46C2F2125}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{CB9D52F9-1DEA-4A5F-97B9-B2B46C2F2125}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{CB9D52F9-1DEA-4A5F-97B9-B2B46C2F2125}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{CB9D52F9-1DEA-4A5F-97B9-B2B46C2F2125}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{CB9D52F9-1DEA-4A5F-97B9-B2B46C2F2125}.Release|ARM.ActiveCfg = Release|Any CPU\n\t\t{CB9D52F9-1DEA-4A5F-97B9-B2B46C2F2125}.Release|ARM.Build.0 = Release|Any CPU\n\t\t{CB9D52F9-1DEA-4A5F-97B9-B2B46C2F2125}.Release|ARM64.ActiveCfg = Release|Any CPU\n\t\t{CB9D52F9-1DEA-4A5F-97B9-B2B46C2F2125}.Release|ARM64.Build.0 = Release|Any CPU\n\t\t{CB9D52F9-1DEA-4A5F-97B9-B2B46C2F2125}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{CB9D52F9-1DEA-4A5F-97B9-B2B46C2F2125}.Release|x64.Build.0 = Release|Any CPU\n\t\t{CB9D52F9-1DEA-4A5F-97B9-B2B46C2F2125}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{CB9D52F9-1DEA-4A5F-97B9-B2B46C2F2125}.Release|x86.Build.0 = Release|Any CPU\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Debug|Any CPU.Deploy.0 = Debug|Any CPU\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Debug|ARM.Deploy.0 = Debug|ARM\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Debug|ARM64.ActiveCfg = Debug|ARM64\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Debug|ARM64.Build.0 = Debug|ARM64\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Debug|ARM64.Deploy.0 = Debug|ARM64\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Debug|x64.Build.0 = Debug|x64\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Debug|x64.Deploy.0 = Debug|x64\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Debug|x86.Build.0 = Debug|x86\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Debug|x86.Deploy.0 = Debug|x86\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Release|Any CPU.Deploy.0 = Release|Any CPU\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Release|ARM.Build.0 = Release|ARM\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Release|ARM.Deploy.0 = Release|ARM\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Release|ARM64.ActiveCfg = Release|ARM64\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Release|ARM64.Build.0 = Release|ARM64\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Release|ARM64.Deploy.0 = Release|ARM64\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Release|x64.ActiveCfg = Release|x64\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Release|x64.Build.0 = Release|x64\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Release|x64.Deploy.0 = Release|x64\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Release|x86.ActiveCfg = Release|x86\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Release|x86.Build.0 = Release|x86\n\t\t{A662AFBB-D12B-4B79-AEC8-C85F430ADD7D}.Release|x86.Deploy.0 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {F90C5A59-1D30-4824-AFD3-2824C966DD53}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "README.md",
    "content": "# PhotoTimeFix (WPF)\n\n![platform](https://img.shields.io/badge/platform-Windows-blue.svg)\n![language](https://img.shields.io/badge/language-CSahrp-green.svg)\n![license](https://img.shields.io/badge/license-MIT-orange.svg)\n\n<a href=\"https://www.microsoft.com/store/apps/9NFL0WD4NJXP\"><img height=80px src=\"./artwork/English_getitfromMS.png\"></img></a>\n\n一个简单的小程序以通过文件名(或Exif)修复照片/屏幕截图的时间错误\n\nAn easy program aimed to fix photo's timestamp incorrect by filename/Exif\n\n您是否曾经在备份照片后面对整齐划一的时间戳变成了今天的成千上万张照片不知所措？快来试试吧，这个软件可以通过文件名和文件中的Exif数据来恢复文件的时间戳，还支持自定义精确时间和批处理。永久开源免费！\n\n* 现代的Material Design界面设计，自动适应系统主题（仅支持Windows 10 1903+）\n* 自动尝试解析文件名和Exif信息\n* 丰富的Exif元数据查看\n* 完整的C#脚本支持，图灵完备的语言让您可以以任何自己想要的方式处理照片\n* 内置NSudo，允许您两键即可最高以 `Trust Installer` 权限运行\n* 完全永久的开源免费\n\n![宣传图](./artwork/2.jpg)\n\n![1](./artwork/wpf-cn-1.png)\n\n![1](./artwork/wpf-cn-2.png)\n"
  },
  {
    "path": "WapProject/.gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore\n\n# User-specific files\n*.rsuser\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/\n\n# Visual Studio 2015/2017 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# Visual Studio 2017 auto generated files\nGenerated\\ Files/\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# Benchmark Results\nBenchmarkDotNet.Artifacts/\n\n# .NET Core\nproject.lock.json\nproject.fragment.lock.json\nartifacts/\n\n# StyleCop\nStyleCopReport.xml\n\n# Files built by Visual Studio\n*_i.c\n*_p.c\n*_h.h\n*.ilk\n*.meta\n*.obj\n*.iobj\n*.pch\n*.pdb\n*.ipdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*_wpftmp.csproj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# Visual Studio Trace Files\n*.e2e\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# AxoCover is a Code Coverage Tool\n.axoCover/*\n!.axoCover/settings.json\n\n# Visual Studio code coverage results\n*.coverage\n*.coveragexml\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# Note: Comment the next line if you want to checkin your web deploy settings,\n# but database connection strings (with potential passwords) will be unencrypted\n*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\n\n# NuGet Packages\n*.nupkg\n# The packages folder can be ignored because of Package Restore\n**/[Pp]ackages/*\n# except build/, which is used as an MSBuild target.\n!**/[Pp]ackages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/[Pp]ackages/repositories.config\n# NuGet v3's project.json files produces more ignorable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\n*.appx\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.pfx\n*.publishsettings\norleans.codegen.cs\n\n# Including strong name files can present a security risk\n# (https://github.com/github/gitignore/pull/2483#issue-259490424)\n#*.snk\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\nServiceFabricBackup/\n*.rptproj.bak\n\n# SQL Server files\n*.mdf\n*.ldf\n*.ndf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n*.rptproj.rsuser\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\nnode_modules/\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)\n*.vbw\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# JetBrains Rider\n.idea/\n*.sln.iml\n\n# CodeRush personal settings\n.cr/personal\n\n# Python Tools for Visual Studio (PTVS)\n__pycache__/\n*.pyc\n\n# Cake - Uncomment if you are using it\n# tools/**\n# !tools/packages.config\n\n# Tabs Studio\n*.tss\n\n# Telerik's JustMock configuration file\n*.jmconfig\n\n# BizTalk build output\n*.btp.cs\n*.btm.cs\n*.odx.cs\n*.xsd.cs\n\n# OpenCover UI analysis results\nOpenCover/\n\n# Azure Stream Analytics local run output\nASALocalRun/\n\n# MSBuild Binary and Structured Log\n*.binlog\n\n# NVidia Nsight GPU debugger configuration file\n*.nvuser\n\n# MFractors (Xamarin productivity tool) working folder\n.mfractor/\n\n# Local History for Visual Studio\n.localhistory/\n"
  },
  {
    "path": "WapProject/Package.appxmanifest",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<Package\n        xmlns:uap=\"http://schemas.microsoft.com/appx/manifest/uap/windows10\"\n        xmlns:rescap=\"http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities\"\n        xmlns=\"http://schemas.microsoft.com/appx/manifest/foundation/windows10\"\n        IgnorableNamespaces=\"uap rescap\">\n\n    <Identity\n            Name=\"53240singleNeuron.PhotoTimeFix\"\n            Publisher=\"CN=F77423F5-8744-4658-A772-5E96CB64C433\"\n            Version=\"1.3.3.0\"/>\n\n    <Properties>\n        <DisplayName>PhotoTimeFix</DisplayName>\n        <PublisherDisplayName>Cryolitia</PublisherDisplayName>\n        <Logo>Images\\StoreLogo.png</Logo>\n    </Properties>\n\n    <Dependencies>\n        <TargetDeviceFamily Name=\"Windows.Universal\" MinVersion=\"10.0.0.0\" MaxVersionTested=\"10.0.0.0\"/>\n        <TargetDeviceFamily Name=\"Windows.Desktop\" MinVersion=\"10.0.14393.0\" MaxVersionTested=\"10.0.14393.0\"/>\n    </Dependencies>\n\n    <Resources>\n        <Resource Language=\"en\"/>\n        <Resource Language=\"zh-hans\"/>\n        <Resource Language=\"zh-hant\"/>\n    </Resources>\n\n    <Applications>\n        <Application Id=\"App\"\n                     Executable=\"$targetnametoken$.exe\"\n                     EntryPoint=\"$targetentrypoint$\">\n            <uap:VisualElements\n                    DisplayName=\"PhotoTimeFix\"\n                    Description=\"Photo Time Fix\"\n                    BackgroundColor=\"transparent\"\n                    Square150x150Logo=\"Images\\Square150x150Logo.png\"\n                    Square44x44Logo=\"Images\\Square44x44Logo.png\">\n                <uap:DefaultTile Wide310x150Logo=\"Images\\Wide310x150Logo.png\" Square71x71Logo=\"Images\\SmallTile.png\"\n                                 Square310x310Logo=\"Images\\LargeTile.png\"/>\n                <uap:SplashScreen Image=\"Images\\SplashScreen.png\"/>\n            </uap:VisualElements>\n        </Application>\n    </Applications>\n\n    <Capabilities>\n        <Capability Name=\"internetClient\"/>\n        <rescap:Capability Name=\"runFullTrust\"/>\n        <uap:Capability Name=\"removableStorage\"/>\n        <Capability Name=\"codeGeneration\"/>\n    </Capabilities>\n</Package>\n"
  },
  {
    "path": "WapProject/WapProject.wapproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup Condition=\"'$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '15.0'\">\n    <VisualStudioVersion>15.0</VisualStudioVersion>\n  </PropertyGroup>\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|x86\">\n      <Configuration>Debug</Configuration>\n      <Platform>x86</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x86\">\n      <Configuration>Release</Configuration>\n      <Platform>x86</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|ARM\">\n      <Configuration>Debug</Configuration>\n      <Platform>ARM</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|ARM\">\n      <Configuration>Release</Configuration>\n      <Platform>ARM</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|ARM64\">\n      <Configuration>Debug</Configuration>\n      <Platform>ARM64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|ARM64\">\n      <Configuration>Release</Configuration>\n      <Platform>ARM64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|AnyCPU\">\n      <Configuration>Debug</Configuration>\n      <Platform>AnyCPU</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|AnyCPU\">\n      <Configuration>Release</Configuration>\n      <Platform>AnyCPU</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup>\n    <WapProjPath Condition=\"'$(WapProjPath)'==''\">$(MSBuildExtensionsPath)\\Microsoft\\DesktopBridge\\</WapProjPath>\n  </PropertyGroup>\n  <Import Project=\"$(WapProjPath)\\Microsoft.DesktopBridge.props\" />\n  <PropertyGroup>\n    <ProjectGuid>a662afbb-d12b-4b79-aec8-c85f430add7d</ProjectGuid>\n    <TargetPlatformVersion>10.0.22000.0</TargetPlatformVersion>\n    <TargetPlatformMinVersion>10.0.14393.0</TargetPlatformMinVersion>\n    <DefaultLanguage>zh-CN</DefaultLanguage>\n    <AppxPackageSigningEnabled>True</AppxPackageSigningEnabled>\n    <NoWarn>$(NoWarn);NU1702</NoWarn>\n    <EntryPointProjectUniqueName>..\\PhotoTimeFix\\PhotoTimeFix.csproj</EntryPointProjectUniqueName>\n    <GenerateAppInstallerFile>False</GenerateAppInstallerFile>\n    <PackageCertificateThumbprint>5907AAB205F7C8B8C6EDE56581A020B40AFE0434</PackageCertificateThumbprint>\n    <AppxPackageSigningTimestampDigestAlgorithm>SHA256</AppxPackageSigningTimestampDigestAlgorithm>\n    <AppxAutoIncrementPackageRevision>False</AppxAutoIncrementPackageRevision>\n    <GenerateTestArtifacts>False</GenerateTestArtifacts>\n    <AppxBundlePlatforms>neutral</AppxBundlePlatforms>\n    <HoursBetweenUpdateChecks>0</HoursBetweenUpdateChecks>\n    <GenerateTemporaryStoreCertificate>True</GenerateTemporaryStoreCertificate>\n    <UserSecretsId>e6ae2838-0ea9-4ca4-b878-de86c2133071</UserSecretsId>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM'\">\n    <AppxBundle>Always</AppxBundle>\n    <DefaultLanguage>en</DefaultLanguage>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM'\">\n    <AppxBundle>Always</AppxBundle>\n    <DefaultLanguage>en</DefaultLanguage>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x86'\">\n    <AppxBundle>Always</AppxBundle>\n    <DefaultLanguage>en</DefaultLanguage>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <AppxBundle>Always</AppxBundle>\n    <DefaultLanguage>en</DefaultLanguage>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|AnyCPU'\">\n    <AppxBundle>Always</AppxBundle>\n    <DefaultLanguage>en</DefaultLanguage>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">\n    <AppxBundle>Always</AppxBundle>\n    <DefaultLanguage>en</DefaultLanguage>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x86'\">\n    <AppxBundle>Always</AppxBundle>\n    <DefaultLanguage>en</DefaultLanguage>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <AppxBundle>Always</AppxBundle>\n    <DefaultLanguage>en</DefaultLanguage>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|AnyCPU'\">\n    <AppxBundle>Always</AppxBundle>\n    <DefaultLanguage>en</DefaultLanguage>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">\n    <AppxBundle>Always</AppxBundle>\n    <DefaultLanguage>en</DefaultLanguage>\n  </PropertyGroup>\n  <ItemGroup>\n    <AppxManifest Include=\"Package.appxmanifest\">\n      <SubType>Designer</SubType>\n    </AppxManifest>\n  </ItemGroup>\n  <Import Project=\"$(WapProjPath)\\Microsoft.DesktopBridge.targets\" />\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Windows.SDK.BuildTools\" Version=\"10.0.26100.1742\" PrivateAssets=\"all\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\PhotoTimeFix\\PhotoTimeFix.csproj\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Images\\LargeTile.scale-100.png\" />\n    <Content Include=\"Images\\LargeTile.scale-200.png\" />\n    <Content Include=\"Images\\LargeTile.scale-400.png\" />\n    <Content Include=\"Images\\SmallTile.scale-100.png\" />\n    <Content Include=\"Images\\SmallTile.scale-200.png\" />\n    <Content Include=\"Images\\SmallTile.scale-400.png\" />\n    <Content Include=\"Images\\SplashScreen.scale-100.png\" />\n    <Content Include=\"Images\\SplashScreen.scale-200.png\" />\n    <Content Include=\"Images\\SplashScreen.scale-400.png\" />\n    <Content Include=\"Images\\Square150x150Logo.scale-100.png\" />\n    <Content Include=\"Images\\Square150x150Logo.scale-200.png\" />\n    <Content Include=\"Images\\Square150x150Logo.scale-400.png\" />\n    <Content Include=\"Images\\Square44x44Logo.altform-lightunplated_targetsize-16.png\" />\n    <Content Include=\"Images\\Square44x44Logo.altform-lightunplated_targetsize-256.png\" />\n    <Content Include=\"Images\\Square44x44Logo.altform-lightunplated_targetsize-48.png\" />\n    <Content Include=\"Images\\Square44x44Logo.altform-unplated_targetsize-16.png\" />\n    <Content Include=\"Images\\Square44x44Logo.altform-unplated_targetsize-256.png\" />\n    <Content Include=\"Images\\Square44x44Logo.altform-unplated_targetsize-48.png\" />\n    <Content Include=\"Images\\Square44x44Logo.scale-100.png\" />\n    <Content Include=\"Images\\Square44x44Logo.scale-200.png\" />\n    <Content Include=\"Images\\Square44x44Logo.scale-400.png\" />\n    <Content Include=\"Images\\Square44x44Logo.targetsize-16.png\" />\n    <Content Include=\"Images\\Square44x44Logo.targetsize-256.png\" />\n    <Content Include=\"Images\\Square44x44Logo.targetsize-48.png\" />\n    <Content Include=\"Images\\StoreLogo.scale-100.png\" />\n    <Content Include=\"Images\\StoreLogo.scale-200.png\" />\n    <Content Include=\"Images\\StoreLogo.scale-400.png\" />\n    <Content Include=\"Images\\Wide310x150Logo.scale-100.png\" />\n    <Content Include=\"Images\\Wide310x150Logo.scale-200.png\" />\n    <Content Include=\"Images\\Wide310x150Logo.scale-400.png\" />\n    <None Include=\"Package.StoreAssociation.xml\" />\n    <None Include=\"WapProject_TemporaryKey.pfx\" />\n  </ItemGroup>\n</Project>"
  }
]