├── TODO.md ├── PECmd ├── PcDesktopConfigure.ico ├── FodyWeavers.xml ├── Properties │ └── AssemblyInfo.cs ├── PECmd.csproj ├── FodyWeavers.xsd ├── Program.cs └── ExternalFiles.cs ├── .idea └── .idea.PECmd │ └── .idea │ ├── encodings.xml │ ├── vcs.xml │ ├── indexLayout.xml │ └── .gitignore ├── LICENSE ├── PECmd.sln ├── .gitattributes ├── README.md ├── .gitignore └── PECmd.saproj /TODO.md: -------------------------------------------------------------------------------- 1 | - detect OS and warn if less than Windows 8 Re: Windows 10 files 2 | -------------------------------------------------------------------------------- /PECmd/PcDesktopConfigure.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EricZimmerman/PECmd/HEAD/PECmd/PcDesktopConfigure.ico -------------------------------------------------------------------------------- /PECmd/FodyWeavers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.idea/.idea.PECmd/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.idea/.idea.PECmd/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/.idea.PECmd/.idea/indexLayout.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/.idea.PECmd/.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Rider ignored files 5 | /projectSettingsUpdater.xml 6 | /.idea.PECmd.iml 7 | /modules.xml 8 | /contentModel.xml 9 | # Editor-based HTTP Client requests 10 | /httpRequests/ 11 | # Datasource local storage ignored files 12 | /dataSources/ 13 | /dataSources.local.xml 14 | -------------------------------------------------------------------------------- /PECmd/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | [assembly: AssemblyTrademark("saericzimmerman@gmail.com")] 5 | 6 | // Setting ComVisible to false makes the types in this assembly not visible 7 | // to COM components. If you need to access a type in this assembly from 8 | // COM, set the ComVisible attribute to true on that type. 9 | 10 | [assembly: ComVisible(false)] 11 | 12 | // The following GUID is for the ID of the typelib if this project is exposed to COM 13 | 14 | [assembly: Guid("c928c55d-bec3-42cd-a775-bbb19c00f2bb")] -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Eric 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /PECmd.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.29009.5 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PECmd", "PECmd\PECmd.csproj", "{C928C55D-BEC3-42CD-A775-BBB19C00F2BB}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {C928C55D-BEC3-42CD-A775-BBB19C00F2BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {C928C55D-BEC3-42CD-A775-BBB19C00F2BB}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {C928C55D-BEC3-42CD-A775-BBB19C00F2BB}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {C928C55D-BEC3-42CD-A775-BBB19C00F2BB}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {BF3CFD80-33FF-4388-AC41-71A6FD96A6DA} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /PECmd/PECmd.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | Exe 4 | net462;net6.0;net9.0 5 | true 6 | PECmd 7 | Eric Zimmerman 8 | PECmd 9 | Prefetch Explorer Command Line Edition 10 | Eric Zimmerman 11 | 10 12 | 1.5.1 13 | true 14 | 15 | 16 | PcDesktopConfigure.ico 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | all 34 | 35 | 36 | 37 | 38 | all 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PECmd 2 | 3 | ## Command Line Interface 4 | 5 | PECmd version 1.4.0.0 6 | 7 | Author: Eric Zimmerman (saericzimmerman@gmail.com) 8 | https://github.com/EricZimmerman/PECmd 9 | 10 | d Directory to recursively process. Either this or -f is required 11 | f File to process. Either this or -d is required 12 | k Comma separated list of keywords to highlight in output. By default, 'temp' and 'tmp' are highlighted. Any additional keywords will be added to these. 13 | o When specified, save prefetch file bytes to the given path. Useful to look at decompressed Win10 files 14 | q Do not dump full details about each file processed. Speeds up processing when using --json or --csv. Default is FALSE 15 | 16 | json Directory to save json representation to. 17 | jsonf File name to save JSON formatted results to. When present, overrides default name 18 | csv Directory to save CSV results to. Be sure to include the full path in double quotes 19 | csvf File name to save CSV formatted results to. When present, overrides default name 20 | html Directory to save xhtml formatted results to. Be sure to include the full path in double quotes 21 | dt The custom date/time format to use when displaying timestamps. See https://goo.gl/CNVq0k for options. Default is: yyyy-MM-dd HH:mm:ss 22 | mp When true, display higher precision for timestamps. Default is FALSE 23 | 24 | vss Process all Volume Shadow Copies that exist on drive specified by -f or -d . Default is FALSE 25 | dedupe Deduplicate -f or -d & VSCs based on SHA-1. First file found wins. Default is TRUE 26 | 27 | debug Show debug information during processing 28 | trace Show trace information during processing 29 | 30 | Examples: PECmd.exe -f "C:\Temp\CALC.EXE-3FBEF7FD.pf" 31 | PECmd.exe -f "C:\Temp\CALC.EXE-3FBEF7FD.pf" --json "D:\jsonOutput" --jsonpretty 32 | PECmd.exe -d "C:\Temp" -k "system32, fonts" 33 | PECmd.exe -d "C:\Temp" --csv "c:\temp" --csvf foo.csv --json c:\temp\json 34 | PECmd.exe -d "C:\Windows\Prefetch" 35 | 36 | Short options (single letter) are prefixed with a single dash. Long commands are prefixed with two dashes 37 | 38 | ## Documentation 39 | 40 | If you are running less than Windows 8 you will NOT be able to process Windows 10 prefetch files. 41 | 42 | [Windows Prefetch parser in C#](https://binaryforay.blogspot.com/2016/01/windows-prefetch-parser-in-c.html) 43 | [Introducing PECmd!](https://binaryforay.blogspot.com/2016/01/introducing-pecmd.html) 44 | [PECmd v0.6.0.0 released](https://binaryforay.blogspot.com/2016/01/pecmd-v0600-released.html) 45 | [PECmd, LECmd, and JLECmd updated!](https://binaryforay.blogspot.com/2016/03/pecmd-lecmd-and-jlecmd-updated.html) 46 | 47 | # Download Eric Zimmerman's Tools 48 | 49 | All of Eric Zimmerman's tools can be downloaded [here](https://ericzimmerman.github.io/#!index.md). 50 | 51 | # Special Thanks 52 | 53 | Open Source Development funding and support provided by the following contributors: 54 | - [SANS Institute](http://sans.org/) and [SANS DFIR](http://dfir.sans.org/). 55 | - [Tines](https://www.tines.com/?utm_source=oss&utm_medium=sponsorship&utm_campaign=ericzimmerman) 56 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | 10 | # User-specific files (MonoDevelop/Xamarin Studio) 11 | *.userprefs 12 | 13 | # Build results 14 | [Dd]ebug/ 15 | [Dd]ebugPublic/ 16 | [Rr]elease/ 17 | [Rr]eleases/ 18 | x64/ 19 | x86/ 20 | build/ 21 | bld/ 22 | [Bb]in/ 23 | [Oo]bj/ 24 | 25 | # Visual Studio 2015 cache/options directory 26 | .vs/ 27 | 28 | # MSTest test Results 29 | [Tt]est[Rr]esult*/ 30 | [Bb]uild[Ll]og.* 31 | 32 | # NUNIT 33 | *.VisualState.xml 34 | TestResult.xml 35 | 36 | # Build Results of an ATL Project 37 | [Dd]ebugPS/ 38 | [Rr]eleasePS/ 39 | dlldata.c 40 | 41 | # DNX 42 | project.lock.json 43 | artifacts/ 44 | 45 | *_i.c 46 | *_p.c 47 | *_i.h 48 | *.ilk 49 | *.meta 50 | *.obj 51 | *.pch 52 | *.pdb 53 | *.pgc 54 | *.pgd 55 | *.rsp 56 | *.sbr 57 | *.tlb 58 | *.tli 59 | *.tlh 60 | *.tmp 61 | *.tmp_proj 62 | *.log 63 | *.vspscc 64 | *.vssscc 65 | .builds 66 | *.pidb 67 | *.svclog 68 | *.scc 69 | 70 | # Chutzpah Test files 71 | _Chutzpah* 72 | 73 | # Visual C++ cache files 74 | ipch/ 75 | *.aps 76 | *.ncb 77 | *.opensdf 78 | *.sdf 79 | *.cachefile 80 | 81 | # Visual Studio profiler 82 | *.psess 83 | *.vsp 84 | *.vspx 85 | 86 | # TFS 2012 Local Workspace 87 | $tf/ 88 | 89 | # Guidance Automation Toolkit 90 | *.gpState 91 | 92 | # ReSharper is a .NET coding add-in 93 | _ReSharper*/ 94 | *.[Rr]e[Ss]harper 95 | *.DotSettings.user 96 | 97 | # JustCode is a .NET coding add-in 98 | .JustCode 99 | 100 | # TeamCity is a build add-in 101 | _TeamCity* 102 | 103 | # DotCover is a Code Coverage Tool 104 | *.dotCover 105 | 106 | # NCrunch 107 | _NCrunch_* 108 | .*crunch*.local.xml 109 | 110 | # MightyMoose 111 | *.mm.* 112 | AutoTest.Net/ 113 | 114 | # Web workbench (sass) 115 | .sass-cache/ 116 | 117 | # Installshield output folder 118 | [Ee]xpress/ 119 | 120 | # DocProject is a documentation generator add-in 121 | DocProject/buildhelp/ 122 | DocProject/Help/*.HxT 123 | DocProject/Help/*.HxC 124 | DocProject/Help/*.hhc 125 | DocProject/Help/*.hhk 126 | DocProject/Help/*.hhp 127 | DocProject/Help/Html2 128 | DocProject/Help/html 129 | 130 | # Click-Once directory 131 | publish/ 132 | 133 | # Publish Web Output 134 | *.[Pp]ublish.xml 135 | *.azurePubxml 136 | ## TODO: Comment the next line if you want to checkin your 137 | ## web deploy settings but do note that will include unencrypted 138 | ## passwords 139 | #*.pubxml 140 | 141 | *.publishproj 142 | 143 | # NuGet Packages 144 | *.nupkg 145 | # The packages folder can be ignored because of Package Restore 146 | **/packages/* 147 | # except build/, which is used as an MSBuild target. 148 | !**/packages/build/ 149 | # Uncomment if necessary however generally it will be regenerated when needed 150 | #!**/packages/repositories.config 151 | 152 | # Windows Azure Build Output 153 | csx/ 154 | *.build.csdef 155 | 156 | # Windows Store app package directory 157 | AppPackages/ 158 | 159 | # Visual Studio cache files 160 | # files ending in .cache can be ignored 161 | *.[Cc]ache 162 | # but keep track of directories ending in .cache 163 | !*.[Cc]ache/ 164 | 165 | # Others 166 | ClientBin/ 167 | [Ss]tyle[Cc]op.* 168 | ~$* 169 | *~ 170 | *.dbmdl 171 | *.dbproj.schemaview 172 | *.pfx 173 | *.publishsettings 174 | node_modules/ 175 | orleans.codegen.cs 176 | 177 | # RIA/Silverlight projects 178 | Generated_Code/ 179 | 180 | # Backup & report files from converting an old project file 181 | # to a newer Visual Studio version. Backup files are not needed, 182 | # because we have git ;-) 183 | _UpgradeReport_Files/ 184 | Backup*/ 185 | UpgradeLog*.XML 186 | UpgradeLog*.htm 187 | 188 | # SQL Server files 189 | *.mdf 190 | *.ldf 191 | 192 | # Business Intelligence projects 193 | *.rdl.data 194 | *.bim.layout 195 | *.bim_*.settings 196 | 197 | # Microsoft Fakes 198 | FakesAssemblies/ 199 | 200 | # Node.js Tools for Visual Studio 201 | .ntvs_analysis.dat 202 | 203 | # Visual Studio 6 build log 204 | *.plg 205 | 206 | # Visual Studio 6 workspace options file 207 | *.opt 208 | 209 | # LightSwitch generated files 210 | GeneratedArtifacts/ 211 | _Pvt_Extensions/ 212 | ModelManifest.xml 213 | -------------------------------------------------------------------------------- /PECmd/FodyWeavers.xsd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks 13 | 14 | 15 | 16 | 17 | A list of assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks. 18 | 19 | 20 | 21 | 22 | A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks 23 | 24 | 25 | 26 | 27 | A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks. 28 | 29 | 30 | 31 | 32 | Obsolete, use UnmanagedWinX86Assemblies instead 33 | 34 | 35 | 36 | 37 | A list of unmanaged X86 (32 bit) assembly names to include, delimited with line breaks. 38 | 39 | 40 | 41 | 42 | Obsolete, use UnmanagedWinX64Assemblies instead. 43 | 44 | 45 | 46 | 47 | A list of unmanaged X64 (64 bit) assembly names to include, delimited with line breaks. 48 | 49 | 50 | 51 | 52 | A list of unmanaged Arm64 (64 bit) assembly names to include, delimited with line breaks. 53 | 54 | 55 | 56 | 57 | The order of preloaded assemblies, delimited with line breaks. 58 | 59 | 60 | 61 | 62 | 63 | This will copy embedded files to disk before loading them into memory. This is helpful for some scenarios that expected an assembly to be loaded from a physical file. 64 | 65 | 66 | 67 | 68 | Controls if .pdbs for reference assemblies are also embedded. 69 | 70 | 71 | 72 | 73 | Controls if runtime assemblies are also embedded. 74 | 75 | 76 | 77 | 78 | Controls whether the runtime assemblies are embedded with their full path or only with their assembly name. 79 | 80 | 81 | 82 | 83 | Embedded assemblies are compressed by default, and uncompressed when they are loaded. You can turn compression off with this option. 84 | 85 | 86 | 87 | 88 | As part of Costura, embedded assemblies are no longer included as part of the build. This cleanup can be turned off. 89 | 90 | 91 | 92 | 93 | The attach method no longer subscribes to the `AppDomain.AssemblyResolve` (.NET 4.x) and `AssemblyLoadContext.Resolving` (.NET 6.0+) events. 94 | 95 | 96 | 97 | 98 | Costura by default will load as part of the module initialization. This flag disables that behavior. Make sure you call CosturaUtility.Initialize() somewhere in your code. 99 | 100 | 101 | 102 | 103 | Costura will by default use assemblies with a name like 'resources.dll' as a satellite resource and prepend the output path. This flag disables that behavior. 104 | 105 | 106 | 107 | 108 | A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with | 109 | 110 | 111 | 112 | 113 | A list of assembly names to include from the default action of "embed all Copy Local references", delimited with |. 114 | 115 | 116 | 117 | 118 | A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with | 119 | 120 | 121 | 122 | 123 | A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with |. 124 | 125 | 126 | 127 | 128 | Obsolete, use UnmanagedWinX86Assemblies instead 129 | 130 | 131 | 132 | 133 | A list of unmanaged X86 (32 bit) assembly names to include, delimited with |. 134 | 135 | 136 | 137 | 138 | Obsolete, use UnmanagedWinX64Assemblies instead 139 | 140 | 141 | 142 | 143 | A list of unmanaged X64 (64 bit) assembly names to include, delimited with |. 144 | 145 | 146 | 147 | 148 | A list of unmanaged Arm64 (64 bit) assembly names to include, delimited with |. 149 | 150 | 151 | 152 | 153 | The order of preloaded assemblies, delimited with |. 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. 162 | 163 | 164 | 165 | 166 | A comma-separated list of error codes that can be safely ignored in assembly verification. 167 | 168 | 169 | 170 | 171 | 'false' to turn off automatic generation of the XML Schema file. 172 | 173 | 174 | 175 | 176 | -------------------------------------------------------------------------------- /PECmd.saproj: -------------------------------------------------------------------------------- 1 | 2 | .\PECmd\bin\Release\PECmd.exe 3 | PECmd 4 | Eric Zimmerman 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | PECmd 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | -------------------------------------------------------------------------------- /PECmd/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.CommandLine; 4 | using System.CommandLine.Help; 5 | using System.CommandLine.NamingConventionBinder; 6 | using System.ComponentModel; 7 | using System.Diagnostics; 8 | using System.Globalization; 9 | using System.IO; 10 | using System.Linq; 11 | using System.Reflection; 12 | using System.Runtime.InteropServices; 13 | using System.Security.Principal; 14 | using System.Text; 15 | using System.Threading.Tasks; 16 | using System.Xml; 17 | using Exceptionless; 18 | 19 | using Prefetch; 20 | using RawCopy; 21 | using Serilog; 22 | using Serilog.Core; 23 | using Serilog.Events; 24 | using ServiceStack; 25 | using ServiceStack.Text; 26 | using CsvWriter = CsvHelper.CsvWriter; 27 | using Version = Prefetch.Version; 28 | #if NET462 29 | using Directory = Alphaleonis.Win32.Filesystem.Directory; 30 | using File = Alphaleonis.Win32.Filesystem.File; 31 | using FileInfo = Alphaleonis.Win32.Filesystem.FileInfo; 32 | using Path = Alphaleonis.Win32.Filesystem.Path; 33 | #else 34 | using Directory = System.IO.Directory; 35 | using File = System.IO.File; 36 | using Path = System.IO.Path; 37 | #endif 38 | 39 | namespace PECmd; 40 | 41 | internal class Program 42 | { 43 | private const string VssDir = @"C:\___vssMount"; 44 | 45 | private static readonly string PreciseTimeFormat = "yyyy-MM-dd HH:mm:ss.fffffff"; 46 | 47 | private static string ActiveDateTimeFormat; 48 | 49 | private static HashSet _keywords; 50 | 51 | private static List _failedFiles; 52 | 53 | private static List _processedFiles; 54 | 55 | private static readonly string Header = 56 | $"PECmd version {Assembly.GetExecutingAssembly().GetName().Version}" + 57 | "\r\n\r\nAuthor: Eric Zimmerman (saericzimmerman@gmail.com)" + 58 | "\r\nhttps://github.com/EricZimmerman/PECmd"; 59 | 60 | private static readonly string Footer = @"Examples: PECmd.exe -f ""C:\Temp\CALC.EXE-3FBEF7FD.pf""" + "\r\n\t " + 61 | @" PECmd.exe -f ""C:\Temp\CALC.EXE-3FBEF7FD.pf"" --json ""D:\jsonOutput""" + 62 | "\r\n\t " + 63 | @" PECmd.exe -d ""C:\Temp"" -k ""system32, fonts""" + "\r\n\t " + 64 | @" PECmd.exe -d ""C:\Temp"" --csv ""c:\temp"" --csvf foo.csv --json c:\temp\json" + 65 | "\r\n\t " + 66 | @" PECmd.exe -d ""C:\Windows\Prefetch""" + "\r\n\t " + 67 | "\r\n\t" + 68 | " Short options (single letter) are prefixed with a single dash. Long commands are prefixed with two dashes"; 69 | 70 | private static RootCommand _rootCommand; 71 | 72 | private static readonly string BaseDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 73 | 74 | private static bool IsAdministrator() 75 | { 76 | if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) 77 | { 78 | return true; 79 | } 80 | 81 | var identity = WindowsIdentity.GetCurrent(); 82 | var principal = new WindowsPrincipal(identity); 83 | return principal.IsInRole(WindowsBuiltInRole.Administrator); 84 | } 85 | 86 | private static async Task Main(string[] args) 87 | { 88 | ExceptionlessClient.Default.Startup("x3MPpeQSBUUsXl3DjekRQ9kYjyN3cr5JuwdoOBpZ"); 89 | 90 | _keywords = new HashSet { "temp", "tmp" }; 91 | 92 | _rootCommand = new RootCommand 93 | { 94 | new Option( 95 | "-f", 96 | "File to process. Either this or -d is required"), 97 | 98 | new Option( 99 | "-d", 100 | "Directory to recursively process. Either this or -f is required"), 101 | 102 | 103 | new Option( 104 | "-k", 105 | "Comma separated list of keywords to highlight in output. By default, 'temp' and 'tmp' are highlighted. Any additional keywords will be added to these"), 106 | 107 | new Option( 108 | "-o", 109 | "When specified, save prefetch file bytes to the given path. Useful to look at decompressed Win10 files"), 110 | 111 | new Option( 112 | "-q", 113 | getDefaultValue:()=>false, 114 | "Do not dump full details about each file processed. Speeds up processing when using --json or --csv"), 115 | 116 | new Option( 117 | "--json", 118 | "Directory to save JSON formatted results to. Be sure to include the full path in double quotes"), 119 | 120 | new Option( 121 | "--jsonf", 122 | "File name to save JSON formatted results to. When present, overrides default name"), 123 | 124 | new Option( 125 | "--csv", 126 | "Directory to save CSV formatted results to. Be sure to include the full path in double quotes"), 127 | 128 | new Option( 129 | "--csvf", 130 | "File name to save CSV formatted results to. When present, overrides default name\r\n"), 131 | 132 | new Option( 133 | "--html", 134 | "Directory to save xhtml formatted results to. Be sure to include the full path in double quotes"), 135 | 136 | new Option( 137 | "--dt", 138 | getDefaultValue:()=>"yyyy-MM-dd HH:mm:ss", 139 | "The custom date/time format to use when displaying time stamps. See https://goo.gl/CNVq0k for options"), 140 | 141 | new Option( 142 | "--mp", 143 | getDefaultValue:()=>false, 144 | "When true, display higher precision for timestamps"), 145 | new Option( 146 | "--vss", 147 | getDefaultValue:()=>false, 148 | "Process all Volume Shadow Copies that exist on drive specified by -f or -d"), 149 | new Option( 150 | "--dedupe", 151 | getDefaultValue:()=>false, 152 | "Deduplicate -f or -d & VSCs based on SHA-1. First file found wins"), 153 | new Option( 154 | "--debug", 155 | getDefaultValue:()=>false, 156 | "Show debug information during processing"), 157 | new Option( 158 | "--trace", 159 | getDefaultValue:()=>false, 160 | "Show trace information during processing"), 161 | }; 162 | 163 | _rootCommand.Description = Header + "\r\n\r\n" + Footer; 164 | 165 | _rootCommand.Handler = CommandHandler.Create(DoWork); 166 | 167 | await _rootCommand.InvokeAsync(args); 168 | 169 | Log.CloseAndFlush(); 170 | } 171 | 172 | 173 | private static void DoWork(string f, string d, string k, string o, bool q, string json, string jsonf, string csv, string csvf, string html, string dt, bool mp, bool vss, bool dedupe, bool debug, bool trace) 174 | { 175 | var levelSwitch = new LoggingLevelSwitch(); 176 | 177 | ActiveDateTimeFormat = dt; 178 | 179 | if (mp) 180 | { 181 | ActiveDateTimeFormat = PreciseTimeFormat; 182 | } 183 | 184 | var formatter = 185 | new DateTimeOffsetFormatter(CultureInfo.CurrentCulture); 186 | 187 | 188 | var template = "{Message:lj}{NewLine}{Exception}"; 189 | 190 | if (debug) 191 | { 192 | levelSwitch.MinimumLevel = LogEventLevel.Debug; 193 | template = "[{Timestamp:HH:mm:ss.fff} {Level:u3}] {Message:lj}{NewLine}{Exception}"; 194 | } 195 | 196 | if (trace) 197 | { 198 | levelSwitch.MinimumLevel = LogEventLevel.Verbose; 199 | template = "[{Timestamp:HH:mm:ss.fff} {Level:u3}] {Message:lj}{NewLine}{Exception}"; 200 | } 201 | 202 | var conf = new LoggerConfiguration() 203 | .WriteTo.Console(outputTemplate: template,formatProvider: formatter) 204 | .MinimumLevel.ControlledBy(levelSwitch); 205 | 206 | Log.Logger = conf.CreateLogger(); 207 | 208 | if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) 209 | { 210 | Console.WriteLine(); 211 | Log.Fatal("Non-Windows platforms not supported due to the need to load decompression specific Windows libraries! Exiting..."); 212 | Console.WriteLine(); 213 | Environment.Exit(0); 214 | return; 215 | } 216 | 217 | if (f.IsNullOrEmpty() && d.IsNullOrEmpty()) 218 | { 219 | var helpBld = new HelpBuilder(LocalizationResources.Instance, Console.WindowWidth); 220 | var hc = new HelpContext(helpBld, _rootCommand, Console.Out); 221 | 222 | helpBld.Write(hc); 223 | 224 | Log.Warning("Either -f or -d is required. Exiting"); 225 | return; 226 | } 227 | 228 | if (f.IsNullOrEmpty() == false && 229 | !File.Exists(f)) 230 | { 231 | Log.Warning("File {F} not found. Exiting",f); 232 | return; 233 | } 234 | 235 | if (d.IsNullOrEmpty() == false && 236 | !Directory.Exists(d)) 237 | { 238 | Log.Warning("Directory {D} not found. Exiting",d); 239 | return; 240 | } 241 | 242 | if (k?.Length > 0) 243 | { 244 | var kws = k.ToLowerInvariant().Split(new[] { ',' }, 245 | StringSplitOptions.RemoveEmptyEntries); 246 | 247 | foreach (var kw in kws) 248 | { 249 | _keywords.Add(kw.Trim()); 250 | } 251 | } 252 | 253 | Log.Information("{Header}",Header); 254 | Console.WriteLine(); 255 | 256 | Log.Information("Command line: {Args}",string.Join(" ", Environment.GetCommandLineArgs().Skip(1))); 257 | 258 | if (IsAdministrator() == false) 259 | { 260 | Console.WriteLine(); 261 | Log.Information("Warning: Administrator privileges not found!"); 262 | } 263 | 264 | if (vss & (IsAdministrator() == false)) 265 | { 266 | if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) 267 | { 268 | vss = false; 269 | Log.Warning("--vss is not supported on non-Windows platforms. Disabling..."); 270 | } 271 | } 272 | 273 | if (vss & (IsAdministrator() == false)) 274 | { 275 | Log.Error("--vss is present, but administrator rights not found. Exiting"); 276 | Console.WriteLine(); 277 | return; 278 | } 279 | 280 | Console.WriteLine(); 281 | Log.Information("Keywords: {Keywords}",string.Join(", ", _keywords)); 282 | Console.WriteLine(); 283 | 284 | 285 | if (vss) 286 | { 287 | string driveLetter; 288 | if (f.IsEmpty() == false) 289 | { 290 | driveLetter = Path.GetPathRoot(Path.GetFullPath(f)) 291 | .Substring(0, 1); 292 | } 293 | else 294 | { 295 | driveLetter = Path.GetPathRoot(Path.GetFullPath(d)) 296 | .Substring(0, 1); 297 | } 298 | 299 | Helper.MountVss(driveLetter, VssDir); 300 | Console.WriteLine(); 301 | } 302 | 303 | _processedFiles = new List(); 304 | 305 | _failedFiles = new List(); 306 | 307 | if (f?.Length > 0) 308 | { 309 | try 310 | { 311 | var pf = LoadFile(f, q, ActiveDateTimeFormat); 312 | 313 | if (pf != null) 314 | { 315 | if (o.IsNullOrEmpty() == false) 316 | { 317 | try 318 | { 319 | if (Directory.Exists(Path.GetDirectoryName(o)) == 320 | false) 321 | { 322 | Directory.CreateDirectory( 323 | Path.GetDirectoryName(o)); 324 | } 325 | 326 | PrefetchFile.SavePrefetch(o, pf); 327 | Log.Information("Saved prefetch bytes to {O}",o); 328 | } 329 | catch (Exception e) 330 | { 331 | Log.Error(e,"Unable to save prefetch file. Error: {Message}",e.Message); 332 | } 333 | } 334 | 335 | _processedFiles.Add(pf); 336 | } 337 | 338 | if (vss) 339 | { 340 | var vssDirs = Directory.GetDirectories(VssDir); 341 | 342 | var root = Path.GetPathRoot(Path.GetFullPath(f)); 343 | var stem = Path.GetFullPath(f).Replace(root, ""); 344 | 345 | foreach (var vssDir in vssDirs) 346 | { 347 | var newPath = Path.Combine(vssDir, stem); 348 | if (File.Exists(newPath)) 349 | { 350 | pf = LoadFile(newPath, q, ActiveDateTimeFormat); 351 | if (pf != null) 352 | { 353 | _processedFiles.Add(pf); 354 | } 355 | } 356 | } 357 | } 358 | } 359 | catch (UnauthorizedAccessException ex) 360 | { 361 | Log.Error(ex, 362 | "Unable to access {F}. Are you running as an administrator? Error: {Message}",f,ex.Message); 363 | } 364 | catch (Exception ex) 365 | { 366 | Log.Error(ex, 367 | "Error parsing prefetch file {F}. Error: {Message}",f,ex.Message); 368 | } 369 | } 370 | else 371 | { 372 | Log.Information("Looking for prefetch files in {D}",d); 373 | Console.WriteLine(); 374 | 375 | var pfFiles = new List(); 376 | 377 | IEnumerable files2; 378 | 379 | #if !NET6_0 && !NET9_0 380 | var enumerationFilters = new Alphaleonis.Win32.Filesystem.DirectoryEnumerationFilters(); 381 | enumerationFilters.InclusionFilter = fsei => 382 | { 383 | if (fsei.Extension.ToUpperInvariant() == ".PF") 384 | { 385 | if (File.Exists(fsei.FullPath) == false) 386 | { 387 | return false; 388 | } 389 | 390 | if (fsei.FileSize == 0) 391 | { 392 | Log.Debug("Skipping {FullPath} since size is 0",fsei.FullPath); 393 | return false; 394 | } 395 | 396 | if (fsei.FullPath.ToUpperInvariant().Contains("[ROOT]")) 397 | { 398 | Log.Warning("WARNING: FTK Imager detected! Do not use FTK Imager to mount image files as it does not work properly! Use Arsenal Image Mounter instead"); 399 | return true; 400 | } 401 | 402 | var fsi = new FileInfo(fsei.FullPath); 403 | var ads = fsi.EnumerateAlternateDataStreams().Where(t => t.StreamName.Length > 0).ToList(); 404 | if (ads.Count > 0) 405 | { 406 | Log.Warning("WARNING: {FullPath} has at least one Alternate Data Stream",fsei.FullPath); 407 | foreach (var alternateDataStreamInfo in ads) 408 | { 409 | Log.Information("Name: {StreamName}",alternateDataStreamInfo.StreamName); 410 | 411 | var s = File.Open(alternateDataStreamInfo.FullPath, FileMode.Open, FileAccess.Read, 412 | FileShare.Read, Alphaleonis.Win32.Filesystem.PathFormat.LongFullPath); 413 | 414 | IPrefetch pf1 = null; 415 | 416 | try 417 | { 418 | pf1 = PrefetchFile.Open(s, $"{fsei.FullPath}:{alternateDataStreamInfo.StreamName}"); 419 | } 420 | catch (Exception e) 421 | { 422 | Log.Warning(e,"Could not process {FullPath}. Error: {Message}",fsei.FullPath,e.Message); 423 | } 424 | 425 | Log.Information("---------- Processed {FullPath} ----------",fsei.FullPath); 426 | 427 | if (pf1 != null) 428 | { 429 | if (q == false) 430 | { 431 | DisplayFile(pf1,q,ActiveDateTimeFormat); 432 | } 433 | 434 | _processedFiles.Add(pf1); 435 | } 436 | } 437 | 438 | } 439 | 440 | return true; 441 | } 442 | 443 | 444 | return false; 445 | }; 446 | 447 | enumerationFilters.RecursionFilter = entryInfo => !entryInfo.IsMountPoint && !entryInfo.IsSymbolicLink; 448 | 449 | enumerationFilters.ErrorFilter = (errorCode, errorMessage, pathProcessed) => true; 450 | 451 | var dirEnumOptions = 452 | Alphaleonis.Win32.Filesystem.DirectoryEnumerationOptions.Files | Alphaleonis.Win32.Filesystem.DirectoryEnumerationOptions.Recursive | 453 | Alphaleonis.Win32.Filesystem.DirectoryEnumerationOptions.SkipReparsePoints | Alphaleonis.Win32.Filesystem.DirectoryEnumerationOptions.ContinueOnException | 454 | Alphaleonis.Win32.Filesystem.DirectoryEnumerationOptions.BasicSearch; 455 | 456 | files2 = 457 | Directory.EnumerateFileSystemEntries(d, dirEnumOptions, enumerationFilters); 458 | 459 | #else 460 | 461 | var options = new EnumerationOptions 462 | { 463 | IgnoreInaccessible = true, 464 | MatchCasing = MatchCasing.CaseInsensitive, 465 | RecurseSubdirectories = true, 466 | AttributesToSkip = 0 467 | }; 468 | 469 | files2 = Directory.EnumerateFileSystemEntries(d, "*.pf", options); 470 | #endif 471 | 472 | 473 | try 474 | { 475 | pfFiles.AddRange(files2); 476 | 477 | if (vss) 478 | { 479 | var vssDirs = Directory.GetDirectories(VssDir); 480 | 481 | foreach (var vssDir in vssDirs) 482 | { 483 | var root = Path.GetPathRoot(Path.GetFullPath(d)); 484 | var stem = Path.GetFullPath(d).Replace(root, ""); 485 | 486 | var target = Path.Combine(vssDir, stem); 487 | 488 | Log.Information("Searching {Target} for prefetch files...",$"VSS{target.Replace($"{VssDir}\\", "")}"); 489 | 490 | #if !NET6_0 && !NET9_0 491 | files2 = 492 | Directory.EnumerateFileSystemEntries(target, dirEnumOptions, enumerationFilters); 493 | 494 | #else 495 | 496 | var enumerationOptions = new EnumerationOptions 497 | { 498 | IgnoreInaccessible = true, 499 | MatchCasing = MatchCasing.CaseInsensitive, 500 | RecurseSubdirectories = true, 501 | AttributesToSkip = 0 502 | }; 503 | 504 | files2 = Directory.EnumerateFileSystemEntries(target, "*.pf", enumerationOptions); 505 | #endif 506 | 507 | try 508 | { 509 | pfFiles.AddRange(files2); 510 | } 511 | catch (Exception e) 512 | { 513 | Log.Error(e,"Could not access all files in {D}",d); 514 | Console.WriteLine(); 515 | Log.Error("Rerun the program with Administrator privileges to try again"); 516 | Console.WriteLine(); 517 | //Environment.Exit(-1); 518 | } 519 | } 520 | } 521 | } 522 | catch (UnauthorizedAccessException ua) 523 | { 524 | Log.Error(ua, 525 | "Unable to access {D}. Are you running as an administrator? Error: {Message}",d,ua.Message); 526 | return; 527 | } 528 | catch (Exception ex) 529 | { 530 | Log.Error(ex, 531 | "Error getting prefetch files in {D}. Error: {Message}",d,ex.Message); 532 | return; 533 | } 534 | 535 | Console.WriteLine(); 536 | Log.Information("Found {Count:N0} Prefetch files",pfFiles.Count); 537 | Console.WriteLine(); 538 | 539 | var sw = new Stopwatch(); 540 | sw.Start(); 541 | 542 | var seenHashes = new HashSet(); 543 | 544 | foreach (var file in pfFiles) 545 | { 546 | if (File.Exists(file) == false) 547 | { 548 | Log.Warning("File {File} does not seem to exist any more! Skipping",file); 549 | 550 | continue; 551 | } 552 | 553 | if (dedupe) 554 | { 555 | using var fs = new FileStream(file, FileMode.Open, FileAccess.Read); 556 | var sha = Helper.GetSha1FromStream(fs, 0); 557 | if (seenHashes.Contains(sha)) 558 | { 559 | Log.Debug("Skipping {File} as a file with SHA-1 {Sha} has already been processed",file,sha); 560 | continue; 561 | } 562 | 563 | seenHashes.Add(sha); 564 | } 565 | 566 | var pf = LoadFile(file, q, ActiveDateTimeFormat); 567 | 568 | if (pf != null) 569 | { 570 | _processedFiles.Add(pf); 571 | } 572 | } 573 | 574 | sw.Stop(); 575 | 576 | if (q) 577 | { 578 | Console.WriteLine(); 579 | } 580 | 581 | Log.Information( 582 | "Processed {FileCount:N0} out of {TotalFilesCount:N0} files in {TotalSeconds:N4} seconds",pfFiles.Count - _failedFiles.Count,pfFiles.Count,sw.Elapsed.TotalSeconds); 583 | 584 | if (_failedFiles.Count > 0) 585 | { 586 | Console.WriteLine(); 587 | Log.Warning("Failed files"); 588 | foreach (var failedFile in _failedFiles) 589 | { 590 | Log.Information(" {FailedFile}",failedFile); 591 | } 592 | } 593 | } 594 | 595 | if (_processedFiles.Count > 0) 596 | { 597 | Console.WriteLine(); 598 | 599 | try 600 | { 601 | CsvWriter csvWriter = null; 602 | StreamWriter streamWriter = null; 603 | 604 | CsvWriter csvTl = null; 605 | StreamWriter streamWriterTl = null; 606 | 607 | JsConfig.DateHandler = DateHandler.ISO8601; 608 | 609 | StreamWriter streamWriterJson = null; 610 | 611 | var utcNow = DateTimeOffset.UtcNow; 612 | 613 | if (json?.Length > 0) 614 | { 615 | var outName = $"{utcNow:yyyyMMddHHmmss}_PECmd_Output.json"; 616 | 617 | if (Directory.Exists(json) == false) 618 | { 619 | Log.Information("{Json} does not exist. Creating...",json); 620 | Directory.CreateDirectory(json); 621 | } 622 | 623 | if (jsonf.IsNullOrEmpty() == false) 624 | { 625 | outName = Path.GetFileName(jsonf); 626 | } 627 | 628 | var outFile = Path.Combine(json, outName); 629 | 630 | Log.Information("Saving json output to {OutFile}",outFile); 631 | 632 | streamWriterJson = new StreamWriter(outFile); 633 | JsConfig.DateHandler = DateHandler.ISO8601; 634 | } 635 | 636 | if (csv?.Length > 0) 637 | { 638 | var outName = $"{utcNow:yyyyMMddHHmmss}_PECmd_Output.csv"; 639 | 640 | if (csvf.IsNullOrEmpty() == false) 641 | { 642 | outName = Path.GetFileName(csvf); 643 | } 644 | 645 | var outNameTl = $"{utcNow:yyyyMMddHHmmss}_PECmd_Output_Timeline.csv"; 646 | if (csvf.IsNullOrEmpty() == false) 647 | { 648 | outNameTl = 649 | $"{Path.GetFileNameWithoutExtension(csvf)}_Timeline{Path.GetExtension(csvf)}"; 650 | } 651 | 652 | 653 | var outFile = Path.Combine(csv, outName); 654 | var outFileTl = Path.Combine(csv, outNameTl); 655 | 656 | 657 | if (Directory.Exists(csv) == false) 658 | { 659 | Log.Information("Path to {Csv} does not exist. Creating...",csv); 660 | Directory.CreateDirectory(csv); 661 | } 662 | 663 | Log.Information("CSV output will be saved to {OutFile}",outFile); 664 | Log.Information("CSV time line output will be saved to {OutFileTl}",outFileTl); 665 | 666 | try 667 | { 668 | streamWriter = new StreamWriter(outFile); 669 | csvWriter = new CsvWriter(streamWriter, CultureInfo.InvariantCulture); 670 | 671 | csvWriter.WriteHeader(typeof(CsvOut)); 672 | csvWriter.NextRecord(); 673 | 674 | streamWriterTl = new StreamWriter(outFileTl); 675 | csvTl = new CsvWriter(streamWriterTl, CultureInfo.InvariantCulture); 676 | 677 | csvTl.WriteHeader(typeof(CsvOutTl)); 678 | csvTl.NextRecord(); 679 | } 680 | catch (Exception ex) 681 | { 682 | Log.Error(ex, 683 | "Unable to open {OutFile} for writing. CSV export canceled. Error: {Message}",outFile,ex.Message); 684 | } 685 | } 686 | 687 | 688 | XmlTextWriter xml = null; 689 | 690 | if (html?.Length > 0) 691 | { 692 | if (Directory.Exists(html) == false) 693 | { 694 | Log.Information("{Html} does not exist. Creating...",html); 695 | Directory.CreateDirectory(html); 696 | } 697 | 698 | var outDir = Path.Combine(html, 699 | $"{DateTimeOffset.UtcNow:yyyyMMddHHmmss}_PECmd_Output_for_{html.Replace(@":\", "_").Replace(@"\", "_")}"); 700 | 701 | if (Directory.Exists(outDir) == false) 702 | { 703 | Directory.CreateDirectory(outDir); 704 | } 705 | 706 | var styleDir = Path.Combine(outDir, "styles"); 707 | if (Directory.Exists(styleDir) == false) 708 | { 709 | Directory.CreateDirectory(styleDir); 710 | } 711 | 712 | File.WriteAllText(Path.Combine(styleDir, "normalize.css"), Encoding.Default.GetString(Convert.FromBase64String(ExternalFiles.Normalize))); 713 | File.WriteAllText(Path.Combine(styleDir, "style.css"), Encoding.Default.GetString(Convert.FromBase64String(ExternalFiles.Style))); 714 | 715 | if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) 716 | { 717 | File.WriteAllBytes(Path.Combine(styleDir, "directories.png"),Convert.FromBase64String(ExternalFiles.Directories)); 718 | File.WriteAllBytes(Path.Combine(styleDir, "filesloaded.png"),Convert.FromBase64String(ExternalFiles.FilesLoaded)); 719 | } 720 | 721 | var outFile = Path.Combine(html, outDir, 722 | "index.xhtml"); 723 | 724 | Log.Information("Saving HTML output to {OutFile}",outFile); 725 | 726 | xml = new XmlTextWriter(outFile, Encoding.UTF8) 727 | { 728 | Formatting = Formatting.Indented, 729 | Indentation = 4 730 | }; 731 | 732 | xml.WriteStartDocument(); 733 | 734 | xml.WriteProcessingInstruction("xml-stylesheet", "href=\"styles/normalize.css\""); 735 | xml.WriteProcessingInstruction("xml-stylesheet", "href=\"styles/style.css\""); 736 | 737 | xml.WriteStartElement("document"); 738 | } 739 | 740 | if (csv.IsNullOrEmpty() == false || 741 | json.IsNullOrEmpty() == false || 742 | html.IsNullOrEmpty() == false) 743 | { 744 | foreach (var processedFile in _processedFiles) 745 | { 746 | var csvOut = GetCsvFormat(processedFile, ActiveDateTimeFormat); 747 | 748 | var pfname = csvOut.SourceFilename; 749 | 750 | if (csvOut.SourceFilename.StartsWith(VssDir)) 751 | { 752 | pfname = $"VSS{csvOut.SourceFilename.Replace($"{VssDir}\\", "")}"; 753 | } 754 | 755 | csvOut.SourceFilename = pfname; 756 | 757 | try 758 | { 759 | foreach (var dateTimeOffset in processedFile.LastRunTimes) 760 | { 761 | var t = new CsvOutTl(); 762 | 763 | var exePath = 764 | processedFile.Filenames.FirstOrDefault( 765 | y => y.EndsWith(processedFile.Header.ExecutableFilename)); 766 | 767 | if (exePath == null) 768 | { 769 | exePath = processedFile.Header.ExecutableFilename; 770 | } 771 | 772 | t.ExecutableName = exePath; 773 | t.RunTime = dateTimeOffset.ToString(ActiveDateTimeFormat); 774 | 775 | csvTl?.WriteRecord(t); 776 | csvTl?.NextRecord(); 777 | } 778 | } 779 | catch (Exception ex) 780 | { 781 | Log.Error(ex, 782 | "Error getting time line record for {SourceFilename} to {Csv}. Error: {Message}",processedFile.SourceFilename,csv,ex.Message); 783 | } 784 | 785 | try 786 | { 787 | csvWriter?.WriteRecord(csvOut); 788 | csvWriter?.NextRecord(); 789 | } 790 | catch (Exception ex) 791 | { 792 | Log.Error(ex,"Error writing CSV record for {SourceFilename} to {Csv}. Error: {Message}",processedFile.SourceFilename,csv,ex.Message); 793 | } 794 | 795 | //hack 796 | if (streamWriterJson != null) 797 | { 798 | var o1 = GetCsvFormat(processedFile, "o"); 799 | 800 | streamWriterJson.WriteLine(o1.ToJson()); 801 | 802 | } 803 | 804 | 805 | //XHTML 806 | xml?.WriteStartElement("Container"); 807 | xml?.WriteElementString("SourceFile", csvOut.SourceFilename); 808 | xml?.WriteElementString("SourceCreated", csvOut.SourceCreated); 809 | xml?.WriteElementString("SourceModified", csvOut.SourceModified); 810 | xml?.WriteElementString("SourceAccessed", csvOut.SourceAccessed); 811 | 812 | xml?.WriteElementString("LastRun", csvOut.LastRun); 813 | 814 | xml?.WriteElementString("PreviousRun0", $"{csvOut.PreviousRun0}"); 815 | xml?.WriteElementString("PreviousRun1", $"{csvOut.PreviousRun1}"); 816 | xml?.WriteElementString("PreviousRun2", $"{csvOut.PreviousRun2}"); 817 | xml?.WriteElementString("PreviousRun3", $"{csvOut.PreviousRun3}"); 818 | xml?.WriteElementString("PreviousRun4", $"{csvOut.PreviousRun4}"); 819 | xml?.WriteElementString("PreviousRun5", $"{csvOut.PreviousRun5}"); 820 | xml?.WriteElementString("PreviousRun6", $"{csvOut.PreviousRun6}"); 821 | 822 | xml?.WriteStartElement("ExecutableName"); 823 | xml?.WriteAttributeString("title", 824 | "Note: The name of the executable tracked by the pf file"); 825 | xml?.WriteString(csvOut.ExecutableName); 826 | xml?.WriteEndElement(); 827 | 828 | xml?.WriteElementString("RunCount", $"{csvOut.RunCount}"); 829 | 830 | xml?.WriteStartElement("Size"); 831 | xml?.WriteAttributeString("title", "Note: The size of the executable in bytes"); 832 | xml?.WriteString(csvOut.Size); 833 | xml?.WriteEndElement(); 834 | 835 | xml?.WriteStartElement("Hash"); 836 | xml?.WriteAttributeString("title", 837 | "Note: The calculated hash for the pf file that should match the hash in the source file name"); 838 | xml?.WriteString(csvOut.Hash); 839 | xml?.WriteEndElement(); 840 | 841 | xml?.WriteStartElement("Version"); 842 | xml?.WriteAttributeString("title", 843 | "Note: The operating system that generated the prefetch file"); 844 | xml?.WriteString(csvOut.Version); 845 | xml?.WriteEndElement(); 846 | 847 | xml?.WriteElementString("Note", csvOut.Note); 848 | 849 | xml?.WriteElementString("Volume0Name", csvOut.Volume0Name); 850 | xml?.WriteElementString("Volume0Serial", csvOut.Volume0Serial); 851 | xml?.WriteElementString("Volume0Created", csvOut.Volume0Created); 852 | 853 | xml?.WriteElementString("Volume1Name", csvOut.Volume1Name); 854 | xml?.WriteElementString("Volume1Serial", csvOut.Volume1Serial); 855 | xml?.WriteElementString("Volume1Created", csvOut.Volume1Created); 856 | 857 | 858 | xml?.WriteStartElement("Directories"); 859 | xml?.WriteAttributeString("title", 860 | "A comma separated list of all directories accessed by the executable"); 861 | xml?.WriteString(csvOut.Directories); 862 | xml?.WriteEndElement(); 863 | 864 | xml?.WriteStartElement("FilesLoaded"); 865 | xml?.WriteAttributeString("title", 866 | "A comma separated list of all files that were loaded by the executable"); 867 | xml?.WriteString(csvOut.FilesLoaded); 868 | xml?.WriteEndElement(); 869 | 870 | xml?.WriteEndElement(); 871 | } 872 | 873 | 874 | //Close CSV stuff 875 | streamWriter?.Flush(); 876 | streamWriter?.Close(); 877 | 878 | streamWriterTl?.Flush(); 879 | streamWriterTl?.Close(); 880 | 881 | //Close XML 882 | xml?.WriteEndElement(); 883 | xml?.WriteEndDocument(); 884 | xml?.Flush(); 885 | 886 | //close json 887 | streamWriterJson?.Flush(); 888 | streamWriterJson?.Close(); 889 | } 890 | } 891 | catch (Exception ex) 892 | { 893 | Log.Error(ex,"Error exporting data: {Message}",ex.Message); 894 | } 895 | } 896 | 897 | if (vss) 898 | { 899 | if (Directory.Exists(VssDir)) 900 | { 901 | foreach (var directory in Directory.GetDirectories(VssDir)) 902 | { 903 | Directory.Delete(directory); 904 | } 905 | 906 | #if !NET6_0 && !NET9_0 907 | Directory.Delete(VssDir, true, true); 908 | #else 909 | Directory.Delete(VssDir, true); 910 | #endif 911 | } 912 | } 913 | } 914 | 915 | 916 | 917 | private static CsvOut GetCsvFormat(IPrefetch pf, string dt) 918 | { 919 | var created = pf.SourceCreatedOn; 920 | var modified = pf.SourceModifiedOn; 921 | var accessed = pf.SourceAccessedOn; 922 | 923 | var volDate = string.Empty; 924 | var volName = string.Empty; 925 | var volSerial = string.Empty; 926 | 927 | if (pf.VolumeInformation?.Count > 0) 928 | { 929 | var vol0Create = pf.VolumeInformation[0].CreationTime; 930 | 931 | volDate = vol0Create.ToString(ActiveDateTimeFormat); 932 | 933 | if (vol0Create.Year == 1601) 934 | { 935 | volDate = string.Empty; 936 | } 937 | 938 | volName = pf.VolumeInformation[0].DeviceName; 939 | volSerial = pf.VolumeInformation[0].SerialNumber; 940 | } 941 | 942 | var lrTime = string.Empty; 943 | 944 | if (pf.LastRunTimes.Count > 0) 945 | { 946 | var lr = pf.LastRunTimes[0]; 947 | 948 | lrTime = lr.ToString(ActiveDateTimeFormat); 949 | } 950 | 951 | 952 | var csOut = new CsvOut 953 | { 954 | SourceFilename = pf.SourceFilename, 955 | SourceCreated = created.ToString(ActiveDateTimeFormat), 956 | SourceModified = modified.ToString(ActiveDateTimeFormat), 957 | SourceAccessed = accessed.ToString(ActiveDateTimeFormat), 958 | Hash = pf.Header.Hash, 959 | ExecutableName = pf.Header.ExecutableFilename, 960 | Size = pf.Header.FileSize.ToString(), 961 | Version = GetDescriptionFromEnumValue(pf.Header.Version), 962 | RunCount = pf.RunCount.ToString(), 963 | Volume0Created = volDate, 964 | Volume0Name = volName, 965 | Volume0Serial = volSerial, 966 | LastRun = lrTime, 967 | ParsingError = pf.ParsingError 968 | }; 969 | 970 | if (pf.LastRunTimes.Count > 1) 971 | { 972 | var lrt = pf.LastRunTimes[1]; 973 | csOut.PreviousRun0 = lrt.ToString(ActiveDateTimeFormat); 974 | } 975 | 976 | if (pf.LastRunTimes.Count > 2) 977 | { 978 | var lrt = pf.LastRunTimes[2]; 979 | csOut.PreviousRun1 = lrt.ToString(ActiveDateTimeFormat); 980 | } 981 | 982 | if (pf.LastRunTimes.Count > 3) 983 | { 984 | var lrt = pf.LastRunTimes[3]; 985 | csOut.PreviousRun2 = lrt.ToString(ActiveDateTimeFormat); 986 | } 987 | 988 | if (pf.LastRunTimes.Count > 4) 989 | { 990 | var lrt = pf.LastRunTimes[4]; 991 | csOut.PreviousRun3 = lrt.ToString(ActiveDateTimeFormat); 992 | } 993 | 994 | if (pf.LastRunTimes.Count > 5) 995 | { 996 | var lrt = pf.LastRunTimes[5]; 997 | csOut.PreviousRun4 = lrt.ToString(ActiveDateTimeFormat); 998 | } 999 | 1000 | if (pf.LastRunTimes.Count > 6) 1001 | { 1002 | var lrt = pf.LastRunTimes[6]; 1003 | csOut.PreviousRun5 = lrt.ToString(ActiveDateTimeFormat); 1004 | } 1005 | 1006 | if (pf.LastRunTimes.Count > 7) 1007 | { 1008 | var lrt = pf.LastRunTimes[7]; 1009 | csOut.PreviousRun6 = lrt.ToString(ActiveDateTimeFormat); 1010 | } 1011 | 1012 | if (pf.VolumeInformation?.Count > 1) 1013 | { 1014 | var vol1 = pf.VolumeInformation[1].CreationTime; 1015 | csOut.Volume1Created = vol1.ToString(ActiveDateTimeFormat); 1016 | csOut.Volume1Name = pf.VolumeInformation[1].DeviceName; 1017 | csOut.Volume1Serial = pf.VolumeInformation[1].SerialNumber; 1018 | } 1019 | 1020 | if (pf.VolumeInformation?.Count > 2) 1021 | { 1022 | csOut.Note = "File contains > 2 volumes! Please inspect output from main program for full details!"; 1023 | } 1024 | 1025 | var sbDirs = new StringBuilder(); 1026 | if (pf.VolumeInformation != null) 1027 | { 1028 | foreach (var volumeInfo in pf.VolumeInformation) 1029 | { 1030 | sbDirs.Append(string.Join(", ", volumeInfo.DirectoryNames)); 1031 | } 1032 | } 1033 | 1034 | 1035 | if (pf.ParsingError) 1036 | { 1037 | return csOut; 1038 | } 1039 | 1040 | csOut.Directories = sbDirs.ToString(); 1041 | 1042 | csOut.FilesLoaded = string.Join(", ", pf.Filenames); 1043 | 1044 | return csOut; 1045 | } 1046 | 1047 | 1048 | private static string GetDescriptionFromEnumValue(Enum value) 1049 | { 1050 | var attribute = value.GetType() 1051 | .GetField(value.ToString()) 1052 | ?.GetCustomAttributes(typeof(DescriptionAttribute), false) 1053 | .SingleOrDefault() as DescriptionAttribute; 1054 | return attribute?.Description; 1055 | } 1056 | 1057 | private static void DisplayFile(IPrefetch pf, bool q, string dt) 1058 | { 1059 | if (pf.ParsingError) 1060 | { 1061 | _failedFiles.Add($"{pf.SourceFilename} is corrupt and did not parse completely!"); 1062 | Log.Warning("{SourceFilename} FILE DID NOT PARSE COMPLETELY!",pf.SourceFilename); 1063 | Console.WriteLine(); 1064 | } 1065 | 1066 | if (q == false) 1067 | { 1068 | if (pf.ParsingError) 1069 | { 1070 | Log.Warning("PARTIAL OUTPUT SHOWN BELOW"); 1071 | Console.WriteLine(); 1072 | } 1073 | 1074 | 1075 | var created = pf.SourceCreatedOn; 1076 | var modified = pf.SourceModifiedOn; 1077 | var accessed = pf.SourceAccessedOn; 1078 | 1079 | Log.Information("Created on: {CreatedOn}",created); 1080 | Log.Information("Modified on: {Modified}",modified); 1081 | Log.Information("Last accessed on: {Accessed}",accessed); 1082 | Console.WriteLine(); 1083 | 1084 | Log.Information("Executable name: {ExecutableFilename}",pf.Header.ExecutableFilename); 1085 | Log.Information("Hash: {Hash}",pf.Header.Hash); 1086 | Log.Information("File size (bytes): {FileSize:N0}",pf.Header.FileSize); 1087 | Log.Information("Version: {Description}",GetDescriptionFromEnumValue(pf.Header.Version)); 1088 | Console.WriteLine(); 1089 | 1090 | Log.Information("Run count: {RunCount:N0}",pf.RunCount); 1091 | 1092 | var lastRun = pf.LastRunTimes.First(); 1093 | 1094 | Log.Information("Last run: {LastRun}",lastRun); 1095 | 1096 | if (pf.LastRunTimes.Count > 1) 1097 | { 1098 | var lastRuns = pf.LastRunTimes.Skip(1).ToList(); 1099 | 1100 | var otherRunTimes = string.Join(", ", 1101 | lastRuns.Select(t => t.ToString(ActiveDateTimeFormat))); 1102 | 1103 | Log.Information("Other run times: {OtherRunTimes}",otherRunTimes); 1104 | 1105 | } 1106 | 1107 | Console.WriteLine(); 1108 | Log.Information("Volume information:"); 1109 | Console.WriteLine(); 1110 | var volnum = 0; 1111 | 1112 | foreach (var volumeInfo in pf.VolumeInformation) 1113 | { 1114 | var localCreate = volumeInfo.CreationTime; 1115 | 1116 | Log.Information( 1117 | "#{VolumeNumber}: Name: {DeviceName} Serial: {SerialNumber} Created: {LocalCreate} Directories: {DirectoryNamesCount:N0} File references: {FileReferencesCount:N0}", 1118 | volnum, volumeInfo.DeviceName, volumeInfo.SerialNumber, localCreate, 1119 | volumeInfo.DirectoryNames.Count, volumeInfo.FileReferences.Count); 1120 | volnum += 1; 1121 | } 1122 | 1123 | Console.WriteLine(); 1124 | 1125 | var totalDirs = pf.TotalDirectoryCount; 1126 | if (pf.Header.Version == Version.WinXpOrWin2K3) 1127 | { 1128 | totalDirs = 0; 1129 | //this has -1 for total directories, so we have to calculate it 1130 | foreach (var volumeInfo in pf.VolumeInformation) 1131 | { 1132 | totalDirs += volumeInfo.DirectoryNames.Count; 1133 | } 1134 | } 1135 | 1136 | Log.Information("Directories referenced: {TotalDirs:N0}",totalDirs); 1137 | Console.WriteLine(); 1138 | var dirIndex = 0; 1139 | foreach (var volumeInfo in pf.VolumeInformation) 1140 | { 1141 | foreach (var directoryName in volumeInfo.DirectoryNames) 1142 | { 1143 | var found = false; 1144 | foreach (var keyword in _keywords) 1145 | { 1146 | if (directoryName.ToLower().Contains(keyword)) 1147 | { 1148 | Log.Fatal("{DirIndex:0#}: {DirectoryName} (Keyword {Kw})",dirIndex,directoryName,true); 1149 | found = true; 1150 | break; 1151 | } 1152 | } 1153 | 1154 | if (!found) 1155 | { 1156 | Log.Information("{DirIndex:0#}: {DirectoryName}",dirIndex,directoryName); 1157 | } 1158 | 1159 | dirIndex += 1; 1160 | } 1161 | } 1162 | 1163 | Console.WriteLine(); 1164 | 1165 | Log.Information("Files referenced: {FilenamesCount:N0}",pf.Filenames.Count); 1166 | Console.WriteLine(); 1167 | var fileIndex = 0; 1168 | 1169 | foreach (var filename in pf.Filenames) 1170 | { 1171 | if (filename.EndsWith(pf.Header.ExecutableFilename)) 1172 | { 1173 | Log.Information("{FileIndex:0#}: {Filename} (Executable: {Exe}) ",fileIndex,filename,true); 1174 | } 1175 | else 1176 | { 1177 | var found = false; 1178 | foreach (var keyword in _keywords) 1179 | { 1180 | if (filename.ToLower().Contains(keyword)) 1181 | { 1182 | Log.Information("{FileIndex:0#}: {Filename} (Keyword: {Kw})", fileIndex, filename,true); 1183 | found = true; 1184 | break; 1185 | } 1186 | } 1187 | 1188 | if (!found) 1189 | { 1190 | Log.Information("{FileIndex:0#}: {Filename}",fileIndex,filename); 1191 | } 1192 | } 1193 | 1194 | fileIndex += 1; 1195 | } 1196 | } 1197 | 1198 | 1199 | if (q == false) 1200 | { 1201 | Console.WriteLine(); 1202 | } 1203 | if (q == false) 1204 | { 1205 | Console.WriteLine(); 1206 | } 1207 | } 1208 | 1209 | class DateTimeOffsetFormatter : IFormatProvider, ICustomFormatter 1210 | { 1211 | private readonly IFormatProvider _innerFormatProvider; 1212 | 1213 | public DateTimeOffsetFormatter(IFormatProvider innerFormatProvider) 1214 | { 1215 | _innerFormatProvider = innerFormatProvider; 1216 | } 1217 | 1218 | public object GetFormat(Type formatType) 1219 | { 1220 | return formatType == typeof(ICustomFormatter) ? this : _innerFormatProvider.GetFormat(formatType); 1221 | } 1222 | 1223 | public string Format(string format, object arg, IFormatProvider formatProvider) 1224 | { 1225 | if (arg is DateTimeOffset) 1226 | { 1227 | var size = (DateTimeOffset)arg; 1228 | return size.ToString(ActiveDateTimeFormat); 1229 | } 1230 | 1231 | var formattable = arg as IFormattable; 1232 | if (formattable != null) 1233 | { 1234 | return formattable.ToString(format, _innerFormatProvider); 1235 | } 1236 | 1237 | return arg.ToString(); 1238 | } 1239 | } 1240 | 1241 | private static IPrefetch LoadFile(string pfFile, bool q, string dt) 1242 | { 1243 | var pfname = pfFile; 1244 | 1245 | if (pfFile.StartsWith(VssDir)) 1246 | { 1247 | pfname = $"VSS{pfFile.Replace($"{VssDir}\\", "")}"; 1248 | } 1249 | 1250 | if (q == false) 1251 | { 1252 | Log.Information("Processing {Pfname}",pfname); 1253 | Console.WriteLine(); 1254 | } 1255 | 1256 | var sw = new Stopwatch(); 1257 | sw.Start(); 1258 | 1259 | try 1260 | { 1261 | 1262 | var pf = PrefetchFile.Open(pfFile); 1263 | 1264 | if (pf.ParsingError) 1265 | { 1266 | _failedFiles.Add($"{pfname} is corrupt and did not parse completely!"); 1267 | Log.Fatal("{Pfname} FILE DID NOT PARSE COMPLETELY!",pfname); 1268 | Console.WriteLine(); 1269 | } 1270 | 1271 | if (q == false) 1272 | { 1273 | DisplayFile(pf, false, ActiveDateTimeFormat); 1274 | } 1275 | 1276 | Log.Information("---------- Processed {PfName} in {TotalSeconds:N8} seconds ----------",pfname,sw.Elapsed.TotalSeconds); 1277 | 1278 | return pf; 1279 | } 1280 | catch (ArgumentNullException an) 1281 | { 1282 | Log.Error("Error opening {Pfname}. This appears to be a Windows 10 prefetch file. You must be running Windows 8 or higher to decompress Windows 10 prefetch files",pfname); 1283 | Console.WriteLine(); 1284 | _failedFiles.Add( 1285 | $"{pfname} ==> ({an.Message} (This appears to be a Windows 10 prefetch file. You must be running Windows 8 or higher to decompress Windows 10 prefetch files))"); 1286 | } 1287 | catch (Exception ex) 1288 | { 1289 | Log.Error(ex,"Error opening {Pfname}. Message: {Message}",pfname,ex.Message); 1290 | Console.WriteLine(); 1291 | 1292 | _failedFiles.Add($"{pfname} ==> ({ex.Message})"); 1293 | } 1294 | 1295 | return null; 1296 | } 1297 | 1298 | 1299 | public sealed class CsvOutTl 1300 | { 1301 | public string RunTime { get; set; } 1302 | public string ExecutableName { get; set; } 1303 | } 1304 | 1305 | public sealed class CsvOut 1306 | { 1307 | public string Note { get; set; } 1308 | public string SourceFilename { get; set; } 1309 | public string SourceCreated { get; set; } 1310 | public string SourceModified { get; set; } 1311 | public string SourceAccessed { get; set; } 1312 | public string ExecutableName { get; set; } 1313 | public string Hash { get; set; } 1314 | public string Size { get; set; } 1315 | public string Version { get; set; } 1316 | public string RunCount { get; set; } 1317 | 1318 | public string LastRun { get; set; } 1319 | public string PreviousRun0 { get; set; } 1320 | public string PreviousRun1 { get; set; } 1321 | public string PreviousRun2 { get; set; } 1322 | public string PreviousRun3 { get; set; } 1323 | public string PreviousRun4 { get; set; } 1324 | public string PreviousRun5 { get; set; } 1325 | public string PreviousRun6 { get; set; } 1326 | 1327 | public string Volume0Name { get; set; } 1328 | public string Volume0Serial { get; set; } 1329 | public string Volume0Created { get; set; } 1330 | 1331 | public string Volume1Name { get; set; } 1332 | public string Volume1Serial { get; set; } 1333 | public string Volume1Created { get; set; } 1334 | 1335 | public string Directories { get; set; } 1336 | public string FilesLoaded { get; set; } 1337 | public bool ParsingError { get; set; } 1338 | } 1339 | } 1340 | 1341 | -------------------------------------------------------------------------------- /PECmd/ExternalFiles.cs: -------------------------------------------------------------------------------- 1 | namespace PECmd; 2 | 3 | public static class ExternalFiles 4 | { 5 | public static readonly string Style = @"LyogUmVwb3J0IHN0eWxpbmcgd3JpdHRlbiBieTogRGV2b24gQWNrZXJtYW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JhZnRlZCBmb3IgUEVDbWQKICAgICAgICAgICAgICAgICAgICAgIGRldm9uQGFlaWZvcmVuc2ljcy5jb20KICAgICAgICAgICAgICAgICAgICBMYXN0IFVwZGF0ZWQ6IDIwMTYuMDMuMDQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qIElmIHZhbHVlIGlzIGVtcHR5LCB0aGVuIGhpZGUgY29udGFpbmVyICovCjplbXB0eSB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KCkNvbnRhaW5lciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRTlGMEY0OwogICAgYm9yZGVyOiBtZWRpdW0gIzE0NkI5OSBzb2xpZDsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgaGVpZ2h0OiBhdXRvOwogICAgbWFyZ2luOiAxMHB4OwogICAgbWluLWhlaWdodDogNTBweDsgLyogbWluLWhlaWdodCAqLwogICAgbWluLXdpZHRoOiA1MHB4OyAvKiBtaW4td2lkdGggICovCiAgICBvdmVyZmxvdzogYXV0bzsKICAgIHBhZGRpbmc6IDA7CiAgICByZXNpemU6IGJvdGg7CiAgICB3aWR0aDogMTQwMHB4Owp9CgovKiBSZW1vdmUgY29tbWVudCB0YWdzIHRvIHNob3cgLlBGIGJlZm9yZSBhbmQgYWJvdmUgcGF0aCBzdGF0ZW1lbnQKCUNvbnRhaW5lcjpiZWZvcmUgewoJICBkaXNwbGF5OiBibG9jazsKCSAgd2lkdGg6IGF1dG87CgkgIGZvbnQtd2VpZ2h0OiBib2xkOwoJICBmb250LXNpemU6IDI0cHg7CgkgIGNvbnRlbnQ6ICIuUEYgRmlsZSI7CgkgIGJhY2tncm91bmQtY29sb3I6ICMxNDZCOTk7CgkgIGNvbG9yOiAjRjE4QzE0OwoJICBwYWRkaW5nOiAycHggMCAwIDJweDsKCSAgbWFyZ2luOiAwOwoJfQoJKi8KClNvdXJjZUZpbGUgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzE0NkI5OTsKICAgIGNvbG9yOiAjRkZCRDZGOwogICAgZGlzcGxheTogYmxvY2s7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7CiAgICB3aWR0aDogYXV0bzsKfQoKU291cmNlQ3JlYXRlZCwgU291cmNlTW9kaWZpZWQsIFNvdXJjZUFjY2Vzc2VkLCBMYXN0UnVuLCBQcmV2aW91c1J1bjAsIFByZXZpb3VzUnVuMSwgUHJldmlvdXNSdW4yLCBQcmV2aW91c1J1bjMsIFByZXZpb3VzUnVuNCwgUHJldmlvdXNSdW41LCBQcmV2aW91c1J1bjYsIEV4ZWN1dGFibGVOYW1lLCBSdW5Db3VudCwgU2l6ZSwgSGFzaCwgVmVyc2lvbiwgTm90ZSwgVm9sdW1lME5hbWUsIFZvbHVtZTBTZXJpYWwsIFZvbHVtZTBDcmVhdGVkLCBWb2x1bWUxTmFtZSwgVm9sdW1lMVNlcmlhbCwgVm9sdW1lMUNyZWF0ZWQsIERpcmVjdG9yaWVzLCBGaWxlc0xvYWRlZCB7CiAgICBjb2xvcjogIzA0M0Y1RjsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgbGV0dGVyLXNwYWNpbmc6IDFwdDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgbWFyZ2luOiA0cHggMCA0cHggMDsKICAgIHBhZGRpbmc6IDJweCAwIDAgMzRweDsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICB3aWR0aDogYXV0bzsKICAgIHdvcmQtc3BhY2luZzogMnB0Owp9CgpTb3VyY2VDcmVhdGVkOmJlZm9yZSB7CiAgICBjb250ZW50OiAiU291cmNlIENyZWF0ZWQ6IjsKICAgIGRpc3BsYXk6IGlubGluZTsKICAgIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBzYW5zLXNlcmlmOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBsZXR0ZXItc3BhY2luZzogMXB0OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBtYXJnaW46IDJweCAwIDRweCAwOwogICAgcGFkZGluZzogMnB4IDIwcHggMCAycHg7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgd29yZC1zcGFjaW5nOiAycHQ7Cn0KCi8qIFJlbW92ZSBjb21tZW50IHRhZ3MgdG8gc2hvdyAoVVRDKSBhZnRlciB0aW1lc3RhbXAKCQlTb3VyY2VDcmVhdGVkOmFmdGVyIHsKCQkJY29udGVudDogIiAoVVRDKSI7CgkJCWNvbG9yOiAjQTZBOEE5OwoJCX0KCQkqLwoKU291cmNlQ3JlYXRlZDpob3ZlciB7CiAgICBjb2xvcjogI0E2QThBOTsKICAgIGNvbnRlbnQ6ICIgKFVUQykiOwp9CgpTb3VyY2VNb2RpZmllZDpiZWZvcmUgewogICAgY29udGVudDogIlNvdXJjZSBNb2RpZmllZDoiOwogICAgZGlzcGxheTogaW5saW5lOwogICAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAxcHQ7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG1hcmdpbjogMnB4IDAgNHB4IDA7CiAgICBwYWRkaW5nOiAycHggMTVweCAwIDJweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICB3b3JkLXNwYWNpbmc6IDJwdDsKfQoKLyogUmVtb3ZlIGNvbW1lbnQgdGFncyB0byBzaG93IChVVEMpIGFmdGVyIHRpbWVzdGFtcAoJCVNvdXJjZUNyZWF0ZWQ6YWZ0ZXIgewoJCQljb250ZW50OiAiIChVVEMpIjsKCQkJY29sb3I6ICNBNkE4QTk7CgkJfQoJCSovCgpTb3VyY2VBY2Nlc3NlZDpiZWZvcmUgewogICAgY29udGVudDogIlNvdXJjZSBBY2Nlc3NlZDoiOwogICAgZGlzcGxheTogaW5saW5lOwogICAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAxcHQ7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG1hcmdpbjogMnB4IDAgNHB4IDA7CiAgICBwYWRkaW5nOiAycHggMTBweCAwIDJweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICB3b3JkLXNwYWNpbmc6IDJwdDsKfQoKLyogUmVtb3ZlIGNvbW1lbnQgdGFncyB0byBzaG93IChVVEMpIGFmdGVyIHRpbWVzdGFtcAoJCVNvdXJjZUNyZWF0ZWQ6YWZ0ZXIgewoJCQljb250ZW50OiAiIChVVEMpIjsKCQkJY29sb3I6ICNBNkE4QTk7CgkJfQoJCSovCgpMYXN0UnVuOmJlZm9yZSB7CiAgICBjb250ZW50OiAiTGFzdCBSdW46IjsKICAgIGRpc3BsYXk6IGlubGluZTsKICAgIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBzYW5zLXNlcmlmOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBsZXR0ZXItc3BhY2luZzogMXB0OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBtYXJnaW46IDJweCAwIDRweCAwOwogICAgcGFkZGluZzogMnB4IDczcHggMCAycHg7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgd29yZC1zcGFjaW5nOiAycHQ7Cn0KCi8qIFJlbW92ZSBjb21tZW50IHRhZ3MgdG8gc2hvdyAoVVRDKSBhZnRlciB0aW1lc3RhbXAKCQlMYXN0UnVuOmFmdGVyIHsKCQkJY29udGVudDogIiAoVVRDKSI7CgkJCWNvbG9yOiAjQTZBOEE5OwoJCX0KCQkqLwoKUHJldmlvdXNSdW4wOmJlZm9yZSB7CiAgICBjb250ZW50OiAiUHJldmlvdXMgUnVuIDA6IjsKICAgIGRpc3BsYXk6IGlubGluZTsKICAgIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBzYW5zLXNlcmlmOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBsZXR0ZXItc3BhY2luZzogMXB0OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBtYXJnaW46IDJweCAwIDRweCAwOwogICAgcGFkZGluZzogMnB4IDE4cHggMCAycHg7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgd29yZC1zcGFjaW5nOiAycHQ7Cn0KClByZXZpb3VzUnVuMTpiZWZvcmUgewogICAgY29udGVudDogIlByZXZpb3VzIFJ1biAxOiI7CiAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICBmb250LWZhbWlseTogdmVyZGFuYSwgc2Fucy1zZXJpZjsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbGV0dGVyLXNwYWNpbmc6IDFwdDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgbWFyZ2luOiAycHggMCA0cHggMDsKICAgIHBhZGRpbmc6IDJweCAxOHB4IDAgMnB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgIHdvcmQtc3BhY2luZzogMnB0Owp9CgpQcmV2aW91c1J1bjI6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJQcmV2aW91cyBSdW4gMjoiOwogICAgZGlzcGxheTogaW5saW5lOwogICAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAxcHQ7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG1hcmdpbjogMnB4IDAgNHB4IDA7CiAgICBwYWRkaW5nOiAycHggMThweCAwIDJweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICB3b3JkLXNwYWNpbmc6IDJwdDsKfQoKUHJldmlvdXNSdW4zOmJlZm9yZSB7CiAgICBjb250ZW50OiAiUHJldmlvdXMgUnVuIDM6IjsKICAgIGRpc3BsYXk6IGlubGluZTsKICAgIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBzYW5zLXNlcmlmOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBsZXR0ZXItc3BhY2luZzogMXB0OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBtYXJnaW46IDJweCAwIDRweCAwOwogICAgcGFkZGluZzogMnB4IDE4cHggMCAycHg7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgd29yZC1zcGFjaW5nOiAycHQ7Cn0KClByZXZpb3VzUnVuNDpiZWZvcmUgewogICAgY29udGVudDogIlByZXZpb3VzIFJ1biA0OiI7CiAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICBmb250LWZhbWlseTogdmVyZGFuYSwgc2Fucy1zZXJpZjsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbGV0dGVyLXNwYWNpbmc6IDFwdDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgbWFyZ2luOiAycHggMCA0cHggMDsKICAgIHBhZGRpbmc6IDJweCAxOHB4IDAgMnB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgIHdvcmQtc3BhY2luZzogMnB0Owp9CgpQcmV2aW91c1J1bjU6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJQcmV2aW91cyBSdW4gNToiOwogICAgZGlzcGxheTogaW5saW5lOwogICAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAxcHQ7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG1hcmdpbjogMnB4IDAgNHB4IDA7CiAgICBwYWRkaW5nOiAycHggMThweCAwIDJweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICB3b3JkLXNwYWNpbmc6IDJwdDsKfQoKUHJldmlvdXNSdW42OmJlZm9yZSB7CiAgICBjb250ZW50OiAiUHJldmlvdXMgUnVuIDY6IjsKICAgIGRpc3BsYXk6IGlubGluZTsKICAgIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBzYW5zLXNlcmlmOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBsZXR0ZXItc3BhY2luZzogMXB0OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBtYXJnaW46IDJweCAwIDRweCAwOwogICAgcGFkZGluZzogMnB4IDE4cHggMCAycHg7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgd29yZC1zcGFjaW5nOiAycHQ7Cn0KCkV4ZWN1dGFibGVOYW1lOmJlZm9yZSB7CiAgICBjb250ZW50OiAiRXhlY3V0YWJsZSBOYW1lOiI7CiAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICBmb250LWZhbWlseTogdmVyZGFuYSwgc2Fucy1zZXJpZjsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbGV0dGVyLXNwYWNpbmc6IDFwdDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgbWFyZ2luOiAycHggMCA0cHggMDsKICAgIHBhZGRpbmc6IDJweCAxMHB4IDAgMnB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgIHdvcmQtc3BhY2luZzogMnB0Owp9CgovKiBSZW1vdmUgY29tbWVudCB0YWdzIHRvIHNob3cgYSBub3RlIG9uIHJlcG9ydCB0aGF0IG1hdGNoZXMgaG92ZXIgdG9vbCB0aXAKCQlSdW5Db3VudDphZnRlciB7CgkJCWNvbnRlbnQ6ICIgKE5vdGU6IFRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlIHRyYWNrZWQgYnkgdGhlIHBmIGZpbGUiOwoJCQljb2xvcjogI0E2QThBOTsKCQl9CgkJKi8KClJ1bkNvdW50OmJlZm9yZSB7CiAgICBjb250ZW50OiAiUnVuIENvdW50OiI7CiAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICBmb250LWZhbWlseTogdmVyZGFuYSwgc2Fucy1zZXJpZjsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbGV0dGVyLXNwYWNpbmc6IDFwdDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgbWFyZ2luOiAycHggMCA0cHggMDsKICAgIHBhZGRpbmc6IDJweCAxMHB4IDAgMnB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgIHdvcmQtc3BhY2luZzogMnB0Owp9CgpTaXplOmJlZm9yZSB7CiAgICBjb250ZW50OiAiU2l6ZToiOwogICAgZGlzcGxheTogaW5saW5lOwogICAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAxcHQ7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG1hcmdpbjogMnB4IDAgNHB4IDA7CiAgICBwYWRkaW5nOiAycHggMTBweCAwIDJweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICB3b3JkLXNwYWNpbmc6IDJwdDsKfQoKLyogUmVtb3ZlIGNvbW1lbnQgdGFncyB0byBzaG93IGEgbm90ZSBvbiByZXBvcnQgdGhhdCBtYXRjaGVzIGhvdmVyIHRvb2wgdGlwCgkJU2l6ZTphZnRlciB7CgkJCWNvbnRlbnQ6ICIgKE5vdGU6IHNpemUgaW4gYnl0ZXMgb2YgZXhlY3V0YWJsZSkiOwoJCQljb2xvcjogI0E2QThBOTsKCQl9CgkJKi8KCkhhc2g6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJIYXNoOiI7CiAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICBmb250LWZhbWlseTogdmVyZGFuYSwgc2Fucy1zZXJpZjsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbGV0dGVyLXNwYWNpbmc6IDFwdDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgbWFyZ2luOiAycHggMCA0cHggMDsKICAgIHBhZGRpbmc6IDJweCAxMHB4IDAgMnB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgIHdvcmQtc3BhY2luZzogMnB0Owp9CgovKiBSZW1vdmUgY29tbWVudCB0YWdzIHRvIHNob3cgYSBub3RlIG9uIHJlcG9ydCB0aGF0IG1hdGNoZXMgaG92ZXIgdG9vbCB0aXAKCQlIYXNoOmFmdGVyIHsKCQkJY29udGVudDogIiAoTm90ZTogVGhlIGNhbGN1bGF0ZWQgaGFzaCBmb3IgdGhlIHBmIGZpbGUgdGhhdCBzaG91bGQgbWF0Y2ggdGhlIGhhc2ggaW4gdGhlIHNvdXJjZSBmaWxlIG5hbWUpIjsKCQkJY29sb3I6ICNBNkE4QTk7CgkJfQoJCSovCgpWZXJzaW9uOmJlZm9yZSB7CiAgICBjb250ZW50OiAiVmVyc2lvbjoiOwogICAgZGlzcGxheTogaW5saW5lOwogICAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAxcHQ7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG1hcmdpbjogMnB4IDAgNHB4IDA7CiAgICBwYWRkaW5nOiAycHggMTBweCAwIDJweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICB3b3JkLXNwYWNpbmc6IDJwdDsKfQoKLyogUmVtb3ZlIGNvbW1lbnQgdGFncyB0byBzaG93IGEgbm90ZSBvbiByZXBvcnQgdGhhdCBtYXRjaGVzIGhvdmVyIHRvb2wgdGlwCgkJVmVyc2lvbjphZnRlciB7CgkJCWNvbnRlbnQ6ICIgKE5vdGU6IFRoZSBvcGVyYXRpbmcgc3lzdGVtIHRoYXQgZ2VuZXJhdGVkIHRoZSBwcmVmZXRjaCBmaWxlKSI7CgkJCWNvbG9yOiAjQTZBOEE5OwoJCX0KCQkqLwoKTm90ZTpiZWZvcmUgewogICAgY29udGVudDogIk5vdGU6IjsKICAgIGRpc3BsYXk6IGlubGluZTsKICAgIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBzYW5zLXNlcmlmOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBsZXR0ZXItc3BhY2luZzogMXB0OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBtYXJnaW46IDJweCAwIDRweCAwOwogICAgcGFkZGluZzogMnB4IDEwcHggMCAycHg7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgd29yZC1zcGFjaW5nOiAycHQ7Cn0KCk5vdGU6YWZ0ZXIgewogICAgY29sb3I6ICNBNkE4QTk7CiAgICBjb250ZW50OiAiIChOb3RlOiBQb3B1bGF0ZWQgd2hlbiA+MiB2b2x1bWVzIGFyZSBpZGVudGlmaWVkIGluIGEgcHJlZmV0Y2ggZmlsZS4gVGhpcyBpcyByYXJlLikiOwp9CgpWb2x1bWUwTmFtZSB7CiAgICBjb2xvcjogbWFyb29uOwp9CgovKiBSZW1vdmUgY29tbWVudCB0YWdzIHRvIHNob3cgYSBub3RlIG9uIHJlcG9ydCB0aGF0IG1hdGNoZXMgaG92ZXIgdG9vbCB0aXAKCQlWb2x1bWUwTmFtZTphZnRlciB7CgkJCWNvbnRlbnQ6ICIgKE5vdGU6IFRoZSBmaXJzdCB2b2x1bWUgbmFtZSBmb3VuZCkiOwoJCQljb2xvcjogI0E2QThBOTsKCQl9CgkJKi8KClZvbHVtZTBOYW1lOmJlZm9yZSB7CiAgICBjb250ZW50OiAiVm9sdW1lIDAgTmFtZToiOwogICAgZGlzcGxheTogaW5saW5lOwogICAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAxcHQ7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG1hcmdpbjogMnB4IDAgNHB4IDA7CiAgICBwYWRkaW5nOiAycHggMTBweCAwIDJweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICB3b3JkLXNwYWNpbmc6IDJwdDsKfQoKVm9sdW1lMFNlcmlhbCB7CiAgICBjb2xvcjogbWFyb29uOwp9CgovKiBSZW1vdmUgY29tbWVudCB0YWdzIHRvIHNob3cgYSBub3RlIG9uIHJlcG9ydCB0aGF0IG1hdGNoZXMgaG92ZXIgdG9vbCB0aXAKCQlWb2x1bWUwU2VyaWFsOmFmdGVyIHsKCQkJY29udGVudDogIiAoTm90ZTogU2VyaWFsICMgb2YgdGhlIGZpcnN0IHZvbHVtZSkiOwoJCQljb2xvcjogI0E2QThBOTsKCQl9CgkJKi8KClZvbHVtZTBTZXJpYWw6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJWb2x1bWUgMCBTZXJpYWw6IjsKICAgIGRpc3BsYXk6IGlubGluZTsKICAgIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBzYW5zLXNlcmlmOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBsZXR0ZXItc3BhY2luZzogMXB0OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBtYXJnaW46IDJweCAwIDRweCAwOwogICAgcGFkZGluZzogMnB4IDEwcHggMCAycHg7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgd29yZC1zcGFjaW5nOiAycHQ7Cn0KClZvbHVtZTBDcmVhdGVkIHsKICAgIGNvbG9yOiBtYXJvb247Cn0KClZvbHVtZTBDcmVhdGVkOmJlZm9yZSB7CiAgICBjb250ZW50OiAiVm9sdW1lIDAgQ3JlYXRlZDoiOwogICAgZGlzcGxheTogaW5saW5lOwogICAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAxcHQ7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG1hcmdpbjogMnB4IDAgNHB4IDA7CiAgICBwYWRkaW5nOiAycHggNHB4IDAgMnB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgIHdvcmQtc3BhY2luZzogMnB0Owp9CgovKiBSZW1vdmUgY29tbWVudCB0YWdzIHRvIHNob3cgYSBub3RlIG9uIHJlcG9ydCB0aGF0IG1hdGNoZXMgaG92ZXIgdG9vbCB0aXAKCQlWb2x1bWUwQ3JlYXRlZDphZnRlciB7CgkJCWNvbnRlbnQ6ICIgKE5vdGU6IFZvbHVtZSBjcmVhdGVkIHRpbWVzdGFtcCkiOwoJCQljb2xvcjogI0E2QThBOTsKCQl9CgkJKi8KClZvbHVtZTFOYW1lOmJlZm9yZSB7CiAgICBjb250ZW50OiAiVm9sdW1lIDEgTmFtZToiOwogICAgZGlzcGxheTogaW5saW5lOwogICAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAxcHQ7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG1hcmdpbjogMnB4IDAgNHB4IDA7CiAgICBwYWRkaW5nOiAycHggMTBweCAwIDJweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICB3b3JkLXNwYWNpbmc6IDJwdDsKfQoKVm9sdW1lMVNlcmlhbDpiZWZvcmUgewogICAgY29udGVudDogIlZvbHVtZSAxIFNlcmlhbDoiOwogICAgZGlzcGxheTogaW5saW5lOwogICAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAxcHQ7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG1hcmdpbjogMnB4IDAgNHB4IDA7CiAgICBwYWRkaW5nOiAycHggMTBweCAwIDJweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICB3b3JkLXNwYWNpbmc6IDJwdDsKfQoKVm9sdW1lMUNyZWF0ZWQ6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJWb2x1bWUgMSBDcmVhdGVkOiI7CiAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICBmb250LWZhbWlseTogdmVyZGFuYSwgc2Fucy1zZXJpZjsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbGV0dGVyLXNwYWNpbmc6IDFwdDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgbWFyZ2luOiAycHggMCA0cHggMDsKICAgIHBhZGRpbmc6IDJweCAxOHB4IDAgMnB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgIHdvcmQtc3BhY2luZzogMnB0Owp9CgpkaXYgewogICAgLW1vei1jb2x1bW4tY291bnQ6IDM7IC8qIEZpcmVmb3ggKi8KICAgIC13ZWJraXQtY29sdW1uLWNvdW50OiAzOyAvKiBDaHJvbWUsIFNhZmFyaSwgT3BlcmEgKi8KICAgIGNvbHVtbi1jb3VudDogMzsKfQoKRGlyZWN0b3JpZXMgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRpcmVjdG9yaWVzLnBuZyk7CiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBsZWZ0IHRvcDsKICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgICBiYWNrZ3JvdW5kLXNpemU6IDMwcHggNDRweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7Cn0KCkRpcmVjdG9yaWVzOmJlZm9yZSB7CiAgICBjb250ZW50OiAiRGlyZWN0b3JpZXM6IjsKICAgIGRpc3BsYXk6IGlubGluZTsKICAgIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBzYW5zLXNlcmlmOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBsZXR0ZXItc3BhY2luZzogMXB0OwogICAgbWFyZ2luOiAycHggMCA0cHggMDsKICAgIHBhZGRpbmc6IDJweCAxMHB4IDAgMnB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQoKLyogUmVtb3ZlIGNvbW1lbnQgdGFncyB0byBzaG93IGEgbm90ZSBvbiByZXBvcnQgdGhhdCBtYXRjaGVzIGhvdmVyIHRvb2wgdGlwCgkJRGlyZWN0b3JpZXM6YWZ0ZXIgewoJCQljb250ZW50OiAiIChOb3RlOiBBIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGFsbCBkaXJlY3RvcmllcyBhY2Nlc3NlZCBieSB0aGUgZXhlY3V0YWJsZSkiOwoJCQljb2xvcjogI0E2QThBOTsKCQl9CgkJKi8KCkZpbGVzTG9hZGVkIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChmaWxlc2xvYWRlZC5wbmcpOwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogbGVmdCB0b3A7CiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgYmFja2dyb3VuZC1zaXplOiAzMHB4IDQ0cHg7CiAgICBsaW5lLWhlaWdodDogMS40Owp9CgpGaWxlc0xvYWRlZDpiZWZvcmUgewogICAgY29udGVudDogIkZpbGVzIExvYWRlZDoiOwogICAgZGlzcGxheTogaW5saW5lOwogICAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAxcHQ7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG1hcmdpbjogMnB4IDAgNHB4IDA7CiAgICBwYWRkaW5nOiAycHggMTBweCAwIDJweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICB3b3JkLXNwYWNpbmc6IDJwdDsKfQoKLyogUmVtb3ZlIGNvbW1lbnQgdGFncyB0byBzaG93IGEgbm90ZSBvbiByZXBvcnQgdGhhdCBtYXRjaGVzIGhvdmVyIHRvb2wgdGlwCkZpbGVzTG9hZGVkOmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIgKE5vdGU6IEEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgYWxsIGZpbGVzIHRoYXQgd2VyZSBsb2FkZWQgYnkgdGhlIGV4ZWN1dGFibGUpIjsKICAgIGNvbG9yOiAjQTZBOEE5Owp9Ciov"; 6 | public static readonly string Normalize = @"LyohIG5vcm1hbGl6ZS5jc3MgdjMuMC4zIHwgTUlUIExpY2Vuc2UgfCBnaXRodWIuY29tL25lY29sYXMvbm9ybWFsaXplLmNzcyAqLwoKLyoqCiAqIDEuIFNldCBkZWZhdWx0IGZvbnQgZmFtaWx5IHRvIHNhbnMtc2VyaWYuCiAqIDIuIFByZXZlbnQgaU9TIGFuZCBJRSB0ZXh0IHNpemUgYWRqdXN0IGFmdGVyIGRldmljZSBvcmllbnRhdGlvbiBjaGFuZ2UsCiAqICAgIHdpdGhvdXQgZGlzYWJsaW5nIHVzZXIgem9vbS4KICovCgpodG1sIHsKICAgIC1tcy10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOyAvKiAyICovCiAgICAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCU7IC8qIDIgKi8KICAgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOyAvKiAxICovCn0KCi8qKgogKiBSZW1vdmUgZGVmYXVsdCBtYXJnaW4uCiAqLwoKYm9keSB7CiAgICBtYXJnaW46IDA7Cn0KCi8qIEhUTUw1IGRpc3BsYXkgZGVmaW5pdGlvbnMKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCi8qKgogKiBDb3JyZWN0IGBibG9ja2AgZGlzcGxheSBub3QgZGVmaW5lZCBmb3IgYW55IEhUTUw1IGVsZW1lbnQgaW4gSUUgOC85LgogKiBDb3JyZWN0IGBibG9ja2AgZGlzcGxheSBub3QgZGVmaW5lZCBmb3IgYGRldGFpbHNgIG9yIGBzdW1tYXJ5YCBpbiBJRSAxMC8xMQogKiBhbmQgRmlyZWZveC4KICogQ29ycmVjdCBgYmxvY2tgIGRpc3BsYXkgbm90IGRlZmluZWQgZm9yIGBtYWluYCBpbiBJRSAxMS4KICovCgphcnRpY2xlLAphc2lkZSwKZGV0YWlscywKZmlnY2FwdGlvbiwKZmlndXJlLApmb290ZXIsCmhlYWRlciwKbWFpbiwKbWVudSwKbmF2LApzZWN0aW9uLApzdW1tYXJ5IHsKICAgIGRpc3BsYXk6IGJsb2NrOwp9CgovKioKICogMS4gQ29ycmVjdCBgaW5saW5lLWJsb2NrYCBkaXNwbGF5IG5vdCBkZWZpbmVkIGluIElFIDgvOS4KICogMi4gTm9ybWFsaXplIHZlcnRpY2FsIGFsaWdubWVudCBvZiBgcHJvZ3Jlc3NgIGluIENocm9tZSwgRmlyZWZveCwgYW5kIE9wZXJhLgogKi8KCmF1ZGlvLApjYW52YXMsCnByb2dyZXNzLAp2aWRlbyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IC8qIDEgKi8KICAgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsgLyogMiAqLwp9CgovKioKICogUHJldmVudCBtb2Rlcm4gYnJvd3NlcnMgZnJvbSBkaXNwbGF5aW5nIGBhdWRpb2Agd2l0aG91dCBjb250cm9scy4KICogUmVtb3ZlIGV4Y2VzcyBoZWlnaHQgaW4gaU9TIDUgZGV2aWNlcy4KICovCgphdWRpbzpub3QoW2NvbnRyb2xzXSkgewogICAgZGlzcGxheTogbm9uZTsKICAgIGhlaWdodDogMDsKfQoKLyoqCiAqIEFkZHJlc3MgYFtoaWRkZW5dYCBzdHlsaW5nIG5vdCBwcmVzZW50IGluIElFIDgvOS8xMC4KICogSGlkZSB0aGUgYHRlbXBsYXRlYCBlbGVtZW50IGluIElFIDgvOS8xMC8xMSwgU2FmYXJpLCBhbmQgRmlyZWZveCA8IDIyLgogKi8KCltoaWRkZW5dLAp0ZW1wbGF0ZSB7CiAgICBkaXNwbGF5OiBub25lOwp9CgovKiBMaW5rcwogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKLyoqCiAqIFJlbW92ZSB0aGUgZ3JheSBiYWNrZ3JvdW5kIGNvbG9yIGZyb20gYWN0aXZlIGxpbmtzIGluIElFIDEwLgogKi8KCmEgewogICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7Cn0KCi8qKgogKiBJbXByb3ZlIHJlYWRhYmlsaXR5IG9mIGZvY3VzZWQgZWxlbWVudHMgd2hlbiB0aGV5IGFyZSBhbHNvIGluIGFuCiAqIGFjdGl2ZS9ob3ZlciBzdGF0ZS4KICovCgphOmFjdGl2ZSwKYTpob3ZlciB7CiAgICBvdXRsaW5lOiAwOwp9CgovKiBUZXh0LWxldmVsIHNlbWFudGljcwogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKLyoqCiAqIEFkZHJlc3MgaW5jb25zaXN0ZW50IHN0eWxpbmcgb2YgYGFiYnJbdGl0bGVdYC4KICogMS4gQ29ycmVjdCBzdHlsaW5nIGluIEZpcmVmb3ggMzkgYW5kIE9wZXJhIDEyLgogKiAyLiBDb3JyZWN0IG1pc3Npbmcgc3R5bGluZyBpbiBDaHJvbWUsIEVkZ2UsIElFLCBPcGVyYSwgYW5kIFNhZmFyaS4KICovCgphYmJyW3RpdGxlXSB7CiAgICBib3JkZXItYm90dG9tOiBub25lOyAvKiAxICovCiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgLyogMiAqLwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgZG90dGVkOyAvKiAyICovCn0KCi8qKgogKiBBZGRyZXNzIGluY29uc2lzdGVudCBzdHlsaW5nIG9mIGIgYW5kIHN0cm9uZy4KICogMS4gQ29ycmVjdCBkdXBsaWNhdGUgYXBwbGljYXRpb24gb2YgYGJvbGRlcmAgaW4gU2FmYXJpIDYuMC4yLgogKiAyLiBDb3JyZWN0IHN0eWxlIHNldCB0byBgYm9sZGAgaW4gRWRnZSAxMissIFNhZmFyaSA2LjIrLCBhbmQgQ2hyb21lIDE4Ky4KICovCgpiLApzdHJvbmcgewogICAgZm9udC13ZWlnaHQ6IGluaGVyaXQ7IC8qIDEgKi8KfQoKYiwKc3Ryb25nIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkZXI7IC8qIDIgKi8KfQoKLyoqCiAqIEFkZHJlc3Mgc3R5bGluZyBub3QgcHJlc2VudCBpbiBTYWZhcmkgYW5kIENocm9tZS4KICovCgpkZm4gewogICAgZm9udC1zdHlsZTogaXRhbGljOwp9CgovKioKICogQWRkcmVzcyB2YXJpYWJsZSBgaDFgIGZvbnQtc2l6ZSBhbmQgbWFyZ2luIHdpdGhpbiBgc2VjdGlvbmAgYW5kIGBhcnRpY2xlYAogKiBjb250ZXh0cyBpbiBGaXJlZm94IDQrLCBTYWZhcmksIGFuZCBDaHJvbWUuCiAqLwoKaDEgewogICAgZm9udC1zaXplOiAyZW07CiAgICBtYXJnaW46IDAuNjdlbSAwOwp9CgovKioKICogQWRkcmVzcyBzdHlsaW5nIG5vdCBwcmVzZW50IGluIElFIDgvOS4KICovCgptYXJrIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZjA7CiAgICBjb2xvcjogIzAwMDsKfQoKLyoqCiAqIEFkZHJlc3MgaW5jb25zaXN0ZW50IGFuZCB2YXJpYWJsZSBmb250IHNpemUgaW4gYWxsIGJyb3dzZXJzLgogKi8KCnNtYWxsIHsKICAgIGZvbnQtc2l6ZTogODAlOwp9CgovKioKICogUHJldmVudCBgc3ViYCBhbmQgYHN1cGAgYWZmZWN0aW5nIGBsaW5lLWhlaWdodGAgaW4gYWxsIGJyb3dzZXJzLgogKi8KCnN1YiwKc3VwIHsKICAgIGZvbnQtc2l6ZTogNzUlOwogICAgbGluZS1oZWlnaHQ6IDA7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7Cn0KCnN1cCB7CiAgICB0b3A6IC0wLjVlbTsKfQoKc3ViIHsKICAgIGJvdHRvbTogLTAuMjVlbTsKfQoKLyogRW1iZWRkZWQgY29udGVudAogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKLyoqCiAqIFJlbW92ZSBib3JkZXIgd2hlbiBpbnNpZGUgYGFgIGVsZW1lbnQgaW4gSUUgOC85LzEwLgogKi8KCmltZyB7CiAgICBib3JkZXI6IDA7Cn0KCi8qKgogKiBDb3JyZWN0IG92ZXJmbG93IG5vdCBoaWRkZW4gaW4gSUUgOS8xMC8xMS4KICovCgpzdmc6bm90KDpyb290KSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgovKiBHcm91cGluZyBjb250ZW50CiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgovKioKICogQWRkcmVzcyBtYXJnaW4gbm90IHByZXNlbnQgaW4gSUUgOC85IGFuZCBTYWZhcmkuCiAqLwoKZmlndXJlIHsKICAgIG1hcmdpbjogMWVtIDQwcHg7Cn0KCi8qKgogKiBBZGRyZXNzIGluY29uc2lzdGVudCBzdHlsaW5nIG9mIGBocmAuCiAqIDEuIENvcnJlY3QgYGJveC1zaXppbmdgIHNldCB0byBgYm9yZGVyLWJveGAgaW4gRmlyZWZveC4KICogMi4gQ29ycmVjdCBgb3ZlcmZsb3dgIHNldCB0byBgaGlkZGVuYCBpbiBJRSA4LzkvMTAvMTEgYW5kIEVkZ2UgMTIuCiAqLwoKaHIgewogICAgYm94LXNpemluZzogY29udGVudC1ib3g7IC8qIDEgKi8KICAgIGhlaWdodDogMDsgLyogMSAqLwogICAgb3ZlcmZsb3c6IHZpc2libGU7IC8qIDIgKi8KfQoKLyoqCiAqIENvbnRhaW4gb3ZlcmZsb3cgaW4gYWxsIGJyb3dzZXJzLgogKi8KCnByZSB7CiAgICBvdmVyZmxvdzogYXV0bzsKfQoKLyoqCiAqIDEuIENvcnJlY3QgaW5oZXJpdGFuY2UgYW5kIHNjYWxpbmcgb2YgZm9udC1zaXplIGZvciBwcmVmb3JtYXR0ZWQgdGV4dC4KICogMi4gQWRkcmVzcyBvZGQgYGVtYC11bml0IGZvbnQgc2l6ZSByZW5kZXJpbmcgaW4gYWxsIGJyb3dzZXJzLgogKi8KCmNvZGUsCmtiZCwKcHJlLApzYW1wIHsKICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2UsIG1vbm9zcGFjZTsgLyogMSAqLwogICAgZm9udC1zaXplOiAxZW07IC8qIDIgKi8KfQoKLyogRm9ybXMKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCi8qKgogKiBLbm93biBsaW1pdGF0aW9uOiBieSBkZWZhdWx0LCBDaHJvbWUgYW5kIFNhZmFyaSBvbiBPUyBYIGFsbG93IHZlcnkgbGltaXRlZAogKiBzdHlsaW5nIG9mIGBzZWxlY3RgLCB1bmxlc3MgYSBgYm9yZGVyYCBwcm9wZXJ0eSBpcyBzZXQuCiAqLwoKLyoqCiAqIDEuIENvcnJlY3QgZm9udCBwcm9wZXJ0aWVzIG5vdCBiZWluZyBpbmhlcml0ZWQuCiAqIDIuIEFkZHJlc3MgbWFyZ2lucyBzZXQgZGlmZmVyZW50bHkgaW4gRmlyZWZveCA0KywgU2FmYXJpLCBhbmQgQ2hyb21lLgogKi8KCmJ1dHRvbiwKaW5wdXQsCm9wdGdyb3VwLApzZWxlY3QsCnRleHRhcmVhIHsKICAgIGZvbnQ6IGluaGVyaXQ7IC8qIDEgKi8KICAgIG1hcmdpbjogMDsgLyogMiAqLwp9CgovKioKICogQWRkcmVzcyBgb3ZlcmZsb3dgIHNldCB0byBgaGlkZGVuYCBpbiBJRSA4LzkvMTAvMTEuCiAqLwoKYnV0dG9uIHsKICAgIG92ZXJmbG93OiB2aXNpYmxlOwp9CgovKioKICogQWRkcmVzcyBpbmNvbnNpc3RlbnQgYHRleHQtdHJhbnNmb3JtYCBpbmhlcml0YW5jZSBmb3IgYGJ1dHRvbmAgYW5kIGBzZWxlY3RgLgogKiBBbGwgb3RoZXIgZm9ybSBjb250cm9sIGVsZW1lbnRzIGRvIG5vdCBpbmhlcml0IGB0ZXh0LXRyYW5zZm9ybWAgdmFsdWVzLgogKiBDb3JyZWN0IGBidXR0b25gIHN0eWxlIGluaGVyaXRhbmNlIGluIEZpcmVmb3gsIElFIDgvOS8xMC8xMSwgYW5kIE9wZXJhLgogKiBDb3JyZWN0IGBzZWxlY3RgIHN0eWxlIGluaGVyaXRhbmNlIGluIEZpcmVmb3guCiAqLwoKYnV0dG9uLApzZWxlY3QgewogICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7Cn0KCi8qKgogKiAxLiBBdm9pZCB0aGUgV2ViS2l0IGJ1ZyBpbiBBbmRyb2lkIDQuMC4qIHdoZXJlICgyKSBkZXN0cm95cyBuYXRpdmUgYGF1ZGlvYAogKiAgICBhbmQgYHZpZGVvYCBjb250cm9scy4KICogMi4gQ29ycmVjdCBpbmFiaWxpdHkgdG8gc3R5bGUgY2xpY2thYmxlIGBpbnB1dGAgdHlwZXMgaW4gaU9TLgogKiAzLiBJbXByb3ZlIHVzYWJpbGl0eSBhbmQgY29uc2lzdGVuY3kgb2YgY3Vyc29yIHN0eWxlIGJldHdlZW4gaW1hZ2UtdHlwZQogKiAgICBgaW5wdXRgIGFuZCBvdGhlcnMuCiAqLwoKYnV0dG9uLApodG1sIGlucHV0W3R5cGU9ImJ1dHRvbiJdLCAvKiAxICovCmlucHV0W3R5cGU9InJlc2V0Il0sCmlucHV0W3R5cGU9InN1Ym1pdCJdIHsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uOyAvKiAyICovCiAgICBjdXJzb3I6IHBvaW50ZXI7IC8qIDMgKi8KfQoKLyoqCiAqIFJlLXNldCBkZWZhdWx0IGN1cnNvciBmb3IgZGlzYWJsZWQgZWxlbWVudHMuCiAqLwoKYnV0dG9uW2Rpc2FibGVkXSwKaHRtbCBpbnB1dFtkaXNhYmxlZF0gewogICAgY3Vyc29yOiBkZWZhdWx0Owp9CgovKioKICogUmVtb3ZlIGlubmVyIHBhZGRpbmcgYW5kIGJvcmRlciBpbiBGaXJlZm94IDQrLgogKi8KCmJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwKaW5wdXQ6Oi1tb3otZm9jdXMtaW5uZXIgewogICAgYm9yZGVyOiAwOwogICAgcGFkZGluZzogMDsKfQoKLyoqCiAqIFJlc3RvcmUgZm9jdXMgc3R5bGUgaW4gRmlyZWZveCA0KyAodW5zZXQgYnkgYSBydWxlIGFib3ZlKQogKi8KCmJ1dHRvbjotbW96LWZvY3VzcmluZywKaW5wdXQ6LW1vei1mb2N1c3JpbmcgewogICAgb3V0bGluZTogMXB4IGRvdHRlZCBCdXR0b25UZXh0Owp9CgovKioKICogQWRkcmVzcyBGaXJlZm94IDQrIHNldHRpbmcgYGxpbmUtaGVpZ2h0YCBvbiBgaW5wdXRgIHVzaW5nIGAhaW1wb3J0YW50YCBpbgogKiB0aGUgVUEgc3R5bGVzaGVldC4KICovCgppbnB1dCB7CiAgICBsaW5lLWhlaWdodDogbm9ybWFsOwp9CgovKioKICogSXQncyByZWNvbW1lbmRlZCB0aGF0IHlvdSBkb24ndCBhdHRlbXB0IHRvIHN0eWxlIHRoZXNlIGVsZW1lbnRzLgogKiBGaXJlZm94J3MgaW1wbGVtZW50YXRpb24gZG9lc24ndCByZXNwZWN0IGJveC1zaXppbmcsIHBhZGRpbmcsIG9yIHdpZHRoLgogKgogKiAxLiBBZGRyZXNzIGJveCBzaXppbmcgc2V0IHRvIGBjb250ZW50LWJveGAgaW4gSUUgOC85LzEwLgogKiAyLiBSZW1vdmUgZXhjZXNzIHBhZGRpbmcgaW4gSUUgOC85LzEwLgogKi8KCmlucHV0W3R5cGU9ImNoZWNrYm94Il0sCmlucHV0W3R5cGU9InJhZGlvIl0gewogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsgLyogMSAqLwogICAgcGFkZGluZzogMDsgLyogMiAqLwp9CgovKioKICogRml4IHRoZSBjdXJzb3Igc3R5bGUgZm9yIENocm9tZSdzIGluY3JlbWVudC9kZWNyZW1lbnQgYnV0dG9ucy4gRm9yIGNlcnRhaW4KICogYGZvbnQtc2l6ZWAgdmFsdWVzIG9mIHRoZSBgaW5wdXRgLCBpdCBjYXVzZXMgdGhlIGN1cnNvciBzdHlsZSBvZiB0aGUKICogZGVjcmVtZW50IGJ1dHRvbiB0byBjaGFuZ2UgZnJvbSBgZGVmYXVsdGAgdG8gYHRleHRgLgogKi8KCmlucHV0W3R5cGU9Im51bWJlciJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLAppbnB1dFt0eXBlPSJudW1iZXIiXTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiB7CiAgICBoZWlnaHQ6IGF1dG87Cn0KCi8qKgogKiBBZGRyZXNzIGBhcHBlYXJhbmNlYCBzZXQgdG8gYHNlYXJjaGZpZWxkYCBpbiBTYWZhcmkgYW5kIENocm9tZS4KICovCgppbnB1dFt0eXBlPSJzZWFyY2giXSB7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IHRleHRmaWVsZDsKfQoKLyoqCiAqIFJlbW92ZSBpbm5lciBwYWRkaW5nIGFuZCBzZWFyY2ggY2FuY2VsIGJ1dHRvbiBpbiBTYWZhcmkgYW5kIENocm9tZSBvbiBPUyBYLgogKiBTYWZhcmkgKGJ1dCBub3QgQ2hyb21lKSBjbGlwcyB0aGUgY2FuY2VsIGJ1dHRvbiB3aGVuIHRoZSBzZWFyY2ggaW5wdXQgaGFzCiAqIHBhZGRpbmcgKGFuZCBgdGV4dGZpZWxkYCBhcHBlYXJhbmNlKS4KICovCgppbnB1dFt0eXBlPSJzZWFyY2giXTo6LXdlYmtpdC1zZWFyY2gtY2FuY2VsLWJ1dHRvbiwKaW5wdXRbdHlwZT0ic2VhcmNoIl06Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb24gewogICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwp9CgovKioKICogRGVmaW5lIGNvbnNpc3RlbnQgYm9yZGVyLCBtYXJnaW4sIGFuZCBwYWRkaW5nLgogKi8KCmZpZWxkc2V0IHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjMGMwYzA7CiAgICBtYXJnaW46IDAgMnB4OwogICAgcGFkZGluZzogMC4zNWVtIDAuNjI1ZW0gMC43NWVtOwp9CgovKioKICogMS4gQ29ycmVjdCBgY29sb3JgIG5vdCBiZWluZyBpbmhlcml0ZWQgaW4gSUUgOC85LzEwLzExLgogKiAyLiBSZW1vdmUgcGFkZGluZyBzbyBwZW9wbGUgYXJlbid0IGNhdWdodCBvdXQgaWYgdGhleSB6ZXJvIG91dCBmaWVsZHNldHMuCiAqLwoKbGVnZW5kIHsKICAgIGJvcmRlcjogMDsgLyogMSAqLwogICAgcGFkZGluZzogMDsgLyogMiAqLwp9CgovKioKICogUmVtb3ZlIGRlZmF1bHQgdmVydGljYWwgc2Nyb2xsYmFyIGluIElFIDgvOS8xMC8xMS4KICovCgp0ZXh0YXJlYSB7CiAgICBvdmVyZmxvdzogYXV0bzsKfQoKLyoqCiAqIFJlc3RvcmUgZm9udCB3ZWlnaHQgKHVuc2V0IGJ5IGEgcnVsZSBhYm92ZSkuCiAqIE5PVEU6IHRoZSBkZWZhdWx0IGNhbm5vdCBzYWZlbHkgYmUgY2hhbmdlZCBpbiBDaHJvbWUgYW5kIFNhZmFyaSBvbiBPUyBYLgogKi8KCm9wdGdyb3VwIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwp9"; 7 | public static readonly string Directories = @"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"; 8 | public static readonly string FilesLoaded = @"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"; 9 | } --------------------------------------------------------------------------------