├── .gitattributes ├── .github └── workflows │ ├── build.yaml │ └── release.yaml ├── .gitignore ├── .gitmodules ├── .idea ├── .gitignore ├── .name ├── cmake.xml ├── ctd-helper.iml ├── misc.xml ├── modules.xml └── vcs.xml ├── .vscode ├── launch.json ├── settings.json └── tasks.json ├── CMakeLists.txt ├── cliff.toml ├── cmake ├── FindDetours.cmake └── FindSpdlog.cmake ├── compile_commands.json ├── ctd_helper.code-workspace ├── license.md ├── readme.md ├── requirements.md └── src └── red4ext ├── .clang-format ├── Addresses.hpp ├── Dialog.rc.unused ├── IO ├── FileStream.cpp └── FileStream.hpp ├── Instr.hpp ├── Main.cpp ├── ScriptHost.hpp ├── Template.hpp ├── Utils.cpp ├── Utils.hpp ├── highlight.min.js ├── highlight.min.js.frag ├── line-numbers.min.js ├── line-numbers.min.js.frag ├── packages.config ├── stdafx.cpp ├── stdafx.hpp ├── style.css └── style.css.frag /.gitattributes: -------------------------------------------------------------------------------- 1 | *.reds linguist-language=Swift 2 | # Auto detect text files and perform LF normalization 3 | * text=auto 4 | -------------------------------------------------------------------------------- /.github/workflows/build.yaml: -------------------------------------------------------------------------------- 1 | name: Build Workflow 2 | on: [ push, pull_request ] 3 | 4 | jobs: 5 | build: 6 | name: Build (${{ matrix.config }}) 7 | runs-on: windows-latest 8 | permissions: 9 | contents: write 10 | 11 | strategy: 12 | matrix: 13 | config: [ Debug, RelWithDebInfo ] 14 | 15 | steps: 16 | - uses: actions/checkout@v3 17 | with: 18 | submodules: true 19 | - uses: ilammy/msvc-dev-cmd@v1.12.1 20 | with: 21 | arch: amd64 22 | 23 | - name: Configure CMake 24 | run: cmake -B ${{ github.workspace }}/build -DCMAKE_BUILD_TYPE=${{ matrix.config }} -DCMAKE_CI_BUILD=ON -DGITHUB_ENV="$env:GITHUB_ENV" -G Ninja 25 | 26 | - name: Build 27 | id: build 28 | run: cmake --build ${{ github.workspace }}/build --config ${{ matrix.config }} 29 | 30 | - name: Get short SHA 31 | run: echo "SHORT_SHA=$("${{ github.sha }}".SubString(0, 7))" >> $env:GITHUB_ENV 32 | 33 | - name: Create environment variables 34 | run: | 35 | $config = "${{ matrix.config }}" 36 | if ($config -eq "RelWithDebInfo") { 37 | $config = "release" 38 | } 39 | else { 40 | $config = $config.ToLower() 41 | } 42 | 43 | echo "PRETTY_CONFIG=${config}" | Out-File -FilePath $env:GITHUB_ENV -Encoding UTF8 -Append 44 | 45 | - name: Upload game_dir with zip file name 46 | uses: actions/upload-artifact@v3 47 | with: 48 | name: ${{ env.MOD_ZIP_FILENAME }}_${{ env.PRETTY_CONFIG }}_${{ env.SHORT_SHA }} 49 | path: ${{ github.workspace }}/game_dir/** 50 | 51 | - name: Upload game_dir_debug with zip file name 52 | uses: actions/upload-artifact@v3 53 | with: 54 | name: ${{ env.MOD_ZIP_FILENAME }}_${{ env.PRETTY_CONFIG }}_${{ env.SHORT_SHA }}_pdb 55 | path: ${{ github.workspace }}/game_dir_debug/** 56 | 57 | - name: Upload game_dir_requirements with zip file name 58 | uses: actions/upload-artifact@v3 59 | with: 60 | name: ${{ env.MOD_ZIP_FILENAME }}_${{ env.PRETTY_CONFIG }}_${{ env.SHORT_SHA }}_requirements 61 | path: ${{ github.workspace }}/game_dir_requirements/** 62 | 63 | - name: Upload game_dir_requirements_debug with zip file name 64 | uses: actions/upload-artifact@v3 65 | with: 66 | name: ${{ env.MOD_ZIP_FILENAME }}_${{ env.PRETTY_CONFIG }}_${{ env.SHORT_SHA }}_requirements_pdb 67 | path: ${{ github.workspace }}/game_dir_requirements_debug/** 68 | 69 | - name: 'Version Badge' 70 | if: always() 71 | run: | 72 | mkdir badge 73 | echo '{"cp_version":{"label":"Cyberpunk 2077","status":"${{ env.CYBERPUNK_2077_GAME_VERSION }}","color":"${{ steps.build.outcome == 'success' && '31b75d' || 'red' }}"}}' > badge/shields.json 74 | 75 | - name: Push shields branch 76 | if: github.ref == 'refs/heads/main' 77 | uses: s0/git-publish-subdir-action@develop 78 | env: 79 | REPO: self 80 | BRANCH: shields 81 | FOLDER: badge 82 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -------------------------------------------------------------------------------- /.github/workflows/release.yaml: -------------------------------------------------------------------------------- 1 | name: Release Workflow 2 | 3 | on: 4 | push: 5 | tags: 6 | - "v[0-9]+.[0-9]+.[0-9]+*" 7 | 8 | jobs: 9 | release: 10 | name: Build & Release 11 | runs-on: windows-latest 12 | env: 13 | GIT_CLIFF_VERSION: 0.10.0 14 | CHANGELOG_FILE: ${{ github.workspace }}-CHANGES.md 15 | 16 | steps: 17 | - uses: actions/checkout@v3 18 | with: 19 | submodules: true 20 | - uses: ilammy/msvc-dev-cmd@v1.12.1 21 | with: 22 | arch: amd64 23 | 24 | - name: Configure CMake 25 | run: cmake -B ${{ github.workspace }}/build -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_CI_BUILD=ON -DGITHUB_ENV="$env:GITHUB_ENV" -G Ninja 26 | 27 | - name: Build 28 | run: cmake --build ${{ github.workspace }}/build --config RelWithDebInfo 29 | 30 | - name: Install git-cliff 31 | uses: Alex079/setup-custom-tool@v1 32 | with: 33 | archiveUrl: https://github.com/orhun/git-cliff/releases/download/v${{ env.GIT_CLIFF_VERSION }}/git-cliff-${{ env.GIT_CLIFF_VERSION }}-x86_64-pc-windows-msvc.zip 34 | archiveGlob: '*' 35 | toolName: git-cliff 36 | toolVersion: ${{ env.GIT_CLIFF_VERSION }} 37 | 38 | - name: Generate a changelog 39 | run: | 40 | git-cliff --current --strip header 41 | git-cliff --current --strip header -o ${{ env.CHANGELOG_FILE }} 42 | cat requirements.md >> ${{ env.CHANGELOG_FILE }} 43 | 44 | - name: Zipping game_dir 45 | run: tar -cvf "${{ github.workspace }}/${{ env.MOD_SLUG }}_${{ github.ref_name }}.zip" --format=zip * 46 | working-directory: game_dir 47 | 48 | - name: Zipping game_dir_debug 49 | run: tar -cvf "${{ github.workspace }}/${{ env.MOD_SLUG }}_${{ github.ref_name }}_pdb.zip" --format=zip * 50 | working-directory: game_dir_debug 51 | 52 | - name: Check file existence 53 | id: requirements_folder_exists 54 | uses: andstor/file-existence-action@v1 55 | with: 56 | files: "game_dir_requirements" 57 | 58 | - name: Check file existence 59 | id: requirements_debug_folder_exists 60 | uses: andstor/file-existence-action@v1 61 | with: 62 | files: "game_dir_requirements_debug" 63 | 64 | - name: Zipping game_dir_requirements 65 | if: steps.requirements_folder_exists.outputs.files_exists == 'true' 66 | run: tar -cvf "${{ github.workspace }}/${{ env.MOD_SLUG }}_${{ github.ref_name }}_requirements.zip" --format=zip * 67 | working-directory: game_dir_requirements 68 | 69 | - name: Zipping game_dir_requirements_debug 70 | if: steps.requirements_debug_folder_exists.outputs.files_exists == 'true' 71 | run: tar -cvf "${{ github.workspace }}/${{ env.MOD_SLUG }}_${{ github.ref_name }}_requirements_pdb.zip" --format=zip * 72 | working-directory: game_dir_requirements_debug 73 | 74 | - name: Release 75 | uses: softprops/action-gh-release@v1 76 | with: 77 | name: ${{ github.ref_name }}${{ env.CYBERPUNK_2077_GAME_VERSION_STR }} 78 | body_path: ${{ env.CHANGELOG_FILE }} 79 | append_body: true 80 | files: | 81 | ${{ env.MOD_SLUG }}_${{ github.ref_name }}.zip 82 | ${{ env.MOD_SLUG }}_${{ github.ref_name }}_requirements.zip 83 | ${{ env.MOD_SLUG }}_${{ github.ref_name }}_pdb.zip 84 | ${{ env.MOD_SLUG }}_${{ github.ref_name }}_requirements_pdb.zip 85 | prerelease: ${{ contains(github.ref_name, '-') || contains(github.ref_name, '_') }} 86 | env: 87 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 88 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.rsuser 8 | *.suo 9 | *.user 10 | *.userosscache 11 | *.sln.docstates 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Mono auto generated files 17 | mono_crash.* 18 | 19 | .build 20 | build 21 | 22 | 23 | # Build results 24 | # [Dd]ebug/ 25 | # [Dd]ebugPublic/ 26 | # [Rr]elease/ 27 | # [Rr]eleases/ 28 | # x64/ 29 | # x86/ 30 | # [Ww][Ii][Nn]32/ 31 | # [Aa][Rr][Mm]/ 32 | # [Aa][Rr][Mm]64/ 33 | # bld/ 34 | # [Bb]in/ 35 | # [Oo]bj/ 36 | # [Ll]og/ 37 | # [Ll]ogs/ 38 | 39 | src/red4ext/x64/ 40 | src/red4ext/build/ 41 | packed/ 42 | packed*.zip 43 | build*.zip 44 | resources/ctd_helper.zip 45 | resources/install_log.xml 46 | prereqs.redscripts 47 | *.zip 48 | game_dir/ 49 | game_dir_requirements/ 50 | game_dir_debug/ 51 | game_dir_requirements_debug/ 52 | 53 | Cyberpunk2077.exe* 54 | REDEngineErrorReporter.exe* 55 | 56 | # Visual Studio 2015/2017 cache/options directory 57 | .vs/ 58 | # Uncomment if you have tasks that create the project's static files in wwwroot 59 | #wwwroot/ 60 | 61 | # Visual Studio 2017 auto generated files 62 | Generated\ Files/ 63 | 64 | # MSTest test Results 65 | [Tt]est[Rr]esult*/ 66 | [Bb]uild[Ll]og.* 67 | 68 | # NUnit 69 | *.VisualState.xml 70 | TestResult.xml 71 | nunit-*.xml 72 | 73 | # Build Results of an ATL Project 74 | [Dd]ebugPS/ 75 | [Rr]eleasePS/ 76 | dlldata.c 77 | 78 | # Benchmark Results 79 | BenchmarkDotNet.Artifacts/ 80 | 81 | # .NET Core 82 | project.lock.json 83 | project.fragment.lock.json 84 | artifacts/ 85 | 86 | # ASP.NET Scaffolding 87 | ScaffoldingReadMe.txt 88 | 89 | # StyleCop 90 | StyleCopReport.xml 91 | 92 | # Files built by Visual Studio 93 | *_i.c 94 | *_p.c 95 | *_h.h 96 | *.ilk 97 | *.meta 98 | *.obj 99 | *.iobj 100 | *.pch 101 | *.pdb 102 | *.ipdb 103 | *.pgc 104 | *.pgd 105 | *.rsp 106 | *.sbr 107 | *.tlb 108 | *.tli 109 | *.tlh 110 | *.tmp 111 | *.tmp_proj 112 | *_wpftmp.csproj 113 | *.log 114 | *.vspscc 115 | *.vssscc 116 | .builds 117 | *.pidb 118 | *.svclog 119 | *.scc 120 | 121 | # Chutzpah Test files 122 | _Chutzpah* 123 | 124 | # Visual C++ cache files 125 | ipch/ 126 | *.aps 127 | *.ncb 128 | *.opendb 129 | *.opensdf 130 | *.sdf 131 | *.cachefile 132 | *.VC.db 133 | *.VC.VC.opendb 134 | 135 | # Visual Studio profiler 136 | *.psess 137 | *.vsp 138 | *.vspx 139 | *.sap 140 | 141 | # Visual Studio Trace Files 142 | *.e2e 143 | 144 | # TFS 2012 Local Workspace 145 | $tf/ 146 | 147 | # Guidance Automation Toolkit 148 | *.gpState 149 | 150 | # ReSharper is a .NET coding add-in 151 | _ReSharper*/ 152 | *.[Rr]e[Ss]harper 153 | *.DotSettings.user 154 | 155 | # TeamCity is a build add-in 156 | _TeamCity* 157 | 158 | # DotCover is a Code Coverage Tool 159 | *.dotCover 160 | 161 | # AxoCover is a Code Coverage Tool 162 | .axoCover/* 163 | !.axoCover/settings.json 164 | 165 | # Coverlet is a free, cross platform Code Coverage Tool 166 | coverage*.json 167 | coverage*.xml 168 | coverage*.info 169 | 170 | # Visual Studio code coverage results 171 | *.coverage 172 | *.coveragexml 173 | 174 | # NCrunch 175 | _NCrunch_* 176 | .*crunch*.local.xml 177 | nCrunchTemp_* 178 | 179 | # MightyMoose 180 | *.mm.* 181 | AutoTest.Net/ 182 | 183 | # Web workbench (sass) 184 | .sass-cache/ 185 | 186 | # Installshield output folder 187 | [Ee]xpress/ 188 | 189 | # DocProject is a documentation generator add-in 190 | DocProject/buildhelp/ 191 | DocProject/Help/*.HxT 192 | DocProject/Help/*.HxC 193 | DocProject/Help/*.hhc 194 | DocProject/Help/*.hhk 195 | DocProject/Help/*.hhp 196 | DocProject/Help/Html2 197 | DocProject/Help/html 198 | 199 | # Click-Once directory 200 | publish/ 201 | 202 | # Publish Web Output 203 | *.[Pp]ublish.xml 204 | *.azurePubxml 205 | # Note: Comment the next line if you want to checkin your web deploy settings, 206 | # but database connection strings (with potential passwords) will be unencrypted 207 | *.pubxml 208 | *.publishproj 209 | 210 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 211 | # checkin your Azure Web App publish settings, but sensitive information contained 212 | # in these scripts will be unencrypted 213 | PublishScripts/ 214 | 215 | # NuGet Packages 216 | *.nupkg 217 | # NuGet Symbol Packages 218 | *.snupkg 219 | # The packages folder can be ignored because of Package Restore 220 | **/[Pp]ackages/* 221 | # except build/, which is used as an MSBuild target. 222 | !**/[Pp]ackages/build/ 223 | # Uncomment if necessary however generally it will be regenerated when needed 224 | #!**/[Pp]ackages/repositories.config 225 | # NuGet v3's project.json files produces more ignorable files 226 | *.nuget.props 227 | *.nuget.targets 228 | 229 | # Microsoft Azure Build Output 230 | csx/ 231 | *.build.csdef 232 | 233 | # Microsoft Azure Emulator 234 | ecf/ 235 | rcf/ 236 | 237 | # Windows Store app package directories and files 238 | AppPackages/ 239 | BundleArtifacts/ 240 | Package.StoreAssociation.xml 241 | _pkginfo.txt 242 | *.appx 243 | *.appxbundle 244 | *.appxupload 245 | 246 | # Visual Studio cache files 247 | # files ending in .cache can be ignored 248 | *.[Cc]ache 249 | # but keep track of directories ending in .cache 250 | !?*.[Cc]ache/ 251 | 252 | # Others 253 | ClientBin/ 254 | ~$* 255 | *~ 256 | *.dbmdl 257 | *.dbproj.schemaview 258 | *.jfm 259 | *.pfx 260 | *.publishsettings 261 | orleans.codegen.cs 262 | 263 | # Including strong name files can present a security risk 264 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 265 | #*.snk 266 | 267 | # Since there are multiple workflows, uncomment next line to ignore bower_components 268 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 269 | #bower_components/ 270 | 271 | # RIA/Silverlight projects 272 | Generated_Code/ 273 | 274 | # Backup & report files from converting an old project file 275 | # to a newer Visual Studio version. Backup files are not needed, 276 | # because we have git ;-) 277 | _UpgradeReport_Files/ 278 | Backup*/ 279 | UpgradeLog*.XML 280 | UpgradeLog*.htm 281 | ServiceFabricBackup/ 282 | *.rptproj.bak 283 | 284 | # SQL Server files 285 | *.mdf 286 | *.ldf 287 | *.ndf 288 | 289 | # Business Intelligence projects 290 | *.rdl.data 291 | *.bim.layout 292 | *.bim_*.settings 293 | *.rptproj.rsuser 294 | *- [Bb]ackup.rdl 295 | *- [Bb]ackup ([0-9]).rdl 296 | *- [Bb]ackup ([0-9][0-9]).rdl 297 | 298 | # Microsoft Fakes 299 | FakesAssemblies/ 300 | 301 | # GhostDoc plugin setting file 302 | *.GhostDoc.xml 303 | 304 | # Node.js Tools for Visual Studio 305 | .ntvs_analysis.dat 306 | node_modules/ 307 | 308 | # Visual Studio 6 build log 309 | *.plg 310 | 311 | # Visual Studio 6 workspace options file 312 | *.opt 313 | 314 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 315 | *.vbw 316 | 317 | # Visual Studio LightSwitch build output 318 | **/*.HTMLClient/GeneratedArtifacts 319 | **/*.DesktopClient/GeneratedArtifacts 320 | **/*.DesktopClient/ModelManifest.xml 321 | **/*.Server/GeneratedArtifacts 322 | **/*.Server/ModelManifest.xml 323 | _Pvt_Extensions 324 | 325 | # Paket dependency manager 326 | .paket/paket.exe 327 | paket-files/ 328 | 329 | # FAKE - F# Make 330 | .fake/ 331 | 332 | # CodeRush personal settings 333 | .cr/personal 334 | 335 | # Python Tools for Visual Studio (PTVS) 336 | __pycache__/ 337 | *.pyc 338 | 339 | # Cake - Uncomment if you are using it 340 | # tools/** 341 | # !tools/packages.config 342 | 343 | # Tabs Studio 344 | *.tss 345 | 346 | # Telerik's JustMock configuration file 347 | *.jmconfig 348 | 349 | # BizTalk build output 350 | *.btp.cs 351 | *.btm.cs 352 | *.odx.cs 353 | *.xsd.cs 354 | 355 | # OpenCover UI analysis results 356 | OpenCover/ 357 | 358 | # Azure Stream Analytics local run output 359 | ASALocalRun/ 360 | 361 | # MSBuild Binary and Structured Log 362 | *.binlog 363 | 364 | # NVidia Nsight GPU debugger configuration file 365 | *.nvuser 366 | 367 | # MFractors (Xamarin productivity tool) working folder 368 | .mfractor/ 369 | 370 | # Local History for Visual Studio 371 | .localhistory/ 372 | 373 | # BeatPulse healthcheck temp database 374 | healthchecksdb 375 | 376 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 377 | MigrationBackup/ 378 | 379 | # Ionide (cross platform F# VS Code tools) working folder 380 | .ionide/ 381 | 382 | # Fody - auto-generated XML schema 383 | FodyWeavers.xsd 384 | 385 | red4ext/deps/* 386 | *.zip 387 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "deps/spdlog"] 2 | path = deps/spdlog 3 | url = https://github.com/gabime/spdlog.git 4 | [submodule "deps/detours"] 5 | path = deps/detours 6 | url = https://github.com/microsoft/Detours.git 7 | [submodule "deps/red4ext.sdk"] 8 | path = deps/red4ext.sdk 9 | url = https://github.com/jackhumbert/RED4ext.SDK.git 10 | branch = new-types 11 | [submodule "deps/cyberpunk_cmake"] 12 | path = deps/cyberpunk_cmake 13 | url = git@github.com:jackhumbert/cyberpunk_cmake.git 14 | [submodule "deps/redscript_capi"] 15 | path = deps/redscript_capi 16 | url = https://github.com/jac3km4/redscript-capi.git 17 | [submodule "deps/mod_settings"] 18 | path = deps/mod_settings 19 | url = https://github.com/jackhumbert/mod_settings.git 20 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | # Datasource local storage ignored files 7 | /dataSources/ 8 | /dataSources.local.xml 9 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | ctd_helper -------------------------------------------------------------------------------- /.idea/cmake.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/ctd-helper.iml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "cppvsdbg", 9 | "request": "launch", 10 | "name": "Debug", 11 | "preLaunchTask": "Install Mod", 12 | "program": "C:\\Program Files (x86)\\Steam\\steamapps\\common\\Cyberpunk 2077\\bin\\x64\\Cyberpunk2077.exe", 13 | "cwd": "C:\\Program Files (x86)\\Steam\\steamapps\\common\\Cyberpunk 2077\\", 14 | "visualizerFile": "${workspaceFolder}/deps/cyberpunk_cmake/.natvis", 15 | // "showDisplayString": true 16 | } 17 | ] 18 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "redscript.buildPath": "build", 3 | "redscript.sourcePath": "src/redscript", 4 | "redscript.modFolderName": "flight_control", 5 | "files.exclude": { 6 | "**/.git": true, 7 | "**/.svn": true, 8 | "**/.hg": true, 9 | "**/CVS": true, 10 | "**/.DS_Store": true, 11 | "**/Thumbs.db": true, 12 | } 13 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=733558 3 | // for the documentation about the tasks.json format 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "label": "Build Mod", 8 | "command": "echo ${command:cmake.build}", 9 | "problemMatcher": [], 10 | "detail": "Compile .dll & packed redscript files" 11 | }, 12 | { 13 | "label": "Install Mod", 14 | "command": "echo ${command:cmake.install}", 15 | "problemMatcher": [], 16 | "detail": "Install files into the game's installation directory" 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.24) 2 | 3 | list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") 4 | list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/deps/cyberpunk_cmake") 5 | list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/deps/red4ext.sdk/cmake") 6 | 7 | include(ConfigureVersionFromGit) 8 | configure_version_from_git() 9 | 10 | project(ctd_helper VERSION ${GIT_VERSION_MAJOR}.${GIT_VERSION_MINOR}.${GIT_VERSION_PATCH}) 11 | 12 | include(CyberpunkMod) 13 | 14 | configure_mod( 15 | NAME "CTD Helper" 16 | SLUG ${PROJECT_NAME} 17 | PREFIX CTD_HELPER 18 | AUTHOR "Jack Humbert" 19 | URL "https://github.com/jackhumbert/ctd_helper" 20 | LICENSE "Licensed under the MIT license. See the license.md in the root project for details." 21 | ) 22 | 23 | function(make_includable input_file output_file) 24 | file(READ ${input_file} content) 25 | set(delim "for_c++_include") 26 | string(LENGTH "${content}" content_length) 27 | message(STATUS "${input_file}: ${content_length}") 28 | if (${content_length} GREATER 16380) 29 | string(SUBSTRING "${content}" 0 16380 content_0) 30 | string(SUBSTRING "${content}" 16380 16380 content_1) 31 | set(content_0 "R\"${delim}(${content_0})${delim}\"\n") 32 | set(content_1 "R\"${delim}(${content_1})${delim}\"\n") 33 | file(WRITE ${output_file} "${content_0}") 34 | file(APPEND ${output_file} "${content_1}") 35 | else() 36 | set(content "R\"${delim}(${content})${delim}\"\n") 37 | file(WRITE ${output_file} "${content}") 38 | endif() 39 | endfunction(make_includable) 40 | 41 | make_includable(src/red4ext/style.css src/red4ext/style.css.frag) 42 | make_includable(src/red4ext/highlight.min.js src/red4ext/highlight.min.js.frag) 43 | make_includable(src/red4ext/line-numbers.min.js src/red4ext/line-numbers.min.js.frag) 44 | 45 | find_program(ZOLTAN_CLANG_EXE NAMES zoltan-clang.exe PATHS "${MOD_TOOLS_DIR}" CACHE) 46 | find_program(CYBERPUNK_2077_EXE NAMES Cyberpunk2077.exe PATHS "${CYBERPUNK_2077_GAME_DIR}/bin/x64" CACHE DOC "Cyberpunk2077.exe Executable File") 47 | 48 | configure_red4ext(src/red4ext) 49 | configure_red4ext_addresses(Addresses.hpp) 50 | 51 | find_package(Detours) 52 | find_package(Spdlog) 53 | find_package(RedscriptCAPI) 54 | find_package(ModSettings) 55 | 56 | target_link_libraries(${MOD_SLUG}.dll 57 | PUBLIC 58 | Detours 59 | spdlog 60 | RedscriptCAPI 61 | ) 62 | 63 | target_include_directories(${MOD_SLUG}.dll PRIVATE $) 64 | 65 | 66 | # target_compile_definitions(${MOD_SLUG}.dll PRIVATE 67 | # CTD_HELPER_DIALOG=1000 68 | # CTD_HELPER_OPEN=1001 69 | # ) 70 | 71 | configure_folder_file(readme.md) 72 | configure_folder_file(license.md) 73 | 74 | # configure_uninstall() 75 | configure_release(${MOD_SLUG}_${MOD_VERSION_STR}.zip) 76 | configure_install() -------------------------------------------------------------------------------- /cliff.toml: -------------------------------------------------------------------------------- 1 | [changelog] 2 | header = """ 3 | # Changelog 4 | """ 5 | # template for the changelog body 6 | # https://tera.netlify.app/docs/#introduction 7 | body = """ 8 | {% if version %}\ 9 | ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} 10 | {% else %}\ 11 | ## [unreleased] 12 | {% endif %}\ 13 | {% for group, commits in commits | group_by(attribute="group") %} 14 | ### {{ group | upper_first }} 15 | {% for commit in commits %}\ 16 | - {% if commit.breaking %}[**breaking**] {% endif %}\ 17 | {{ commit.message | upper_first }} ({{ commit.id }}) 18 | {% endfor %}\ 19 | {% endfor %} 20 | ### Contributors 21 | {% for author in commits | map(attribute="author.name") | unique %}\ 22 | - {{ author }} 23 | {% endfor %}\n 24 | """ 25 | trim = true 26 | 27 | [git] 28 | # parse the commits based on https://www.conventionalcommits.org 29 | conventional_commits = true 30 | commit_parsers = [ 31 | { message = "^feat", group = "Features" }, 32 | { message = "^fix", group = "Bug Fixes" }, 33 | { message = "^doc", group = "Documentation" }, 34 | { message = "^perf", group = "Performance" }, 35 | { message = "^refactor", group = "Refactor" }, 36 | { message = "^style", group = "Styling" }, 37 | { message = "^test", group = "Testing" }, 38 | { message = "^chore", group = "Miscellaneous", skip = true }, 39 | { message = "^ci", group = "CI", skip = true }, 40 | { body = ".*security", group = "Security" }, 41 | ] -------------------------------------------------------------------------------- /cmake/FindDetours.cmake: -------------------------------------------------------------------------------- 1 | add_library(Detours STATIC) 2 | set_target_properties(Detours PROPERTIES FOLDER "Dependencies") 3 | 4 | set(DETOURS_SRC_DIR "${PROJECT_SOURCE_DIR}/deps/detours/src") 5 | file(GLOB_RECURSE HEADER_FILES ${DETOURS_SRC_DIR}/*.h) 6 | file(GLOB_RECURSE SOURCE_FILES ${DETOURS_SRC_DIR}/*.cpp) 7 | 8 | # Remove "uimports.cpp" since it throws "detours.h version mismatch" error. 9 | list(REMOVE_ITEM SOURCE_FILES ${DETOURS_SRC_DIR}/uimports.cpp) 10 | 11 | target_include_directories(Detours PUBLIC ${DETOURS_SRC_DIR}) 12 | target_sources(Detours PRIVATE ${HEADER_FILES} ${SOURCE_FILES}) 13 | -------------------------------------------------------------------------------- /cmake/FindSpdlog.cmake: -------------------------------------------------------------------------------- 1 | option(SPDLOG_ENABLE_PCH "" ON) 2 | option(SPDLOG_DISABLE_DEFAULT_LOGGER "" ON) 3 | option(SPDLOG_FMT_EXTERNAL "" OFF) 4 | option(SPDLOG_FMT_EXTERNAL_HO "" OFF) 5 | option(SPDLOG_NO_THREAD_ID "" ON) 6 | option(SPDLOG_WCHAR_FILENAMES "" ON) 7 | option(SPDLOG_WCHAR_SUPPORT "" ON) 8 | 9 | add_subdirectory(deps/spdlog) 10 | set_target_properties(spdlog PROPERTIES FOLDER "Dependencies") 11 | 12 | target_compile_definitions(spdlog PUBLIC 13 | _ITERATOR_DEBUG_LEVEL=0 14 | ) 15 | 16 | mark_as_advanced( 17 | SPDLOG_BUILD_ALL 18 | SPDLOG_BUILD_BENCH 19 | SPDLOG_BUILD_EXAMPLE 20 | SPDLOG_BUILD_EXAMPLE_HO 21 | SPDLOG_BUILD_SHARED 22 | SPDLOG_BUILD_TESTS 23 | SPDLOG_BUILD_TESTS_HO 24 | SPDLOG_BUILD_WARNINGS 25 | SPDLOG_CLOCK_COARSE 26 | SPDLOG_DISABLE_DEFAULT_LOGGER 27 | SPDLOG_ENABLE_PCH 28 | SPDLOG_FMT_EXTERNAL 29 | SPDLOG_FMT_EXTERNAL_HO 30 | SPDLOG_INSTALL 31 | SPDLOG_NO_ATOMIC_LEVELS 32 | SPDLOG_NO_EXCEPTIONS 33 | SPDLOG_NO_THREAD_ID 34 | SPDLOG_NO_TLS 35 | SPDLOG_PREVENT_CHILD_FD 36 | SPDLOG_SANITIZE_ADDRESS 37 | SPDLOG_TIDY 38 | SPDLOG_USE_STD_FORMAT 39 | SPDLOG_WCHAR_FILENAMES 40 | SPDLOG_WCHAR_SUPPORT 41 | ) 42 | -------------------------------------------------------------------------------- /compile_commands.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 4 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -DGAME_VERSION_BUILD=74 -DGAME_VERSION_MAJOR=3 -DGAME_VERSION_MINOR=0 -DGAME_VERSION_PRIVATE=63017 -DMOD_VERSION_MAJOR=0 -DMOD_VERSION_MINOR=1 -DMOD_VERSION_PATCH=3 -DMOD_VERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033616Z\\\" -DNOMINMAX -DSPDLOG_COMPILED_LIB -DSPDLOG_DISABLE_DEFAULT_LOGGER -DSPDLOG_NO_THREAD_ID -DSPDLOG_WCHAR_FILENAMES -DSPDLOG_WCHAR_TO_UTF8_SUPPORT -DUNICODE -DVER_COMMENTS_STR=\"\\\"Built for 2.01\\\"\" -DVER_COMPANYNAME=\"\\\"Jack Humbert\\\"\" -DVER_COMPANYNAME_STR=\"\\\"Jack Humbert\\\"\" -DVER_FILEDESCRIPTION_STR=\"\\\"Red4ext plugin for Cyberpunk 2077\\\"\" -DVER_FILEVERSION=0,1,3 -DVER_FILEVERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033616Z\\\" -DVER_INTERNALNAME_STR=\\\"ctd_helper\\\" -DVER_LEGALCOPYRIGHT_STR=\"\\\"Copyright (c) 2023 Jack Humbert. All rights reserved.\\\"\" -DVER_ORIGINALFILENAME_STR=\\\"ctd_helper.dll\\\" -DVER_PRODUCTNAME_STR=\"\\\"CTD Helper\\\"\" -DVER_PRODUCTVERSION=3,0,74,63017 -DVER_PRODUCTVERSION_STR=\\\"2.01\\\" -DWIN32_LEAN_AND_MEAN -DWINVER=0x0601 -D_CRT_SECURE_NO_WARNINGS -D_ITERATOR_DEBUG_LEVEL=0 -D_UNICODE -D_WIN32_WINNT=0x0601 -Dctd_helper_dll_EXPORTS -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\src\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\cyberpunk_cmake\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\red4ext.sdk\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\archive_xl\\support\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\vendor -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\include -external:IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\redscript_capi\\src -external:W0 /DWIN32 /D_WINDOWS /EHsc /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /YcC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/CMakeFiles/ctd_helper.dll.dir/cmake_pch.hxx /FpC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/CMakeFiles/ctd_helper.dll.dir/./cmake_pch.cxx.pch /FIC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/CMakeFiles/ctd_helper.dll.dir/cmake_pch.hxx /FoCMakeFiles\\ctd_helper.dll.dir\\cmake_pch.cxx.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\build\\CMakeFiles\\ctd_helper.dll.dir\\cmake_pch.cxx", 5 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\build\\CMakeFiles\\ctd_helper.dll.dir\\cmake_pch.cxx", 6 | "output": "CMakeFiles\\ctd_helper.dll.dir\\cmake_pch.cxx.obj" 7 | }, 8 | { 9 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 10 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -DGAME_VERSION_BUILD=74 -DGAME_VERSION_MAJOR=3 -DGAME_VERSION_MINOR=0 -DGAME_VERSION_PRIVATE=63017 -DMOD_VERSION_MAJOR=0 -DMOD_VERSION_MINOR=1 -DMOD_VERSION_PATCH=3 -DMOD_VERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033616Z\\\" -DNOMINMAX -DSPDLOG_COMPILED_LIB -DSPDLOG_DISABLE_DEFAULT_LOGGER -DSPDLOG_NO_THREAD_ID -DSPDLOG_WCHAR_FILENAMES -DSPDLOG_WCHAR_TO_UTF8_SUPPORT -DUNICODE -DVER_COMMENTS_STR=\"\\\"Built for 2.01\\\"\" -DVER_COMPANYNAME=\"\\\"Jack Humbert\\\"\" -DVER_COMPANYNAME_STR=\"\\\"Jack Humbert\\\"\" -DVER_FILEDESCRIPTION_STR=\"\\\"Red4ext plugin for Cyberpunk 2077\\\"\" -DVER_FILEVERSION=0,1,3 -DVER_FILEVERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033616Z\\\" -DVER_INTERNALNAME_STR=\\\"ctd_helper\\\" -DVER_LEGALCOPYRIGHT_STR=\"\\\"Copyright (c) 2023 Jack Humbert. All rights reserved.\\\"\" -DVER_ORIGINALFILENAME_STR=\\\"ctd_helper.dll\\\" -DVER_PRODUCTNAME_STR=\"\\\"CTD Helper\\\"\" -DVER_PRODUCTVERSION=3,0,74,63017 -DVER_PRODUCTVERSION_STR=\\\"2.01\\\" -DWIN32_LEAN_AND_MEAN -DWINVER=0x0601 -D_CRT_SECURE_NO_WARNINGS -D_ITERATOR_DEBUG_LEVEL=0 -D_UNICODE -D_WIN32_WINNT=0x0601 -Dctd_helper_dll_EXPORTS -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\src\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\cyberpunk_cmake\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\red4ext.sdk\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\archive_xl\\support\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\vendor -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\include -external:IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\redscript_capi\\src -external:W0 /DWIN32 /D_WINDOWS /EHsc /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /YuC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/CMakeFiles/ctd_helper.dll.dir/cmake_pch.hxx /FpC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/CMakeFiles/ctd_helper.dll.dir/./cmake_pch.cxx.pch /FIC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/CMakeFiles/ctd_helper.dll.dir/cmake_pch.hxx /FoCMakeFiles\\ctd_helper.dll.dir\\src\\red4ext\\IO\\FileStream.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\src\\red4ext\\IO\\FileStream.cpp", 11 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\src\\red4ext\\IO\\FileStream.cpp", 12 | "output": "CMakeFiles\\ctd_helper.dll.dir\\src\\red4ext\\IO\\FileStream.cpp.obj" 13 | }, 14 | { 15 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 16 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -DGAME_VERSION_BUILD=74 -DGAME_VERSION_MAJOR=3 -DGAME_VERSION_MINOR=0 -DGAME_VERSION_PRIVATE=63017 -DMOD_VERSION_MAJOR=0 -DMOD_VERSION_MINOR=1 -DMOD_VERSION_PATCH=3 -DMOD_VERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033616Z\\\" -DNOMINMAX -DSPDLOG_COMPILED_LIB -DSPDLOG_DISABLE_DEFAULT_LOGGER -DSPDLOG_NO_THREAD_ID -DSPDLOG_WCHAR_FILENAMES -DSPDLOG_WCHAR_TO_UTF8_SUPPORT -DUNICODE -DVER_COMMENTS_STR=\"\\\"Built for 2.01\\\"\" -DVER_COMPANYNAME=\"\\\"Jack Humbert\\\"\" -DVER_COMPANYNAME_STR=\"\\\"Jack Humbert\\\"\" -DVER_FILEDESCRIPTION_STR=\"\\\"Red4ext plugin for Cyberpunk 2077\\\"\" -DVER_FILEVERSION=0,1,3 -DVER_FILEVERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033616Z\\\" -DVER_INTERNALNAME_STR=\\\"ctd_helper\\\" -DVER_LEGALCOPYRIGHT_STR=\"\\\"Copyright (c) 2023 Jack Humbert. All rights reserved.\\\"\" -DVER_ORIGINALFILENAME_STR=\\\"ctd_helper.dll\\\" -DVER_PRODUCTNAME_STR=\"\\\"CTD Helper\\\"\" -DVER_PRODUCTVERSION=3,0,74,63017 -DVER_PRODUCTVERSION_STR=\\\"2.01\\\" -DWIN32_LEAN_AND_MEAN -DWINVER=0x0601 -D_CRT_SECURE_NO_WARNINGS -D_ITERATOR_DEBUG_LEVEL=0 -D_UNICODE -D_WIN32_WINNT=0x0601 -Dctd_helper_dll_EXPORTS -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\src\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\cyberpunk_cmake\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\red4ext.sdk\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\archive_xl\\support\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\vendor -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\include -external:IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\redscript_capi\\src -external:W0 /DWIN32 /D_WINDOWS /EHsc /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /YuC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/CMakeFiles/ctd_helper.dll.dir/cmake_pch.hxx /FpC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/CMakeFiles/ctd_helper.dll.dir/./cmake_pch.cxx.pch /FIC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/CMakeFiles/ctd_helper.dll.dir/cmake_pch.hxx /FoCMakeFiles\\ctd_helper.dll.dir\\src\\red4ext\\Main.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\src\\red4ext\\Main.cpp", 17 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\src\\red4ext\\Main.cpp", 18 | "output": "CMakeFiles\\ctd_helper.dll.dir\\src\\red4ext\\Main.cpp.obj" 19 | }, 20 | { 21 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 22 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -DGAME_VERSION_BUILD=74 -DGAME_VERSION_MAJOR=3 -DGAME_VERSION_MINOR=0 -DGAME_VERSION_PRIVATE=63017 -DMOD_VERSION_MAJOR=0 -DMOD_VERSION_MINOR=1 -DMOD_VERSION_PATCH=3 -DMOD_VERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033616Z\\\" -DNOMINMAX -DSPDLOG_COMPILED_LIB -DSPDLOG_DISABLE_DEFAULT_LOGGER -DSPDLOG_NO_THREAD_ID -DSPDLOG_WCHAR_FILENAMES -DSPDLOG_WCHAR_TO_UTF8_SUPPORT -DUNICODE -DVER_COMMENTS_STR=\"\\\"Built for 2.01\\\"\" -DVER_COMPANYNAME=\"\\\"Jack Humbert\\\"\" -DVER_COMPANYNAME_STR=\"\\\"Jack Humbert\\\"\" -DVER_FILEDESCRIPTION_STR=\"\\\"Red4ext plugin for Cyberpunk 2077\\\"\" -DVER_FILEVERSION=0,1,3 -DVER_FILEVERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033616Z\\\" -DVER_INTERNALNAME_STR=\\\"ctd_helper\\\" -DVER_LEGALCOPYRIGHT_STR=\"\\\"Copyright (c) 2023 Jack Humbert. All rights reserved.\\\"\" -DVER_ORIGINALFILENAME_STR=\\\"ctd_helper.dll\\\" -DVER_PRODUCTNAME_STR=\"\\\"CTD Helper\\\"\" -DVER_PRODUCTVERSION=3,0,74,63017 -DVER_PRODUCTVERSION_STR=\\\"2.01\\\" -DWIN32_LEAN_AND_MEAN -DWINVER=0x0601 -D_CRT_SECURE_NO_WARNINGS -D_ITERATOR_DEBUG_LEVEL=0 -D_UNICODE -D_WIN32_WINNT=0x0601 -Dctd_helper_dll_EXPORTS -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\src\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\cyberpunk_cmake\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\red4ext.sdk\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\archive_xl\\support\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\vendor -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\include -external:IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\redscript_capi\\src -external:W0 /DWIN32 /D_WINDOWS /EHsc /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /YuC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/CMakeFiles/ctd_helper.dll.dir/cmake_pch.hxx /FpC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/CMakeFiles/ctd_helper.dll.dir/./cmake_pch.cxx.pch /FIC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/CMakeFiles/ctd_helper.dll.dir/cmake_pch.hxx /FoCMakeFiles\\ctd_helper.dll.dir\\src\\red4ext\\Utils.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\src\\red4ext\\Utils.cpp", 23 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\src\\red4ext\\Utils.cpp", 24 | "output": "CMakeFiles\\ctd_helper.dll.dir\\src\\red4ext\\Utils.cpp.obj" 25 | }, 26 | { 27 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 28 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -DGAME_VERSION_BUILD=74 -DGAME_VERSION_MAJOR=3 -DGAME_VERSION_MINOR=0 -DGAME_VERSION_PRIVATE=63017 -DMOD_VERSION_MAJOR=0 -DMOD_VERSION_MINOR=1 -DMOD_VERSION_PATCH=3 -DMOD_VERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033616Z\\\" -DNOMINMAX -DSPDLOG_COMPILED_LIB -DSPDLOG_DISABLE_DEFAULT_LOGGER -DSPDLOG_NO_THREAD_ID -DSPDLOG_WCHAR_FILENAMES -DSPDLOG_WCHAR_TO_UTF8_SUPPORT -DUNICODE -DVER_COMMENTS_STR=\"\\\"Built for 2.01\\\"\" -DVER_COMPANYNAME=\"\\\"Jack Humbert\\\"\" -DVER_COMPANYNAME_STR=\"\\\"Jack Humbert\\\"\" -DVER_FILEDESCRIPTION_STR=\"\\\"Red4ext plugin for Cyberpunk 2077\\\"\" -DVER_FILEVERSION=0,1,3 -DVER_FILEVERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033616Z\\\" -DVER_INTERNALNAME_STR=\\\"ctd_helper\\\" -DVER_LEGALCOPYRIGHT_STR=\"\\\"Copyright (c) 2023 Jack Humbert. All rights reserved.\\\"\" -DVER_ORIGINALFILENAME_STR=\\\"ctd_helper.dll\\\" -DVER_PRODUCTNAME_STR=\"\\\"CTD Helper\\\"\" -DVER_PRODUCTVERSION=3,0,74,63017 -DVER_PRODUCTVERSION_STR=\\\"2.01\\\" -DWIN32_LEAN_AND_MEAN -DWINVER=0x0601 -D_CRT_SECURE_NO_WARNINGS -D_ITERATOR_DEBUG_LEVEL=0 -D_UNICODE -D_WIN32_WINNT=0x0601 -Dctd_helper_dll_EXPORTS -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\src\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\cyberpunk_cmake\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\red4ext.sdk\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\archive_xl\\support\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\vendor -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\include -external:IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\redscript_capi\\src -external:W0 /DWIN32 /D_WINDOWS /EHsc /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /YuC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/CMakeFiles/ctd_helper.dll.dir/cmake_pch.hxx /FpC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/CMakeFiles/ctd_helper.dll.dir/./cmake_pch.cxx.pch /FIC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/CMakeFiles/ctd_helper.dll.dir/cmake_pch.hxx /FoCMakeFiles\\ctd_helper.dll.dir\\src\\red4ext\\stdafx.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\src\\red4ext\\stdafx.cpp", 29 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\src\\red4ext\\stdafx.cpp", 30 | "output": "CMakeFiles\\ctd_helper.dll.dir\\src\\red4ext\\stdafx.cpp.obj" 31 | }, 32 | { 33 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 34 | "command": "C:\\PROGRA~2\\WI3CF2~1\\10\\bin\\100226~1.0\\x86\\rc.exe -DGAME_VERSION_BUILD=74 -DGAME_VERSION_MAJOR=3 -DGAME_VERSION_MINOR=0 -DGAME_VERSION_PRIVATE=63017 -DMOD_VERSION_MAJOR=0 -DMOD_VERSION_MINOR=1 -DMOD_VERSION_PATCH=3 -DMOD_VERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033616Z\\\" -DNOMINMAX -DSPDLOG_COMPILED_LIB -DSPDLOG_DISABLE_DEFAULT_LOGGER -DSPDLOG_NO_THREAD_ID -DSPDLOG_WCHAR_FILENAMES -DSPDLOG_WCHAR_TO_UTF8_SUPPORT -DUNICODE -DVER_COMMENTS_STR=\"\\\"Built for 2.01\\\"\" -DVER_COMPANYNAME=\"\\\"Jack Humbert\\\"\" -DVER_COMPANYNAME_STR=\"\\\"Jack Humbert\\\"\" -DVER_FILEDESCRIPTION_STR=\"\\\"Red4ext plugin for Cyberpunk 2077\\\"\" -DVER_FILEVERSION=0,1,3 -DVER_FILEVERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033616Z\\\" -DVER_INTERNALNAME_STR=\\\"ctd_helper\\\" -DVER_LEGALCOPYRIGHT_STR=\"\\\"Copyright (c) 2023 Jack Humbert. All rights reserved.\\\"\" -DVER_ORIGINALFILENAME_STR=\\\"ctd_helper.dll\\\" -DVER_PRODUCTNAME_STR=\"\\\"CTD Helper\\\"\" -DVER_PRODUCTVERSION=3,0,74,63017 -DVER_PRODUCTVERSION_STR=\\\"2.01\\\" -DWIN32_LEAN_AND_MEAN -DWINVER=0x0601 -D_CRT_SECURE_NO_WARNINGS -D_ITERATOR_DEBUG_LEVEL=0 -D_UNICODE -D_WIN32_WINNT=0x0601 -Dctd_helper_dll_EXPORTS -I C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\src\\red4ext -I C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\cyberpunk_cmake\\include -I C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext -I C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\include -I C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\red4ext.sdk\\include -I C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\archive_xl\\support\\red4ext -I C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\include -I C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\vendor -I C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src -I C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\include -I C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\redscript_capi\\src -DWIN32 -D_DEBUG /fo CMakeFiles\\ctd_helper.dll.dir\\deps\\cyberpunk_cmake\\files\\versioninfo.rc.res C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\cyberpunk_cmake\\files\\versioninfo.rc", 35 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\cyberpunk_cmake\\files\\versioninfo.rc", 36 | "output": "CMakeFiles\\ctd_helper.dll.dir\\deps\\cyberpunk_cmake\\files\\versioninfo.rc.res" 37 | }, 38 | { 39 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 40 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src /DWIN32 /D_WINDOWS /EHsc /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /FoCMakeFiles\\Detours.dir\\deps\\detours\\src\\creatwth.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src\\creatwth.cpp", 41 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src\\creatwth.cpp", 42 | "output": "CMakeFiles\\Detours.dir\\deps\\detours\\src\\creatwth.cpp.obj" 43 | }, 44 | { 45 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 46 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src /DWIN32 /D_WINDOWS /EHsc /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /FoCMakeFiles\\Detours.dir\\deps\\detours\\src\\detours.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src\\detours.cpp", 47 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src\\detours.cpp", 48 | "output": "CMakeFiles\\Detours.dir\\deps\\detours\\src\\detours.cpp.obj" 49 | }, 50 | { 51 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 52 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src /DWIN32 /D_WINDOWS /EHsc /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /FoCMakeFiles\\Detours.dir\\deps\\detours\\src\\disasm.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src\\disasm.cpp", 53 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src\\disasm.cpp", 54 | "output": "CMakeFiles\\Detours.dir\\deps\\detours\\src\\disasm.cpp.obj" 55 | }, 56 | { 57 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 58 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src /DWIN32 /D_WINDOWS /EHsc /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /FoCMakeFiles\\Detours.dir\\deps\\detours\\src\\disolarm.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src\\disolarm.cpp", 59 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src\\disolarm.cpp", 60 | "output": "CMakeFiles\\Detours.dir\\deps\\detours\\src\\disolarm.cpp.obj" 61 | }, 62 | { 63 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 64 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src /DWIN32 /D_WINDOWS /EHsc /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /FoCMakeFiles\\Detours.dir\\deps\\detours\\src\\disolarm64.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src\\disolarm64.cpp", 65 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src\\disolarm64.cpp", 66 | "output": "CMakeFiles\\Detours.dir\\deps\\detours\\src\\disolarm64.cpp.obj" 67 | }, 68 | { 69 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 70 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src /DWIN32 /D_WINDOWS /EHsc /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /FoCMakeFiles\\Detours.dir\\deps\\detours\\src\\disolia64.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src\\disolia64.cpp", 71 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src\\disolia64.cpp", 72 | "output": "CMakeFiles\\Detours.dir\\deps\\detours\\src\\disolia64.cpp.obj" 73 | }, 74 | { 75 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 76 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src /DWIN32 /D_WINDOWS /EHsc /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /FoCMakeFiles\\Detours.dir\\deps\\detours\\src\\disolx64.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src\\disolx64.cpp", 77 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src\\disolx64.cpp", 78 | "output": "CMakeFiles\\Detours.dir\\deps\\detours\\src\\disolx64.cpp.obj" 79 | }, 80 | { 81 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 82 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src /DWIN32 /D_WINDOWS /EHsc /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /FoCMakeFiles\\Detours.dir\\deps\\detours\\src\\disolx86.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src\\disolx86.cpp", 83 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src\\disolx86.cpp", 84 | "output": "CMakeFiles\\Detours.dir\\deps\\detours\\src\\disolx86.cpp.obj" 85 | }, 86 | { 87 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 88 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src /DWIN32 /D_WINDOWS /EHsc /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /FoCMakeFiles\\Detours.dir\\deps\\detours\\src\\image.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src\\image.cpp", 89 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src\\image.cpp", 90 | "output": "CMakeFiles\\Detours.dir\\deps\\detours\\src\\image.cpp.obj" 91 | }, 92 | { 93 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 94 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src /DWIN32 /D_WINDOWS /EHsc /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /FoCMakeFiles\\Detours.dir\\deps\\detours\\src\\modules.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src\\modules.cpp", 95 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\detours\\src\\modules.cpp", 96 | "output": "CMakeFiles\\Detours.dir\\deps\\detours\\src\\modules.cpp.obj" 97 | }, 98 | { 99 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 100 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -DSPDLOG_COMPILED_LIB -DSPDLOG_DISABLE_DEFAULT_LOGGER -DSPDLOG_NO_THREAD_ID -DSPDLOG_WCHAR_FILENAMES -DSPDLOG_WCHAR_TO_UTF8_SUPPORT -D_ITERATOR_DEBUG_LEVEL=0 -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\include /DWIN32 /D_WINDOWS /EHsc /Zc:__cplusplus /MP /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /YcC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/spdlog/CMakeFiles/spdlog.dir/cmake_pch.hxx /FpC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/spdlog/CMakeFiles/spdlog.dir/./cmake_pch.cxx.pch /FIC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/spdlog/CMakeFiles/spdlog.dir/cmake_pch.hxx /Fodeps\\spdlog\\CMakeFiles\\spdlog.dir\\cmake_pch.cxx.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\build\\deps\\spdlog\\CMakeFiles\\spdlog.dir\\cmake_pch.cxx", 101 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\build\\deps\\spdlog\\CMakeFiles\\spdlog.dir\\cmake_pch.cxx", 102 | "output": "deps\\spdlog\\CMakeFiles\\spdlog.dir\\cmake_pch.cxx.obj" 103 | }, 104 | { 105 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 106 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -DSPDLOG_COMPILED_LIB -DSPDLOG_DISABLE_DEFAULT_LOGGER -DSPDLOG_NO_THREAD_ID -DSPDLOG_WCHAR_FILENAMES -DSPDLOG_WCHAR_TO_UTF8_SUPPORT -D_ITERATOR_DEBUG_LEVEL=0 -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\include /DWIN32 /D_WINDOWS /EHsc /Zc:__cplusplus /MP /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /YuC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/spdlog/CMakeFiles/spdlog.dir/cmake_pch.hxx /FpC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/spdlog/CMakeFiles/spdlog.dir/./cmake_pch.cxx.pch /FIC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/spdlog/CMakeFiles/spdlog.dir/cmake_pch.hxx /Fodeps\\spdlog\\CMakeFiles\\spdlog.dir\\src\\spdlog.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\src\\spdlog.cpp", 107 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\src\\spdlog.cpp", 108 | "output": "deps\\spdlog\\CMakeFiles\\spdlog.dir\\src\\spdlog.cpp.obj" 109 | }, 110 | { 111 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 112 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -DSPDLOG_COMPILED_LIB -DSPDLOG_DISABLE_DEFAULT_LOGGER -DSPDLOG_NO_THREAD_ID -DSPDLOG_WCHAR_FILENAMES -DSPDLOG_WCHAR_TO_UTF8_SUPPORT -D_ITERATOR_DEBUG_LEVEL=0 -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\include /DWIN32 /D_WINDOWS /EHsc /Zc:__cplusplus /MP /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /YuC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/spdlog/CMakeFiles/spdlog.dir/cmake_pch.hxx /FpC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/spdlog/CMakeFiles/spdlog.dir/./cmake_pch.cxx.pch /FIC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/spdlog/CMakeFiles/spdlog.dir/cmake_pch.hxx /Fodeps\\spdlog\\CMakeFiles\\spdlog.dir\\src\\stdout_sinks.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\src\\stdout_sinks.cpp", 113 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\src\\stdout_sinks.cpp", 114 | "output": "deps\\spdlog\\CMakeFiles\\spdlog.dir\\src\\stdout_sinks.cpp.obj" 115 | }, 116 | { 117 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 118 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -DSPDLOG_COMPILED_LIB -DSPDLOG_DISABLE_DEFAULT_LOGGER -DSPDLOG_NO_THREAD_ID -DSPDLOG_WCHAR_FILENAMES -DSPDLOG_WCHAR_TO_UTF8_SUPPORT -D_ITERATOR_DEBUG_LEVEL=0 -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\include /DWIN32 /D_WINDOWS /EHsc /Zc:__cplusplus /MP /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /YuC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/spdlog/CMakeFiles/spdlog.dir/cmake_pch.hxx /FpC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/spdlog/CMakeFiles/spdlog.dir/./cmake_pch.cxx.pch /FIC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/spdlog/CMakeFiles/spdlog.dir/cmake_pch.hxx /Fodeps\\spdlog\\CMakeFiles\\spdlog.dir\\src\\color_sinks.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\src\\color_sinks.cpp", 119 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\src\\color_sinks.cpp", 120 | "output": "deps\\spdlog\\CMakeFiles\\spdlog.dir\\src\\color_sinks.cpp.obj" 121 | }, 122 | { 123 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 124 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -DSPDLOG_COMPILED_LIB -DSPDLOG_DISABLE_DEFAULT_LOGGER -DSPDLOG_NO_THREAD_ID -DSPDLOG_WCHAR_FILENAMES -DSPDLOG_WCHAR_TO_UTF8_SUPPORT -D_ITERATOR_DEBUG_LEVEL=0 -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\include /DWIN32 /D_WINDOWS /EHsc /Zc:__cplusplus /MP /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /YuC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/spdlog/CMakeFiles/spdlog.dir/cmake_pch.hxx /FpC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/spdlog/CMakeFiles/spdlog.dir/./cmake_pch.cxx.pch /FIC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/spdlog/CMakeFiles/spdlog.dir/cmake_pch.hxx /Fodeps\\spdlog\\CMakeFiles\\spdlog.dir\\src\\file_sinks.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\src\\file_sinks.cpp", 125 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\src\\file_sinks.cpp", 126 | "output": "deps\\spdlog\\CMakeFiles\\spdlog.dir\\src\\file_sinks.cpp.obj" 127 | }, 128 | { 129 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 130 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -DSPDLOG_COMPILED_LIB -DSPDLOG_DISABLE_DEFAULT_LOGGER -DSPDLOG_NO_THREAD_ID -DSPDLOG_WCHAR_FILENAMES -DSPDLOG_WCHAR_TO_UTF8_SUPPORT -D_ITERATOR_DEBUG_LEVEL=0 -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\include /DWIN32 /D_WINDOWS /EHsc /Zc:__cplusplus /MP /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /YuC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/spdlog/CMakeFiles/spdlog.dir/cmake_pch.hxx /FpC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/spdlog/CMakeFiles/spdlog.dir/./cmake_pch.cxx.pch /FIC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/spdlog/CMakeFiles/spdlog.dir/cmake_pch.hxx /Fodeps\\spdlog\\CMakeFiles\\spdlog.dir\\src\\async.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\src\\async.cpp", 131 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\src\\async.cpp", 132 | "output": "deps\\spdlog\\CMakeFiles\\spdlog.dir\\src\\async.cpp.obj" 133 | }, 134 | { 135 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 136 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -DSPDLOG_COMPILED_LIB -DSPDLOG_DISABLE_DEFAULT_LOGGER -DSPDLOG_NO_THREAD_ID -DSPDLOG_WCHAR_FILENAMES -DSPDLOG_WCHAR_TO_UTF8_SUPPORT -D_ITERATOR_DEBUG_LEVEL=0 -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\include /DWIN32 /D_WINDOWS /EHsc /Zc:__cplusplus /MP /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /YuC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/spdlog/CMakeFiles/spdlog.dir/cmake_pch.hxx /FpC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/spdlog/CMakeFiles/spdlog.dir/./cmake_pch.cxx.pch /FIC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/spdlog/CMakeFiles/spdlog.dir/cmake_pch.hxx /Fodeps\\spdlog\\CMakeFiles\\spdlog.dir\\src\\cfg.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\src\\cfg.cpp", 137 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\src\\cfg.cpp", 138 | "output": "deps\\spdlog\\CMakeFiles\\spdlog.dir\\src\\cfg.cpp.obj" 139 | }, 140 | { 141 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 142 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -DSPDLOG_COMPILED_LIB -DSPDLOG_DISABLE_DEFAULT_LOGGER -DSPDLOG_NO_THREAD_ID -DSPDLOG_WCHAR_FILENAMES -DSPDLOG_WCHAR_TO_UTF8_SUPPORT -D_ITERATOR_DEBUG_LEVEL=0 -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\include /DWIN32 /D_WINDOWS /EHsc /Zc:__cplusplus /MP /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /YuC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/spdlog/CMakeFiles/spdlog.dir/cmake_pch.hxx /FpC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/spdlog/CMakeFiles/spdlog.dir/./cmake_pch.cxx.pch /FIC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/spdlog/CMakeFiles/spdlog.dir/cmake_pch.hxx /Fodeps\\spdlog\\CMakeFiles\\spdlog.dir\\src\\fmt.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\src\\fmt.cpp", 143 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\spdlog\\src\\fmt.cpp", 144 | "output": "deps\\spdlog\\CMakeFiles\\spdlog.dir\\src\\fmt.cpp.obj" 145 | }, 146 | { 147 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 148 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -DGAME_VERSION_BUILD=74 -DGAME_VERSION_MAJOR=3 -DGAME_VERSION_MINOR=0 -DGAME_VERSION_PRIVATE=63017 -DMOD_SETTINGS_DLLDIR_EX -DMOD_VERSION_MAJOR=0 -DMOD_VERSION_MINOR=1 -DMOD_VERSION_PATCH=3 -DMOD_VERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033619Z\\\" -DNOMINMAX -DUNICODE -DVER_COMMENTS_STR=\"\\\"Built for 2.01\\\"\" -DVER_COMPANYNAME=\"\\\"Jack Humbert\\\"\" -DVER_COMPANYNAME_STR=\"\\\"Jack Humbert\\\"\" -DVER_FILEDESCRIPTION_STR=\"\\\"Red4ext plugin for Cyberpunk 2077\\\"\" -DVER_FILEVERSION=0,1,3 -DVER_FILEVERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033619Z\\\" -DVER_INTERNALNAME_STR=\\\"mod_settings\\\" -DVER_LEGALCOPYRIGHT_STR=\"\\\"Copyright (c) 2023 Jack Humbert. All rights reserved.\\\"\" -DVER_ORIGINALFILENAME_STR=\\\"mod_settings.dll\\\" -DVER_PRODUCTNAME_STR=\"\\\"Mod Settings\\\"\" -DVER_PRODUCTVERSION=3,0,74,63017 -DVER_PRODUCTVERSION_STR=\\\"2.01\\\" -DWIN32_LEAN_AND_MEAN -DWINVER=0x0601 -D_CRT_SECURE_NO_WARNINGS -D_ITERATOR_DEBUG_LEVEL=0 -D_UNICODE -D_WIN32_WINNT=0x0601 -Dmod_settings_dll_EXPORTS -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\cyberpunk_cmake\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\red4ext.sdk\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\archive_xl\\support\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\vendor /DWIN32 /D_WINDOWS /EHsc /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /YcC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/cmake_pch.hxx /FpC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/./cmake_pch.cxx.pch /FIC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/cmake_pch.hxx /Fodeps\\mod_settings\\CMakeFiles\\mod_settings.dll.dir\\cmake_pch.cxx.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\build\\deps\\mod_settings\\CMakeFiles\\mod_settings.dll.dir\\cmake_pch.cxx", 149 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\build\\deps\\mod_settings\\CMakeFiles\\mod_settings.dll.dir\\cmake_pch.cxx", 150 | "output": "deps\\mod_settings\\CMakeFiles\\mod_settings.dll.dir\\cmake_pch.cxx.obj" 151 | }, 152 | { 153 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 154 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -DGAME_VERSION_BUILD=74 -DGAME_VERSION_MAJOR=3 -DGAME_VERSION_MINOR=0 -DGAME_VERSION_PRIVATE=63017 -DMOD_SETTINGS_DLLDIR_EX -DMOD_VERSION_MAJOR=0 -DMOD_VERSION_MINOR=1 -DMOD_VERSION_PATCH=3 -DMOD_VERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033619Z\\\" -DNOMINMAX -DUNICODE -DVER_COMMENTS_STR=\"\\\"Built for 2.01\\\"\" -DVER_COMPANYNAME=\"\\\"Jack Humbert\\\"\" -DVER_COMPANYNAME_STR=\"\\\"Jack Humbert\\\"\" -DVER_FILEDESCRIPTION_STR=\"\\\"Red4ext plugin for Cyberpunk 2077\\\"\" -DVER_FILEVERSION=0,1,3 -DVER_FILEVERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033619Z\\\" -DVER_INTERNALNAME_STR=\\\"mod_settings\\\" -DVER_LEGALCOPYRIGHT_STR=\"\\\"Copyright (c) 2023 Jack Humbert. All rights reserved.\\\"\" -DVER_ORIGINALFILENAME_STR=\\\"mod_settings.dll\\\" -DVER_PRODUCTNAME_STR=\"\\\"Mod Settings\\\"\" -DVER_PRODUCTVERSION=3,0,74,63017 -DVER_PRODUCTVERSION_STR=\\\"2.01\\\" -DWIN32_LEAN_AND_MEAN -DWINVER=0x0601 -D_CRT_SECURE_NO_WARNINGS -D_ITERATOR_DEBUG_LEVEL=0 -D_UNICODE -D_WIN32_WINNT=0x0601 -Dmod_settings_dll_EXPORTS -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\cyberpunk_cmake\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\red4ext.sdk\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\archive_xl\\support\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\vendor /DWIN32 /D_WINDOWS /EHsc /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /YuC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/cmake_pch.hxx /FpC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/./cmake_pch.cxx.pch /FIC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/cmake_pch.hxx /Fodeps\\mod_settings\\CMakeFiles\\mod_settings.dll.dir\\src\\red4ext\\Hooks\\ReleaseScriptData.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext\\Hooks\\ReleaseScriptData.cpp", 155 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext\\Hooks\\ReleaseScriptData.cpp", 156 | "output": "deps\\mod_settings\\CMakeFiles\\mod_settings.dll.dir\\src\\red4ext\\Hooks\\ReleaseScriptData.cpp.obj" 157 | }, 158 | { 159 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 160 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -DGAME_VERSION_BUILD=74 -DGAME_VERSION_MAJOR=3 -DGAME_VERSION_MINOR=0 -DGAME_VERSION_PRIVATE=63017 -DMOD_SETTINGS_DLLDIR_EX -DMOD_VERSION_MAJOR=0 -DMOD_VERSION_MINOR=1 -DMOD_VERSION_PATCH=3 -DMOD_VERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033619Z\\\" -DNOMINMAX -DUNICODE -DVER_COMMENTS_STR=\"\\\"Built for 2.01\\\"\" -DVER_COMPANYNAME=\"\\\"Jack Humbert\\\"\" -DVER_COMPANYNAME_STR=\"\\\"Jack Humbert\\\"\" -DVER_FILEDESCRIPTION_STR=\"\\\"Red4ext plugin for Cyberpunk 2077\\\"\" -DVER_FILEVERSION=0,1,3 -DVER_FILEVERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033619Z\\\" -DVER_INTERNALNAME_STR=\\\"mod_settings\\\" -DVER_LEGALCOPYRIGHT_STR=\"\\\"Copyright (c) 2023 Jack Humbert. All rights reserved.\\\"\" -DVER_ORIGINALFILENAME_STR=\\\"mod_settings.dll\\\" -DVER_PRODUCTNAME_STR=\"\\\"Mod Settings\\\"\" -DVER_PRODUCTVERSION=3,0,74,63017 -DVER_PRODUCTVERSION_STR=\\\"2.01\\\" -DWIN32_LEAN_AND_MEAN -DWINVER=0x0601 -D_CRT_SECURE_NO_WARNINGS -D_ITERATOR_DEBUG_LEVEL=0 -D_UNICODE -D_WIN32_WINNT=0x0601 -Dmod_settings_dll_EXPORTS -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\cyberpunk_cmake\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\red4ext.sdk\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\archive_xl\\support\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\vendor /DWIN32 /D_WINDOWS /EHsc /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /YuC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/cmake_pch.hxx /FpC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/./cmake_pch.cxx.pch /FIC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/cmake_pch.hxx /Fodeps\\mod_settings\\CMakeFiles\\mod_settings.dll.dir\\src\\red4ext\\IRuntimeVariable.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext\\IRuntimeVariable.cpp", 161 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext\\IRuntimeVariable.cpp", 162 | "output": "deps\\mod_settings\\CMakeFiles\\mod_settings.dll.dir\\src\\red4ext\\IRuntimeVariable.cpp.obj" 163 | }, 164 | { 165 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 166 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -DGAME_VERSION_BUILD=74 -DGAME_VERSION_MAJOR=3 -DGAME_VERSION_MINOR=0 -DGAME_VERSION_PRIVATE=63017 -DMOD_SETTINGS_DLLDIR_EX -DMOD_VERSION_MAJOR=0 -DMOD_VERSION_MINOR=1 -DMOD_VERSION_PATCH=3 -DMOD_VERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033619Z\\\" -DNOMINMAX -DUNICODE -DVER_COMMENTS_STR=\"\\\"Built for 2.01\\\"\" -DVER_COMPANYNAME=\"\\\"Jack Humbert\\\"\" -DVER_COMPANYNAME_STR=\"\\\"Jack Humbert\\\"\" -DVER_FILEDESCRIPTION_STR=\"\\\"Red4ext plugin for Cyberpunk 2077\\\"\" -DVER_FILEVERSION=0,1,3 -DVER_FILEVERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033619Z\\\" -DVER_INTERNALNAME_STR=\\\"mod_settings\\\" -DVER_LEGALCOPYRIGHT_STR=\"\\\"Copyright (c) 2023 Jack Humbert. All rights reserved.\\\"\" -DVER_ORIGINALFILENAME_STR=\\\"mod_settings.dll\\\" -DVER_PRODUCTNAME_STR=\"\\\"Mod Settings\\\"\" -DVER_PRODUCTVERSION=3,0,74,63017 -DVER_PRODUCTVERSION_STR=\\\"2.01\\\" -DWIN32_LEAN_AND_MEAN -DWINVER=0x0601 -D_CRT_SECURE_NO_WARNINGS -D_ITERATOR_DEBUG_LEVEL=0 -D_UNICODE -D_WIN32_WINNT=0x0601 -Dmod_settings_dll_EXPORTS -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\cyberpunk_cmake\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\red4ext.sdk\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\archive_xl\\support\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\vendor /DWIN32 /D_WINDOWS /EHsc /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /YuC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/cmake_pch.hxx /FpC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/./cmake_pch.cxx.pch /FIC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/cmake_pch.hxx /Fodeps\\mod_settings\\CMakeFiles\\mod_settings.dll.dir\\src\\red4ext\\Main.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext\\Main.cpp", 167 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext\\Main.cpp", 168 | "output": "deps\\mod_settings\\CMakeFiles\\mod_settings.dll.dir\\src\\red4ext\\Main.cpp.obj" 169 | }, 170 | { 171 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 172 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -DGAME_VERSION_BUILD=74 -DGAME_VERSION_MAJOR=3 -DGAME_VERSION_MINOR=0 -DGAME_VERSION_PRIVATE=63017 -DMOD_SETTINGS_DLLDIR_EX -DMOD_VERSION_MAJOR=0 -DMOD_VERSION_MINOR=1 -DMOD_VERSION_PATCH=3 -DMOD_VERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033619Z\\\" -DNOMINMAX -DUNICODE -DVER_COMMENTS_STR=\"\\\"Built for 2.01\\\"\" -DVER_COMPANYNAME=\"\\\"Jack Humbert\\\"\" -DVER_COMPANYNAME_STR=\"\\\"Jack Humbert\\\"\" -DVER_FILEDESCRIPTION_STR=\"\\\"Red4ext plugin for Cyberpunk 2077\\\"\" -DVER_FILEVERSION=0,1,3 -DVER_FILEVERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033619Z\\\" -DVER_INTERNALNAME_STR=\\\"mod_settings\\\" -DVER_LEGALCOPYRIGHT_STR=\"\\\"Copyright (c) 2023 Jack Humbert. All rights reserved.\\\"\" -DVER_ORIGINALFILENAME_STR=\\\"mod_settings.dll\\\" -DVER_PRODUCTNAME_STR=\"\\\"Mod Settings\\\"\" -DVER_PRODUCTVERSION=3,0,74,63017 -DVER_PRODUCTVERSION_STR=\\\"2.01\\\" -DWIN32_LEAN_AND_MEAN -DWINVER=0x0601 -D_CRT_SECURE_NO_WARNINGS -D_ITERATOR_DEBUG_LEVEL=0 -D_UNICODE -D_WIN32_WINNT=0x0601 -Dmod_settings_dll_EXPORTS -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\cyberpunk_cmake\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\red4ext.sdk\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\archive_xl\\support\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\vendor /DWIN32 /D_WINDOWS /EHsc /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /YuC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/cmake_pch.hxx /FpC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/./cmake_pch.cxx.pch /FIC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/cmake_pch.hxx /Fodeps\\mod_settings\\CMakeFiles\\mod_settings.dll.dir\\src\\red4ext\\ModConfigVar.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext\\ModConfigVar.cpp", 173 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext\\ModConfigVar.cpp", 174 | "output": "deps\\mod_settings\\CMakeFiles\\mod_settings.dll.dir\\src\\red4ext\\ModConfigVar.cpp.obj" 175 | }, 176 | { 177 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 178 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -DGAME_VERSION_BUILD=74 -DGAME_VERSION_MAJOR=3 -DGAME_VERSION_MINOR=0 -DGAME_VERSION_PRIVATE=63017 -DMOD_SETTINGS_DLLDIR_EX -DMOD_VERSION_MAJOR=0 -DMOD_VERSION_MINOR=1 -DMOD_VERSION_PATCH=3 -DMOD_VERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033619Z\\\" -DNOMINMAX -DUNICODE -DVER_COMMENTS_STR=\"\\\"Built for 2.01\\\"\" -DVER_COMPANYNAME=\"\\\"Jack Humbert\\\"\" -DVER_COMPANYNAME_STR=\"\\\"Jack Humbert\\\"\" -DVER_FILEDESCRIPTION_STR=\"\\\"Red4ext plugin for Cyberpunk 2077\\\"\" -DVER_FILEVERSION=0,1,3 -DVER_FILEVERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033619Z\\\" -DVER_INTERNALNAME_STR=\\\"mod_settings\\\" -DVER_LEGALCOPYRIGHT_STR=\"\\\"Copyright (c) 2023 Jack Humbert. All rights reserved.\\\"\" -DVER_ORIGINALFILENAME_STR=\\\"mod_settings.dll\\\" -DVER_PRODUCTNAME_STR=\"\\\"Mod Settings\\\"\" -DVER_PRODUCTVERSION=3,0,74,63017 -DVER_PRODUCTVERSION_STR=\\\"2.01\\\" -DWIN32_LEAN_AND_MEAN -DWINVER=0x0601 -D_CRT_SECURE_NO_WARNINGS -D_ITERATOR_DEBUG_LEVEL=0 -D_UNICODE -D_WIN32_WINNT=0x0601 -Dmod_settings_dll_EXPORTS -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\cyberpunk_cmake\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\red4ext.sdk\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\archive_xl\\support\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\vendor /DWIN32 /D_WINDOWS /EHsc /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /YuC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/cmake_pch.hxx /FpC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/./cmake_pch.cxx.pch /FIC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/cmake_pch.hxx /Fodeps\\mod_settings\\CMakeFiles\\mod_settings.dll.dir\\src\\red4ext\\ModSettings.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext\\ModSettings.cpp", 179 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext\\ModSettings.cpp", 180 | "output": "deps\\mod_settings\\CMakeFiles\\mod_settings.dll.dir\\src\\red4ext\\ModSettings.cpp.obj" 181 | }, 182 | { 183 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 184 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -DGAME_VERSION_BUILD=74 -DGAME_VERSION_MAJOR=3 -DGAME_VERSION_MINOR=0 -DGAME_VERSION_PRIVATE=63017 -DMOD_SETTINGS_DLLDIR_EX -DMOD_VERSION_MAJOR=0 -DMOD_VERSION_MINOR=1 -DMOD_VERSION_PATCH=3 -DMOD_VERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033619Z\\\" -DNOMINMAX -DUNICODE -DVER_COMMENTS_STR=\"\\\"Built for 2.01\\\"\" -DVER_COMPANYNAME=\"\\\"Jack Humbert\\\"\" -DVER_COMPANYNAME_STR=\"\\\"Jack Humbert\\\"\" -DVER_FILEDESCRIPTION_STR=\"\\\"Red4ext plugin for Cyberpunk 2077\\\"\" -DVER_FILEVERSION=0,1,3 -DVER_FILEVERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033619Z\\\" -DVER_INTERNALNAME_STR=\\\"mod_settings\\\" -DVER_LEGALCOPYRIGHT_STR=\"\\\"Copyright (c) 2023 Jack Humbert. All rights reserved.\\\"\" -DVER_ORIGINALFILENAME_STR=\\\"mod_settings.dll\\\" -DVER_PRODUCTNAME_STR=\"\\\"Mod Settings\\\"\" -DVER_PRODUCTVERSION=3,0,74,63017 -DVER_PRODUCTVERSION_STR=\\\"2.01\\\" -DWIN32_LEAN_AND_MEAN -DWINVER=0x0601 -D_CRT_SECURE_NO_WARNINGS -D_ITERATOR_DEBUG_LEVEL=0 -D_UNICODE -D_WIN32_WINNT=0x0601 -Dmod_settings_dll_EXPORTS -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\cyberpunk_cmake\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\red4ext.sdk\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\archive_xl\\support\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\vendor /DWIN32 /D_WINDOWS /EHsc /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /YuC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/cmake_pch.hxx /FpC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/./cmake_pch.cxx.pch /FIC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/cmake_pch.hxx /Fodeps\\mod_settings\\CMakeFiles\\mod_settings.dll.dir\\src\\red4ext\\RuntimeVariable.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext\\RuntimeVariable.cpp", 185 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext\\RuntimeVariable.cpp", 186 | "output": "deps\\mod_settings\\CMakeFiles\\mod_settings.dll.dir\\src\\red4ext\\RuntimeVariable.cpp.obj" 187 | }, 188 | { 189 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 190 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -DGAME_VERSION_BUILD=74 -DGAME_VERSION_MAJOR=3 -DGAME_VERSION_MINOR=0 -DGAME_VERSION_PRIVATE=63017 -DMOD_SETTINGS_DLLDIR_EX -DMOD_VERSION_MAJOR=0 -DMOD_VERSION_MINOR=1 -DMOD_VERSION_PATCH=3 -DMOD_VERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033619Z\\\" -DNOMINMAX -DUNICODE -DVER_COMMENTS_STR=\"\\\"Built for 2.01\\\"\" -DVER_COMPANYNAME=\"\\\"Jack Humbert\\\"\" -DVER_COMPANYNAME_STR=\"\\\"Jack Humbert\\\"\" -DVER_FILEDESCRIPTION_STR=\"\\\"Red4ext plugin for Cyberpunk 2077\\\"\" -DVER_FILEVERSION=0,1,3 -DVER_FILEVERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033619Z\\\" -DVER_INTERNALNAME_STR=\\\"mod_settings\\\" -DVER_LEGALCOPYRIGHT_STR=\"\\\"Copyright (c) 2023 Jack Humbert. All rights reserved.\\\"\" -DVER_ORIGINALFILENAME_STR=\\\"mod_settings.dll\\\" -DVER_PRODUCTNAME_STR=\"\\\"Mod Settings\\\"\" -DVER_PRODUCTVERSION=3,0,74,63017 -DVER_PRODUCTVERSION_STR=\\\"2.01\\\" -DWIN32_LEAN_AND_MEAN -DWINVER=0x0601 -D_CRT_SECURE_NO_WARNINGS -D_ITERATOR_DEBUG_LEVEL=0 -D_UNICODE -D_WIN32_WINNT=0x0601 -Dmod_settings_dll_EXPORTS -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\cyberpunk_cmake\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\red4ext.sdk\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\archive_xl\\support\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\vendor /DWIN32 /D_WINDOWS /EHsc /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /YuC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/cmake_pch.hxx /FpC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/./cmake_pch.cxx.pch /FIC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/cmake_pch.hxx /Fodeps\\mod_settings\\CMakeFiles\\mod_settings.dll.dir\\src\\red4ext\\Scripting\\RTTIRegistrar.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext\\Scripting\\RTTIRegistrar.cpp", 191 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext\\Scripting\\RTTIRegistrar.cpp", 192 | "output": "deps\\mod_settings\\CMakeFiles\\mod_settings.dll.dir\\src\\red4ext\\Scripting\\RTTIRegistrar.cpp.obj" 193 | }, 194 | { 195 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 196 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -DGAME_VERSION_BUILD=74 -DGAME_VERSION_MAJOR=3 -DGAME_VERSION_MINOR=0 -DGAME_VERSION_PRIVATE=63017 -DMOD_SETTINGS_DLLDIR_EX -DMOD_VERSION_MAJOR=0 -DMOD_VERSION_MINOR=1 -DMOD_VERSION_PATCH=3 -DMOD_VERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033619Z\\\" -DNOMINMAX -DUNICODE -DVER_COMMENTS_STR=\"\\\"Built for 2.01\\\"\" -DVER_COMPANYNAME=\"\\\"Jack Humbert\\\"\" -DVER_COMPANYNAME_STR=\"\\\"Jack Humbert\\\"\" -DVER_FILEDESCRIPTION_STR=\"\\\"Red4ext plugin for Cyberpunk 2077\\\"\" -DVER_FILEVERSION=0,1,3 -DVER_FILEVERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033619Z\\\" -DVER_INTERNALNAME_STR=\\\"mod_settings\\\" -DVER_LEGALCOPYRIGHT_STR=\"\\\"Copyright (c) 2023 Jack Humbert. All rights reserved.\\\"\" -DVER_ORIGINALFILENAME_STR=\\\"mod_settings.dll\\\" -DVER_PRODUCTNAME_STR=\"\\\"Mod Settings\\\"\" -DVER_PRODUCTVERSION=3,0,74,63017 -DVER_PRODUCTVERSION_STR=\\\"2.01\\\" -DWIN32_LEAN_AND_MEAN -DWINVER=0x0601 -D_CRT_SECURE_NO_WARNINGS -D_ITERATOR_DEBUG_LEVEL=0 -D_UNICODE -D_WIN32_WINNT=0x0601 -Dmod_settings_dll_EXPORTS -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\cyberpunk_cmake\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\red4ext.sdk\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\archive_xl\\support\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\vendor /DWIN32 /D_WINDOWS /EHsc /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /YuC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/cmake_pch.hxx /FpC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/./cmake_pch.cxx.pch /FIC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/cmake_pch.hxx /Fodeps\\mod_settings\\CMakeFiles\\mod_settings.dll.dir\\src\\red4ext\\Utils.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext\\Utils.cpp", 197 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext\\Utils.cpp", 198 | "output": "deps\\mod_settings\\CMakeFiles\\mod_settings.dll.dir\\src\\red4ext\\Utils.cpp.obj" 199 | }, 200 | { 201 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 202 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -DGAME_VERSION_BUILD=74 -DGAME_VERSION_MAJOR=3 -DGAME_VERSION_MINOR=0 -DGAME_VERSION_PRIVATE=63017 -DMOD_SETTINGS_DLLDIR_EX -DMOD_VERSION_MAJOR=0 -DMOD_VERSION_MINOR=1 -DMOD_VERSION_PATCH=3 -DMOD_VERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033619Z\\\" -DNOMINMAX -DUNICODE -DVER_COMMENTS_STR=\"\\\"Built for 2.01\\\"\" -DVER_COMPANYNAME=\"\\\"Jack Humbert\\\"\" -DVER_COMPANYNAME_STR=\"\\\"Jack Humbert\\\"\" -DVER_FILEDESCRIPTION_STR=\"\\\"Red4ext plugin for Cyberpunk 2077\\\"\" -DVER_FILEVERSION=0,1,3 -DVER_FILEVERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033619Z\\\" -DVER_INTERNALNAME_STR=\\\"mod_settings\\\" -DVER_LEGALCOPYRIGHT_STR=\"\\\"Copyright (c) 2023 Jack Humbert. All rights reserved.\\\"\" -DVER_ORIGINALFILENAME_STR=\\\"mod_settings.dll\\\" -DVER_PRODUCTNAME_STR=\"\\\"Mod Settings\\\"\" -DVER_PRODUCTVERSION=3,0,74,63017 -DVER_PRODUCTVERSION_STR=\\\"2.01\\\" -DWIN32_LEAN_AND_MEAN -DWINVER=0x0601 -D_CRT_SECURE_NO_WARNINGS -D_ITERATOR_DEBUG_LEVEL=0 -D_UNICODE -D_WIN32_WINNT=0x0601 -Dmod_settings_dll_EXPORTS -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\cyberpunk_cmake\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\red4ext.sdk\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\archive_xl\\support\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\vendor /DWIN32 /D_WINDOWS /EHsc /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /YuC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/cmake_pch.hxx /FpC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/./cmake_pch.cxx.pch /FIC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/cmake_pch.hxx /Fodeps\\mod_settings\\CMakeFiles\\mod_settings.dll.dir\\src\\red4ext\\Variable.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext\\Variable.cpp", 203 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext\\Variable.cpp", 204 | "output": "deps\\mod_settings\\CMakeFiles\\mod_settings.dll.dir\\src\\red4ext\\Variable.cpp.obj" 205 | }, 206 | { 207 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 208 | "command": "C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1435~1.322\\bin\\Hostx64\\x64\\cl.exe /nologo /TP -DGAME_VERSION_BUILD=74 -DGAME_VERSION_MAJOR=3 -DGAME_VERSION_MINOR=0 -DGAME_VERSION_PRIVATE=63017 -DMOD_SETTINGS_DLLDIR_EX -DMOD_VERSION_MAJOR=0 -DMOD_VERSION_MINOR=1 -DMOD_VERSION_PATCH=3 -DMOD_VERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033619Z\\\" -DNOMINMAX -DUNICODE -DVER_COMMENTS_STR=\"\\\"Built for 2.01\\\"\" -DVER_COMPANYNAME=\"\\\"Jack Humbert\\\"\" -DVER_COMPANYNAME_STR=\"\\\"Jack Humbert\\\"\" -DVER_FILEDESCRIPTION_STR=\"\\\"Red4ext plugin for Cyberpunk 2077\\\"\" -DVER_FILEVERSION=0,1,3 -DVER_FILEVERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033619Z\\\" -DVER_INTERNALNAME_STR=\\\"mod_settings\\\" -DVER_LEGALCOPYRIGHT_STR=\"\\\"Copyright (c) 2023 Jack Humbert. All rights reserved.\\\"\" -DVER_ORIGINALFILENAME_STR=\\\"mod_settings.dll\\\" -DVER_PRODUCTNAME_STR=\"\\\"Mod Settings\\\"\" -DVER_PRODUCTVERSION=3,0,74,63017 -DVER_PRODUCTVERSION_STR=\\\"2.01\\\" -DWIN32_LEAN_AND_MEAN -DWINVER=0x0601 -D_CRT_SECURE_NO_WARNINGS -D_ITERATOR_DEBUG_LEVEL=0 -D_UNICODE -D_WIN32_WINNT=0x0601 -Dmod_settings_dll_EXPORTS -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\cyberpunk_cmake\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\red4ext.sdk\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\archive_xl\\support\\red4ext -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\include -IC:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\vendor /DWIN32 /D_WINDOWS /EHsc /Zi /Ob0 /Od /RTC1 -std:c++20 -MDd /YuC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/cmake_pch.hxx /FpC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/./cmake_pch.cxx.pch /FIC:/Users/Jack/Documents/cyberpunk/ctd-helper/build/deps/mod_settings/CMakeFiles/mod_settings.dll.dir/cmake_pch.hxx /Fodeps\\mod_settings\\CMakeFiles\\mod_settings.dll.dir\\src\\red4ext\\stdafx.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext\\stdafx.cpp", 209 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext\\stdafx.cpp", 210 | "output": "deps\\mod_settings\\CMakeFiles\\mod_settings.dll.dir\\src\\red4ext\\stdafx.cpp.obj" 211 | }, 212 | { 213 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 214 | "command": "C:\\PROGRA~2\\WI3CF2~1\\10\\bin\\100226~1.0\\x86\\rc.exe -DGAME_VERSION_BUILD=74 -DGAME_VERSION_MAJOR=3 -DGAME_VERSION_MINOR=0 -DGAME_VERSION_PRIVATE=63017 -DMOD_SETTINGS_DLLDIR_EX -DMOD_VERSION_MAJOR=0 -DMOD_VERSION_MINOR=1 -DMOD_VERSION_PATCH=3 -DMOD_VERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033619Z\\\" -DNOMINMAX -DUNICODE -DVER_COMMENTS_STR=\"\\\"Built for 2.01\\\"\" -DVER_COMPANYNAME=\"\\\"Jack Humbert\\\"\" -DVER_COMPANYNAME_STR=\"\\\"Jack Humbert\\\"\" -DVER_FILEDESCRIPTION_STR=\"\\\"Red4ext plugin for Cyberpunk 2077\\\"\" -DVER_FILEVERSION=0,1,3 -DVER_FILEVERSION_STR=\\\"0.1.3-profiling-test+main.18.a6a3a45.20231008T033619Z\\\" -DVER_INTERNALNAME_STR=\\\"mod_settings\\\" -DVER_LEGALCOPYRIGHT_STR=\"\\\"Copyright (c) 2023 Jack Humbert. All rights reserved.\\\"\" -DVER_ORIGINALFILENAME_STR=\\\"mod_settings.dll\\\" -DVER_PRODUCTNAME_STR=\"\\\"Mod Settings\\\"\" -DVER_PRODUCTVERSION=3,0,74,63017 -DVER_PRODUCTVERSION_STR=\\\"2.01\\\" -DWIN32_LEAN_AND_MEAN -DWINVER=0x0601 -D_CRT_SECURE_NO_WARNINGS -D_ITERATOR_DEBUG_LEVEL=0 -D_UNICODE -D_WIN32_WINNT=0x0601 -Dmod_settings_dll_EXPORTS -I C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\red4ext -I C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\cyberpunk_cmake\\include -I C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\include -I C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\red4ext.sdk\\include -I C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\archive_xl\\support\\red4ext -I C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\include -I C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\deps\\red_lib\\vendor -DWIN32 -D_DEBUG /fo deps\\mod_settings\\CMakeFiles\\mod_settings.dll.dir\\__\\cyberpunk_cmake\\files\\versioninfo.rc.res C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\cyberpunk_cmake\\files\\versioninfo.rc", 215 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\cyberpunk_cmake\\files\\versioninfo.rc", 216 | "output": "deps\\mod_settings\\CMakeFiles\\mod_settings.dll.dir\\__\\cyberpunk_cmake\\files\\versioninfo.rc.res" 217 | }, 218 | { 219 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 220 | "command": "\"C:\\Program Files\\CMake\\bin\\cmake.exe\" -E copy_if_different C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\redscript\\mod_settings\\ModSettings.reds deps\\mod_settings\\CMakeFiles\\mod_settings.packed.reds.dir\\src\\redscript\\mod_settings\\ModSettings.reds", 221 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\redscript\\mod_settings\\ModSettings.reds", 222 | "output": "deps\\mod_settings\\CMakeFiles\\mod_settings.packed.reds.dir\\src\\redscript\\mod_settings\\ModSettings.reds" 223 | }, 224 | { 225 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 226 | "command": "\"C:\\Program Files\\CMake\\bin\\cmake.exe\" -E copy_if_different C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\redscript\\mod_settings\\ModSettingsMainGameController.reds deps\\mod_settings\\CMakeFiles\\mod_settings.packed.reds.dir\\src\\redscript\\mod_settings\\ModSettingsMainGameController.reds", 227 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\redscript\\mod_settings\\ModSettingsMainGameController.reds", 228 | "output": "deps\\mod_settings\\CMakeFiles\\mod_settings.packed.reds.dir\\src\\redscript\\mod_settings\\ModSettingsMainGameController.reds" 229 | }, 230 | { 231 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 232 | "command": "\"C:\\Program Files\\CMake\\bin\\cmake.exe\" -E copy_if_different C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\redscript\\mod_settings\\ModSettingsNotificationListener.reds deps\\mod_settings\\CMakeFiles\\mod_settings.packed.reds.dir\\src\\redscript\\mod_settings\\ModSettingsNotificationListener.reds", 233 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\redscript\\mod_settings\\ModSettingsNotificationListener.reds", 234 | "output": "deps\\mod_settings\\CMakeFiles\\mod_settings.packed.reds.dir\\src\\redscript\\mod_settings\\ModSettingsNotificationListener.reds" 235 | }, 236 | { 237 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 238 | "command": "\"C:\\Program Files\\CMake\\bin\\cmake.exe\" -E copy_if_different C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\redscript\\mod_settings\\_SettingsCategoryController.reds deps\\mod_settings\\CMakeFiles\\mod_settings.packed.reds.dir\\src\\redscript\\mod_settings\\_SettingsCategoryController.reds", 239 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\redscript\\mod_settings\\_SettingsCategoryController.reds", 240 | "output": "deps\\mod_settings\\CMakeFiles\\mod_settings.packed.reds.dir\\src\\redscript\\mod_settings\\_SettingsCategoryController.reds" 241 | }, 242 | { 243 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 244 | "command": "\"C:\\Program Files\\CMake\\bin\\cmake.exe\" -E copy_if_different C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\redscript\\mod_settings\\_SettingsSelectorControllers.reds deps\\mod_settings\\CMakeFiles\\mod_settings.packed.reds.dir\\src\\redscript\\mod_settings\\_SettingsSelectorControllers.reds", 245 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\redscript\\mod_settings\\_SettingsSelectorControllers.reds", 246 | "output": "deps\\mod_settings\\CMakeFiles\\mod_settings.packed.reds.dir\\src\\redscript\\mod_settings\\_SettingsSelectorControllers.reds" 247 | }, 248 | { 249 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 250 | "command": "\"C:\\Program Files\\CMake\\bin\\cmake.exe\" -E copy_if_different C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\redscript\\mod_settings\\_deathMenu.reds deps\\mod_settings\\CMakeFiles\\mod_settings.packed.reds.dir\\src\\redscript\\mod_settings\\_deathMenu.reds", 251 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\redscript\\mod_settings\\_deathMenu.reds", 252 | "output": "deps\\mod_settings\\CMakeFiles\\mod_settings.packed.reds.dir\\src\\redscript\\mod_settings\\_deathMenu.reds" 253 | }, 254 | { 255 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 256 | "command": "\"C:\\Program Files\\CMake\\bin\\cmake.exe\" -E copy_if_different C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\redscript\\mod_settings\\_pauseMenu.reds deps\\mod_settings\\CMakeFiles\\mod_settings.packed.reds.dir\\src\\redscript\\mod_settings\\_pauseMenu.reds", 257 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\redscript\\mod_settings\\_pauseMenu.reds", 258 | "output": "deps\\mod_settings\\CMakeFiles\\mod_settings.packed.reds.dir\\src\\redscript\\mod_settings\\_pauseMenu.reds" 259 | }, 260 | { 261 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 262 | "command": "\"C:\\Program Files\\CMake\\bin\\cmake.exe\" -E copy_if_different C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\redscript\\mod_settings\\_pauseScenario.reds deps\\mod_settings\\CMakeFiles\\mod_settings.packed.reds.dir\\src\\redscript\\mod_settings\\_pauseScenario.reds", 263 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\redscript\\mod_settings\\_pauseScenario.reds", 264 | "output": "deps\\mod_settings\\CMakeFiles\\mod_settings.packed.reds.dir\\src\\redscript\\mod_settings\\_pauseScenario.reds" 265 | }, 266 | { 267 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 268 | "command": "\"C:\\Program Files\\CMake\\bin\\cmake.exe\" -E copy_if_different C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\redscript\\mod_settings\\_preGameScenarios.reds deps\\mod_settings\\CMakeFiles\\mod_settings.packed.reds.dir\\src\\redscript\\mod_settings\\_preGameScenarios.reds", 269 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\redscript\\mod_settings\\_preGameScenarios.reds", 270 | "output": "deps\\mod_settings\\CMakeFiles\\mod_settings.packed.reds.dir\\src\\redscript\\mod_settings\\_preGameScenarios.reds" 271 | }, 272 | { 273 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 274 | "command": "\"C:\\Program Files\\CMake\\bin\\cmake.exe\" -E copy_if_different C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\redscript\\mod_settings\\_singleplayerMenu.reds deps\\mod_settings\\CMakeFiles\\mod_settings.packed.reds.dir\\src\\redscript\\mod_settings\\_singleplayerMenu.reds", 275 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\deps\\mod_settings\\src\\redscript\\mod_settings\\_singleplayerMenu.reds", 276 | "output": "deps\\mod_settings\\CMakeFiles\\mod_settings.packed.reds.dir\\src\\redscript\\mod_settings\\_singleplayerMenu.reds" 277 | }, 278 | { 279 | "directory": "C:/Users/Jack/Documents/cyberpunk/ctd-helper/build", 280 | "command": "\"C:\\Program Files\\CMake\\bin\\cmake.exe\" -E copy_if_different C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\build\\deps\\mod_settings\\mod_settings.module.reds deps\\mod_settings\\CMakeFiles\\mod_settings.module.reds.dir\\mod_settings.module.reds", 281 | "file": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd-helper\\build\\deps\\mod_settings\\mod_settings.module.reds", 282 | "output": "deps\\mod_settings\\CMakeFiles\\mod_settings.module.reds.dir\\mod_settings.module.reds" 283 | } 284 | ] -------------------------------------------------------------------------------- /ctd_helper.code-workspace: -------------------------------------------------------------------------------- 1 | { 2 | "folders": [ 3 | { 4 | "path": "." 5 | } 6 | ], 7 | "settings": { 8 | "window.title": "CTD Helper", 9 | "files.associations": { 10 | "algorithm": "cpp", 11 | "array": "cpp", 12 | "atomic": "cpp", 13 | "bit": "cpp", 14 | "cctype": "cpp", 15 | "charconv": "cpp", 16 | "chrono": "cpp", 17 | "clocale": "cpp", 18 | "cmath": "cpp", 19 | "compare": "cpp", 20 | "concepts": "cpp", 21 | "condition_variable": "cpp", 22 | "cstddef": "cpp", 23 | "cstdint": "cpp", 24 | "cstdio": "cpp", 25 | "cstdlib": "cpp", 26 | "cstring": "cpp", 27 | "ctime": "cpp", 28 | "cwchar": "cpp", 29 | "deque": "cpp", 30 | "exception": "cpp", 31 | "filesystem": "cpp", 32 | "format": "cpp", 33 | "forward_list": "cpp", 34 | "fstream": "cpp", 35 | "functional": "cpp", 36 | "initializer_list": "cpp", 37 | "iomanip": "cpp", 38 | "ios": "cpp", 39 | "iosfwd": "cpp", 40 | "iostream": "cpp", 41 | "istream": "cpp", 42 | "iterator": "cpp", 43 | "limits": "cpp", 44 | "list": "cpp", 45 | "locale": "cpp", 46 | "map": "cpp", 47 | "memory": "cpp", 48 | "mutex": "cpp", 49 | "new": "cpp", 50 | "numeric": "cpp", 51 | "optional": "cpp", 52 | "ostream": "cpp", 53 | "ratio": "cpp", 54 | "regex": "cpp", 55 | "set": "cpp", 56 | "shared_mutex": "cpp", 57 | "sstream": "cpp", 58 | "stack": "cpp", 59 | "stdexcept": "cpp", 60 | "stop_token": "cpp", 61 | "streambuf": "cpp", 62 | "string": "cpp", 63 | "system_error": "cpp", 64 | "thread": "cpp", 65 | "tuple": "cpp", 66 | "type_traits": "cpp", 67 | "typeinfo": "cpp", 68 | "unordered_map": "cpp", 69 | "unordered_set": "cpp", 70 | "utility": "cpp", 71 | "variant": "cpp", 72 | "vector": "cpp", 73 | "xfacet": "cpp", 74 | "xhash": "cpp", 75 | "xiosbase": "cpp", 76 | "xlocale": "cpp", 77 | "xlocbuf": "cpp", 78 | "xlocinfo": "cpp", 79 | "xlocmes": "cpp", 80 | "xlocmon": "cpp", 81 | "xlocnum": "cpp", 82 | "xloctime": "cpp", 83 | "xmemory": "cpp", 84 | "xstddef": "cpp", 85 | "xstring": "cpp", 86 | "xtr1common": "cpp", 87 | "xtree": "cpp", 88 | "xutility": "cpp" 89 | }, 90 | "editor.tabSize": 2, 91 | "redscript.scriptCachePath": "C:\\Users\\Jack\\Documents\\cyberpunk\\ctd_helper\\prereqs.redscripts", 92 | "cmake.generator": "Ninja" 93 | } 94 | } -------------------------------------------------------------------------------- /license.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright 2021 Jack Humbert 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Crash-To-Desktop Helper 2 | 3 | [![](https://byob.yarr.is/jackhumbert/ctd_helper/cp_version)](https://github.com/jackhumbert/ctd_helper/actions/workflows/build.yaml) 4 | 5 | This will output a useful log to `red4ext/logs/ctd_helper.log` upon a crash in Cyberpunk 2077. 6 | 7 | # Installation 8 | 9 | This requires RED4ext - install the single .dll to `red4ext/plugins/ctd_helper/ctd_helper.dll`. 10 | 11 | # How to read the logs 12 | 13 | Tabs illustrate the call hierarchy. `>` is the most recent call, and the numbers now count down to the latest (crash happens during `DebugBreak`): 14 | 15 | ```Log 16 | Thread hash: 7869061899589541243 17 | Func: OnGameAttach() 18 | Class: FlightComponent 19 | 7 Func: GetVehicle() 20 | Class: FlightComponent 21 | 6 Func: GetEntity() 22 | Class: entIComponent 23 | 5 Func: GetGame() 24 | Class: gameObject 25 | 4 Func: GetFloat() 26 | Class: FlightSettings 27 | 3 Func: GetFloat() 28 | Class: FlightSettings 29 | 2 Func: FlightModeHoverFly::Create(FlightComponent) 30 | Func: Initialize(FlightComponent) 31 | Class: FlightModeHoverFly 32 | 1 Func: Initialize(FlightComponent) 33 | Class: FlightMode 34 | > Func: DebugBreak() 35 | Class: FlightSettings 36 | ``` 37 | 38 | Source files & (appx) line numbers are also shown for CDPR classes (modded classes won't show this yet): 39 | 40 | ```Log 41 | Thread hash: 9473072060749266088 LAST EXECUTED 42 | Func: OnRequestComponents() 43 | Class: sampleBullet 44 | 7 Func: OnRequestComponents() 45 | Class: BaseProjectile 46 | Source: samples\sampleBullet.ws:15 47 | 6 Func: RequestComponent() 48 | Class: entEntityRequestComponentsInterface 49 | Source: cyberpunk\projectiles\baseProjectile.script:35 50 | 5 Func: RequestComponent() 51 | Class: entEntityRequestComponentsInterface 52 | Source: cyberpunk\projectiles\baseProjectile.script:35 53 | 4 Func: RequestComponent() 54 | Class: entEntityRequestComponentsInterface 55 | Source: samples\sampleBullet.ws:15 56 | 3 Func: OnRequestComponents() 57 | Class: BaseProjectile 58 | Source: samples\sampleBullet.ws:15 59 | 2 Func: RequestComponent() 60 | Class: entEntityRequestComponentsInterface 61 | Source: cyberpunk\projectiles\baseProjectile.script:35 62 | 1 Func: RequestComponent() 63 | Class: entEntityRequestComponentsInterface 64 | Source: cyberpunk\projectiles\baseProjectile.script:35 65 | > Func: RequestComponent() 66 | Class: entEntityRequestComponentsInterface 67 | Source: samples\sampleBullet.ws:15 68 | ``` 69 | 70 | `LAST EXECUTED` is added to the last executed thread as well, but this doesn't always mean this is where the crash occurred. 71 | -------------------------------------------------------------------------------- /requirements.md: -------------------------------------------------------------------------------- 1 | ## Requirements 2 | * RED4ext 1.13.1+ 3 | -------------------------------------------------------------------------------- /src/red4ext/.clang-format: -------------------------------------------------------------------------------- 1 | --- 2 | # We'll use defaults from the LLVM style, but with 4 columns indentation. 3 | BasedOnStyle: LLVM 4 | IndentWidth: 2 5 | ColumnLimit: 120 -------------------------------------------------------------------------------- /src/red4ext/Addresses.hpp: -------------------------------------------------------------------------------- 1 | // This file has been generated by zoltan (https://github.com/jac3km4/zoltan) 2 | 3 | #define ZOLTAN_STRINGISE(N) #N 4 | #define ZOLTAN_EXPAND_THEN_STRINGISE(N) ZOLTAN_STRINGISE(N) 5 | #define __LINE_STR__ ZOLTAN_EXPAND_THEN_STRINGISE(__LINE__) 6 | 7 | #ifndef AssertionFailed_Addr 8 | #define AssertionFailed_Addr 0x28ECF74 9 | #endif 10 | #ifndef Breakpoint_Addr 11 | #define Breakpoint_Addr 0x1FD510C 12 | #endif 13 | #ifndef CrashFunc_Addr 14 | #define CrashFunc_Addr 0x28EE3F0 15 | #endif 16 | #ifndef InvokeStatic_Addr 17 | #define InvokeStatic_Addr 0x14B838 18 | #endif 19 | #ifndef InvokeVirtual_Addr 20 | #define InvokeVirtual_Addr 0x207F6C 21 | #endif 22 | #ifndef Murmur3_32_Addr 23 | #define Murmur3_32_Addr 0x77FA14 24 | #endif 25 | #ifndef ScriptHost_Get_Addr 26 | #define ScriptHost_Get_Addr 0x710BA0 27 | #endif 28 | #ifndef ScriptHost_VFT_Addr 29 | #define ScriptHost_VFT_Addr 0x2A21CF8 30 | #endif 31 | #ifndef ScriptInterface_VFT_Addr 32 | #define ScriptInterface_VFT_Addr 0x2A21CE8 33 | #endif 34 | #ifndef ShowMessageBox_Addr 35 | #define ShowMessageBox_Addr 0x2187C9C 36 | #endif 37 | -------------------------------------------------------------------------------- /src/red4ext/Dialog.rc.unused: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | CTD_HELPER_DIALOG DIALOGEX 0, 0, 213, 62 4 | STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU 5 | CAPTION "CTD Helper" 6 | LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL 7 | FONT 9, "Segoe UI" 8 | { 9 | CONTROL "&Open report in web browser", 1, CTD_HELPER_OPEN, BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 55, 37, 101, 11 10 | CONTROL "Cyberpunk 2077 has crashed. CTD Helper will now create a report with details about the crash.", 0, STATIC, SS_CENTER | WS_CHILD | WS_VISIBLE | WS_GROUP, 17, 14, 180, 21 11 | } -------------------------------------------------------------------------------- /src/red4ext/IO/FileStream.cpp: -------------------------------------------------------------------------------- 1 | #include "stdafx.hpp" 2 | #include "FileStream.hpp" 3 | #include "Utils.hpp" 4 | 5 | FileStream::FileStream(const std::filesystem::path& aPath, uint32_t aDesiredAccess, uint32_t aShareMode, 6 | uint32_t aCreationDisposition, uint32_t aFlagsAndAttributes) 7 | : BaseStream(0xA) 8 | , m_path(aPath) 9 | { 10 | m_file = CreateFile(aPath.c_str(), aDesiredAccess, aShareMode, nullptr, aCreationDisposition, aFlagsAndAttributes, 11 | nullptr); 12 | } 13 | 14 | FileStream::~FileStream() 15 | { 16 | if (m_file != INVALID_HANDLE_VALUE) 17 | { 18 | CloseHandle(m_file); 19 | } 20 | } 21 | 22 | bool FileStream::IsOpen() const 23 | { 24 | return m_file != INVALID_HANDLE_VALUE; 25 | } 26 | 27 | void* FileStream::ReadWrite(void* aBuffer, uint32_t aLength) 28 | { 29 | DWORD numberOfBytesRead; 30 | if (!ReadFile(m_file, aBuffer, aLength, &numberOfBytesRead, nullptr)) 31 | { 32 | auto fileName = m_path.stem(); 33 | spdlog::warn(L"[{}] read error: requested_bytes={}, read={}, errno={:#x}", fileName.c_str(), aLength, 34 | numberOfBytesRead, GetLastError()); 35 | 36 | return nullptr; 37 | } 38 | 39 | return aBuffer; 40 | } 41 | 42 | size_t FileStream::GetPointerPosition() 43 | { 44 | LARGE_INTEGER filePointer{}; 45 | if (!SetFilePointerEx(m_file, {0}, &filePointer, FILE_CURRENT)) 46 | { 47 | filePointer.QuadPart = -1; 48 | } 49 | 50 | return filePointer.QuadPart; 51 | } 52 | 53 | size_t FileStream::GetLength() 54 | { 55 | LARGE_INTEGER result{}; 56 | if (IsOpen() && GetFileSizeEx(m_file, &result)) 57 | { 58 | return result.QuadPart; 59 | } 60 | else 61 | { 62 | result.QuadPart = 0; 63 | } 64 | 65 | return result.QuadPart; 66 | } 67 | 68 | bool FileStream::Seek(size_t aDistance) 69 | { 70 | return Seek(aDistance, FILE_CURRENT); 71 | } 72 | 73 | bool FileStream::Seek(size_t aDistance, uint32_t aMoveMethod) 74 | { 75 | LARGE_INTEGER distance; 76 | distance.QuadPart = aDistance; 77 | 78 | if (!SetFilePointerEx(m_file, distance, nullptr, aMoveMethod)) 79 | { 80 | auto fileName = m_path.stem(); 81 | auto length = GetLength(); 82 | 83 | spdlog::warn(L"[{}] seek error: distance={}, method={}, file size={}, errno={:#x}", fileName.c_str(), aDistance, 84 | aMoveMethod, length, GetLastError()); 85 | 86 | return false; 87 | } 88 | 89 | return true; 90 | } 91 | 92 | bool FileStream::Flush() 93 | { 94 | return true; 95 | } 96 | 97 | std::filesystem::path FileStream::GetPath() const 98 | { 99 | return m_path; 100 | } 101 | -------------------------------------------------------------------------------- /src/red4ext/IO/FileStream.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | class FileStream : public RED4ext::BaseStream 4 | { 5 | public: 6 | FileStream(const std::filesystem::path& aPath, uint32_t aDesiredAccess, uint32_t aShareMode, 7 | uint32_t aCreationDisposition, uint32_t aFlagsAndAttributes); 8 | ~FileStream(); 9 | 10 | bool IsOpen() const; 11 | 12 | virtual void* ReadWrite(void* aBuffer, uint32_t aLength) override; 13 | virtual size_t GetPointerPosition() override; 14 | virtual size_t GetLength() override; 15 | 16 | virtual bool Seek(size_t aDistance) override; 17 | bool Seek(size_t aDistance, uint32_t aMoveMethod); 18 | 19 | virtual bool Flush() override; 20 | std::filesystem::path GetPath() const; 21 | 22 | private: 23 | HANDLE m_file; 24 | std::filesystem::path m_path; 25 | }; 26 | -------------------------------------------------------------------------------- /src/red4ext/Instr.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | namespace RED4ext::Instr { 6 | 7 | #pragma pack(push, 1) 8 | struct Invoke { 9 | uint16_t exitLabel; 10 | uint16_t lineNumber; 11 | }; 12 | 13 | struct InvokeStatic : Invoke 14 | { 15 | RED4ext::CScriptedFunction * func; 16 | uint16_t paramFlags; 17 | }; 18 | 19 | struct InvokeVirtual : Invoke 20 | { 21 | RED4ext::CName funcName; 22 | uint16_t paramFlags; 23 | }; 24 | #pragma pack(pop, 1) 25 | 26 | } -------------------------------------------------------------------------------- /src/red4ext/Main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include "RED4ext/CNamePool.hpp" 15 | #include "RED4ext/ISerializable.hpp" 16 | #include "RED4ext/InstanceType.hpp" 17 | #include "RED4ext/RTTISystem.hpp" 18 | #include "Utils.hpp" 19 | #include "ScriptHost.hpp" 20 | #include "Addresses.hpp" 21 | #include 22 | #include "Template.hpp" 23 | #include "Instr.hpp" 24 | #include 25 | #include 26 | 27 | #define MAX_CALLS 10 28 | 29 | // HWND hWnd; 30 | RED4ext::PluginHandle pluginHandle; 31 | bool ctd_helper_enabled = true; 32 | 33 | void ctd_helper_callback(RED4ext::CName categoryName, RED4ext::CName propertyName, ModSettings::ModVariableType value) { 34 | if (propertyName == "enabled") { 35 | ctd_helper_enabled = value.b; 36 | } 37 | } 38 | 39 | struct BaseFunction { 40 | uint8_t raw[sizeof(RED4ext::CScriptedFunction)]; 41 | }; 42 | 43 | enum class CallType { 44 | Unknown, 45 | Static, 46 | Method 47 | }; 48 | 49 | struct FuncCall { 50 | ~FuncCall() = default; 51 | 52 | BaseFunction func; 53 | RED4ext::CClass* type; 54 | std::vector children; 55 | FuncCall* parent; 56 | RED4ext::CClass* contextType; 57 | RED4ext::IScriptable* context; 58 | RED4ext::CString contextString; 59 | uint32_t line; 60 | CallType callType = CallType::Unknown; 61 | 62 | RED4ext::CBaseFunction * get_func() { 63 | return reinterpret_cast(&this->func); 64 | } 65 | 66 | std::string GetFuncName() { 67 | std::string fullName(this->get_func()->fullName.ToString()); 68 | if (fullName.find(";") != -1) { 69 | fullName.replace(fullName.find(";"), 1, "#"); 70 | if (fullName.find(";") != -1) { 71 | fullName.replace(fullName.find(";"), 1, ") -> "); 72 | fullName.replace(fullName.find("#"), 1, "("); 73 | } else { 74 | fullName.replace(fullName.find("#"), 1, "("); 75 | fullName.append(")"); 76 | } 77 | } else { 78 | // fullName.append("() -> Void"); 79 | } 80 | 81 | return fullName; 82 | } 83 | }; 84 | 85 | struct CallPair { 86 | ~CallPair() = default; 87 | 88 | FuncCall self; 89 | FuncCall parent; 90 | bool isStatic = false; 91 | RED4ext::WeakHandle context; 92 | bool cameBack = false; 93 | uint16_t line; 94 | }; 95 | 96 | std::mutex queueLock; 97 | // std::map> callQueues; 98 | std::map> funcCallQueues; 99 | std::string lastThread; 100 | ScriptBundle * bundle; 101 | bool bundle_loaded = false; 102 | 103 | bool scriptLinkingError = false; 104 | 105 | wchar_t errorMessage[1000] = 106 | L"There was an error validating redscript types with their native counterparts. Reference the mod that uses the " 107 | L"type(s) in the game's message below:\n"; 108 | const wchar_t *errorMessageEnd = L"\nYou can press Ctrl+C to copy this message, but it has also been written to the " 109 | L"log at red4ext/logs/ctd_helper.log"; 110 | const wchar_t *errorCaption = L"Script Type Validation Error"; 111 | 112 | 113 | // 1.6 RVA: 0xA885B0 114 | // 1.61 RVA: 0xA88980 115 | // 1.61hf RVA: 0xA88F20 116 | /// @pattern 40 55 48 83 EC 40 80 39 00 48 8B EA 0F 84 C5 00 00 00 48 89 7C 24 60 48 8B 79 18 44 8B 47 0C 44 117 | // void __fastcall DebugPrint(uintptr_t, RED4ext::CString *); 118 | 119 | // REGISTER_HOOK(void __fastcall, DebugPrint, uintptr_t a1, RED4ext::CString *a2) { 120 | // spdlog::error(a2->c_str()); 121 | // const size_t strSize = strlen(a2->c_str()) + 1; 122 | // wchar_t *wc = new wchar_t[strSize]; 123 | 124 | // mbstowcs(wc, a2->c_str(), strSize); 125 | // swprintf(errorMessage, 1000, L"%s\n%s", errorMessage, wc); 126 | // scriptLinkingError = true; 127 | // DebugPrint_Original(a1, a2); 128 | // } 129 | 130 | // 1.52 RVA: 0xA66B50 / 10906448 131 | // 1.6 RVA: 0xA704D0 132 | // 1.61 RVA: 0xA708A0 133 | // 1.61hf1 RVA: 0xA70DE0 134 | // 1.63 0xA81100 135 | /// @pattern 48 8B C4 48 89 58 08 48 89 70 10 48 89 78 18 55 48 8D 68 A1 48 81 EC E0 00 00 00 0F B6 D9 40 8A 136 | uintptr_t __fastcall ShowMessageBox(char, char); 137 | 138 | REGISTER_HOOK(uintptr_t __fastcall, ShowMessageBox, char a1, char a2) { 139 | if (scriptLinkingError) { 140 | swprintf(errorMessage, 1000, L"%s\n%s", errorMessage, errorMessageEnd); 141 | MessageBoxW(0, errorMessage, errorCaption, MB_SYSTEMMODAL | MB_ICONERROR); 142 | return 1; 143 | } else { 144 | return ShowMessageBox_Original(a1, a2); 145 | } 146 | } 147 | 148 | /// @pattern 48 8B 02 48 83 C0 13 48 89 02 44 0F B6 10 48 FF C0 48 89 02 41 8B C2 4C 8D 15 ? ? ? ? 49 FF 149 | void __fastcall Breakpoint(RED4ext::IScriptable *context, RED4ext::CStackFrame *stackFrame, uintptr_t a3, uintptr_t a4); 150 | 151 | REGISTER_HOOK(void __fastcall, Breakpoint, RED4ext::IScriptable *context, RED4ext::CStackFrame *stackFrame, uintptr_t a3, uintptr_t a4) { 152 | spdlog::info("Redscript breakpoint encountered"); 153 | __debugbreak(); 154 | Breakpoint_Original(context, stackFrame, a3, a4); 155 | } 156 | 157 | // #define CTD_HELPER_PROFILING 158 | int numberOfProcessors = 4; 159 | 160 | // could keep track of stackFrame per thread & compare the stackFrame->code vs the stackFrame->func->byteCode positions 161 | // and figure out exactly where code execution stopped/crashed 162 | 163 | void LogFunctionCall(RED4ext::IScriptable *context, RED4ext::CStackFrame *stackFrame, RED4ext::CBaseFunction *func, bool isStatic) { 164 | 165 | wchar_t * thread_name; 166 | HRESULT hr = GetThreadDescription(GetCurrentThread(), &thread_name); 167 | std::wstring ws(thread_name); 168 | auto thread = std::string(ws.begin(), ws.end()); 169 | 170 | #ifdef CTD_HELPER_PROFILING 171 | RED4ext::CNamePool::Add(thread.c_str()); 172 | auto profiler = CyberpunkMod::Profiler(thread.c_str(), 5); 173 | #endif 174 | 175 | if (!bundle_loaded) { 176 | auto bundlePath = Utils::GetRootDir() / "r6" / "cache" / "final.redscripts"; 177 | auto bundleLocation = bundlePath.string(); 178 | // auto engine = RED4ext::CGameEngine::Get(); 179 | // auto bundleLocation = engine->scriptsBlobPath; 180 | spdlog::info("Loading scripts blob: {}", bundleLocation.c_str()); 181 | bundle = bundle_load(bundleLocation.c_str()); 182 | bundle_loaded = true; 183 | } 184 | 185 | auto invoke = reinterpret_cast(stackFrame->code); 186 | auto call = CallPair(); 187 | call.isStatic = isStatic; 188 | call.line = invoke->lineNumber; 189 | call.self.func = *reinterpret_cast(func); 190 | call.self.type = func->GetParent(); 191 | if (stackFrame->func) { 192 | call.parent.func = *reinterpret_cast(stackFrame->func); 193 | call.parent.type = stackFrame->func->GetParent(); 194 | } 195 | if (context && context->ref.instance == context) { 196 | call.self.contextType = call.parent.contextType = context->GetType(); 197 | // call.context.instance = context; 198 | // call.context.refCount = context->ref.refCount; 199 | // if (call.self.contextType) { 200 | // call.self.contextType->ToString(context, call.self.contextString); 201 | // call.parent.contextString = call.self.contextString; 202 | // } 203 | }; 204 | 205 | { 206 | std::lock_guard lock(queueLock); 207 | lastThread = thread; 208 | } 209 | auto& queue = funcCallQueues[thread]; 210 | queue.emplace(call); 211 | while (queue.size() > MAX_CALLS) { 212 | queue.pop(); 213 | } 214 | 215 | #ifdef CTD_HELPER_PROFILING 216 | auto avg = profiler.End(); 217 | if (avg != 0) { 218 | spdlog::info("1s of execution in {:<15}: {:7}us", profiler.m_tracker.ToString(), avg); 219 | } 220 | #endif 221 | } 222 | 223 | // 48 83 EC 40 48 8B 02 4C 8B F2 44 0F B7 7A 60 224 | // 1.52 RVA: 0x27A410 / 2597904 225 | // 1.6 RVA: 0x27E1E0 / 2613728 226 | // 1.61 RVA: 0x27E790 227 | // 1.61hf RVA: 0x27E810 228 | /// @pattern 4C 89 4C 24 20 4C 89 44 24 18 55 53 56 57 41 54 41 55 41 56 41 57 48 81 EC D8 01 00 00 48 8D 6C 229 | void __fastcall InvokeStatic(RED4ext::IScriptable *, RED4ext::CStackFrame *stackFrame, uintptr_t, uintptr_t); 230 | 231 | REGISTER_HOOK(void __fastcall, InvokeStatic, RED4ext::IScriptable *context, RED4ext::CStackFrame *stackFrame, uintptr_t a3, uintptr_t a4) { 232 | if (ctd_helper_enabled) { 233 | auto invokeStatic = reinterpret_cast(stackFrame->code); 234 | 235 | if (invokeStatic->func) { 236 | LogFunctionCall(context, stackFrame, invokeStatic->func, true); 237 | } 238 | } 239 | 240 | InvokeStatic_Original(context, stackFrame, a3, a4); 241 | } 242 | 243 | /// @pattern 48 89 5C 24 08 48 89 6C 24 10 48 89 74 24 18 57 41 54 41 55 41 56 41 57 48 83 EC 40 48 8B 02 4D 244 | void __fastcall InvokeVirtual(RED4ext::IScriptable *, RED4ext::CStackFrame *stackFrame, uintptr_t a3, uintptr_t a4); 245 | 246 | REGISTER_HOOK(void __fastcall, InvokeVirtual, RED4ext::IScriptable *context, RED4ext::CStackFrame *stackFrame, uintptr_t a3, uintptr_t a4) { 247 | if (ctd_helper_enabled) { 248 | auto invokeVirtual = reinterpret_cast(stackFrame->code); 249 | auto cls = context->nativeType; 250 | if (!cls) 251 | cls = context->GetNativeType(); 252 | auto func = cls->GetFunction(invokeVirtual->funcName); 253 | 254 | if (func) { 255 | LogFunctionCall(context, stackFrame, func, false); 256 | } 257 | } 258 | 259 | InvokeVirtual_Original(context, stackFrame, a3, a4); 260 | } 261 | 262 | std::unordered_map> files; 263 | 264 | void encode_html(std::string& data) { 265 | std::string buffer; 266 | buffer.reserve(data.size()); 267 | for(size_t pos = 0; pos != data.size(); ++pos) { 268 | switch(data[pos]) { 269 | case '&': buffer.append("&"); break; 270 | case '\"': buffer.append("""); break; 271 | case '\'': buffer.append("'"); break; 272 | case '<': buffer.append("<"); break; 273 | case '>': buffer.append(">"); break; 274 | default: buffer.append(&data[pos], 1); break; 275 | } 276 | } 277 | data.swap(buffer); 278 | } 279 | 280 | #define LINES_BEFORE_TO_PRINT 2 281 | #define LINES_AFTER_TO_PRINT 5 282 | 283 | 284 | void PrintCall(std::ofstream& htmlLog, FuncCall& call); 285 | 286 | void print_redscript_source(std::ofstream& htmlLog, FuncCall& call) { 287 | if (!call.get_func()->flags.isNative) { 288 | // if (call.callType != CallType::Unknown) { 289 | Decompilation * decomp = nullptr; 290 | // if (call.callType == CallType::Static) { 291 | // decomp = decompile_global(bundle, call.get_func()->fullName.ToString()); 292 | auto funcName = call.get_func()->fullName.ToString(); 293 | if (call.type) { 294 | decomp = decompile_method(bundle, call.type->GetName().ToString(), funcName); 295 | } else { 296 | decomp = decompile_global(bundle, funcName); 297 | } 298 | if (!decomp) { 299 | std::string funcNameStr(funcName); 300 | if (funcNameStr.find("::") != std::string::npos) { 301 | auto staticCallName = funcNameStr.substr(0, funcNameStr.find("::")); 302 | auto staticFuncName = funcNameStr.substr(funcNameStr.find("::") + 2); 303 | decomp = decompile_method(bundle, staticCallName.c_str(), staticFuncName.c_str()); 304 | } 305 | } 306 | if (decomp) { 307 | auto lineNumbers = decompilation_line_mapping(decomp); 308 | auto numLines = decompilation_line_count(decomp); 309 | auto html_id = std::string(funcName); 310 | while (html_id.find(";") != std::string::npos) { 311 | html_id.replace(html_id.find(";"), 1, "_"); 312 | } 313 | htmlLog << fmt::format("
", html_id) << std::endl; 314 | // htmlLog << fmt::format("
");
315 |       std::string code = decompilation_code(decomp);
316 |       encode_html(code);
317 | 
318 |       std::stringstream ss(code);
319 |       std::string to;
320 | 
321 |       uint32_t lineIndex = 0;
322 |       std::vector usedLines;
323 |       while (std::getline(ss, to, '\n')) {
324 |         if (lineIndex != 0) {
325 |           bool found = false;
326 |           bool last = call.children.size() && *lineNumbers == call.children[call.children.size() - 1].line;
327 |           FuncCall * foundChild = nullptr;
328 |           for (auto &child : call.children) {
329 |               if (*lineNumbers == child.line) {
330 |                 found = true;
331 |                 foundChild = &child;
332 |                 break;
333 |               }
334 |           }
335 |           std::string lineNumber;
336 |           auto firstInstanceOfLineNumber = false;
337 |           if (std::find(usedLines.begin(), usedLines.end(), *lineNumbers) != usedLines.end()) {
338 |             lineNumber = fmt::format("{:>5}", "");
339 |           } else {
340 |             lineNumber = fmt::format("{:>5}", *lineNumbers);
341 |             usedLines.push_back(*lineNumbers);
342 |             firstInstanceOfLineNumber = true;
343 |           }
344 |           htmlLog << fmt::format("{} {} {}
", last ? " class='last-line'" : "", lineNumber, found ? (last ? ">" : "*") : "|", to) << std::endl; 345 | if (found && !foundChild->get_func()->flags.isNative && firstInstanceOfLineNumber) { 346 | PrintCall(htmlLog, *foundChild); 347 | } 348 | } 349 | lineNumbers++; 350 | lineIndex++; 351 | } 352 | 353 | // htmlLog << code; 354 | // htmlLog << fmt::format("") << std::endl; 355 | htmlLog << fmt::format("
") << std::endl; 356 | decompilation_free(decomp); 357 | } else { 358 | htmlLog << "
(No source found)
"; 359 | } 360 | // } 361 | } 362 | } 363 | 364 | // void print_source(std::ofstream& htmlLog, uint32_t file_idx, uint32_t line_idx) { 365 | void print_source(std::ofstream& htmlLog, uint32_t file_idx, uint32_t line_idx, std::string func) { 366 | auto scriptFile = *ScriptHost::Get()->interface.files.Get(file_idx); 367 | if (scriptFile) { 368 | auto path = std::filesystem::path(scriptFile->filename.c_str()); 369 | auto is_red = false; 370 | if(path.is_relative()) { 371 | path = Utils::GetRootDir() / "tools" / "redmod" / "scripts" / path; 372 | is_red = true; 373 | } 374 | auto rel_path = std::filesystem::relative(path, Utils::GetRootDir()); 375 | htmlLog << "
" << std::endl; 376 | if (std::filesystem::exists(path)) { 377 | if (!files.contains(path)) { 378 | std::ifstream file(path); 379 | std::string line; 380 | while (std::getline(file, line)) { 381 | files[path].emplace_back(line); 382 | } 383 | file.close(); 384 | } 385 | if (is_red) { 386 | for (int idx = 0; idx < files[path].size(); ++idx) { 387 | if (files[path][idx].find(func.c_str()) != std::string::npos) { 388 | line_idx = idx; 389 | break; 390 | } 391 | } 392 | } 393 | auto line_index = line_idx; 394 | htmlLog << fmt::format("

{}:{}

", path.string().c_str(), rel_path.string().c_str(), line_idx) << std::endl; 395 | if (files[path].size() > line_index) { 396 | htmlLog << fmt::format("
", line_idx - LINES_BEFORE_TO_PRINT);
397 |         for (int i = -LINES_BEFORE_TO_PRINT; i <= LINES_AFTER_TO_PRINT; i++) {
398 |           if (files[path].size() > (line_index + i)) {
399 |             auto code = files[path][line_index + i];
400 |             encode_html(code);
401 |             htmlLog << code << std::endl;
402 |           }
403 |         }
404 |         htmlLog << fmt::format("
") << std::endl; 405 | } else { 406 | spdlog::warn("Line number exceded file: {}:{}", path.string().c_str(), line_idx + 1); 407 | } 408 | } else { 409 | htmlLog << fmt::format("

{}:{}

", path.string().c_str(), rel_path.string().c_str(), line_idx) << std::endl; 410 | spdlog::warn("Could not locate file: {}", path.string().c_str()); 411 | } 412 | htmlLog << "
" << std::endl; 413 | } 414 | } 415 | 416 | FuncCall * FindFunc(std::vector& map, RED4ext::CName key) { 417 | if (auto it = find_if(map.begin(), map.end(), [&key](FuncCall& obj) { 418 | return obj.get_func()->fullName == key; 419 | }); it != map.end()) { 420 | return it._Ptr; 421 | } else { 422 | for (auto& value : map) { 423 | if (auto func = FindFunc(value.children, key); func != nullptr) { 424 | return func; 425 | } 426 | } 427 | return nullptr; 428 | } 429 | } 430 | 431 | void PrintCall(std::ofstream& htmlLog, FuncCall& call) { 432 | auto rtti = RED4ext::CRTTISystem::Get(); 433 | htmlLog << "
" << std::endl; 434 | auto func = call.get_func(); 435 | if (call.contextString.Length()) { 436 | htmlLog << "
\n"; 437 | } 438 | htmlLog << fmt::format("", call.get_func()->fullName.ToString()); 439 | if (call.callType == CallType::Static) { 440 | htmlLog << "static "; 441 | } 442 | // if (func->flags.isNative) { 443 | // htmlLog << "native "; 444 | // } 445 | if (call.type) { 446 | htmlLog << fmt::format("{}::", rtti->ConvertNativeToScriptName(call.type->GetName()).ToString()); 447 | } 448 | htmlLog << fmt::format("{}", call.GetFuncName()); 449 | // if (func) { 450 | // htmlLog << func->GetType() 451 | // } 452 | uint32_t line; 453 | if (call.line) { 454 | line = call.line; 455 | } else { 456 | line = call.get_func()->bytecode.unk04; 457 | } 458 | // htmlLog << fmt::format(" {}", line); 459 | htmlLog << "" << std::endl; 460 | if (call.contextString.Length()) { 461 | htmlLog << "" << std::endl; 462 | htmlLog << fmt::format("
{}
", call.contextString.c_str()) << std::endl; 463 | htmlLog << "
" << std::endl; 464 | } 465 | // if (call.get_func()->bytecode.fileIndex != 0 || line != 0) { 466 | print_redscript_source(htmlLog, call); 467 | // print_source(htmlLog, call.get_func()->bytecode.fileIndex, line, call.GetFuncName()); 468 | // } 469 | // for (auto& child : call.children) { 470 | // PrintCall(htmlLog, child); 471 | // } 472 | 473 | auto scriptFile = *ScriptHost::Get()->interface.files.Get(call.get_func()->bytecode.fileIndex); 474 | if (scriptFile) { 475 | auto path = std::filesystem::path(scriptFile->filename.c_str()); 476 | htmlLog << fmt::format("{}", path.string().c_str()); 477 | } 478 | 479 | htmlLog << "
" << std::endl; 480 | } 481 | 482 | std::wstring currentLogFile; 483 | 484 | // static INT_PTR CALLBACK dlg_proc(HWND dlg, UINT msg, WPARAM wp, LPARAM lp) { 485 | // switch(msg) { 486 | // case WM_COMMAND: 487 | // switch(LOWORD(wp)) 488 | // { 489 | // case CTD_HELPER_OPEN: 490 | // ShellExecute(0, 0, currentLogFile.c_str(), 0, 0 , SW_SHOW ); 491 | // break; 492 | // } 493 | // break; 494 | // case WM_CLOSE: 495 | // PostQuitMessage(0); 496 | // break; 497 | // default: 498 | // return FALSE; 499 | // } 500 | // return TRUE; 501 | // } 502 | 503 | // 1.6 RVA: 0x2FFC6F0 / 50317040 504 | /// @pattern 40 53 48 83 EC 40 48 83 3D ? ? ? 01 00 48 8B D9 75 62 48 83 3D ? ? ? 01 00 75 58 33 C0 48 505 | // void __fastcall SetHWND(HWND hWnd); 506 | // 507 | // REGISTER_HOOK(void __fastcall, SetHWND, HWND aHwnd) { 508 | // hWnd = aHwnd; 509 | // SetHWND_Original(aHwnd); 510 | // } 511 | 512 | void print_log(std::ofstream& stream, std::string name, std::filesystem::path path) { 513 | if (std::filesystem::exists(path)) { 514 | std::ifstream log_file(path); 515 | std::stringstream log_buffer; 516 | log_buffer << log_file.rdbuf(); 517 | stream << fmt::format("
{} log\n
{}
", name, log_buffer.str()) << std::endl; 518 | } 519 | } 520 | 521 | // struct ErrorReporter 522 | // { 523 | // uint64_t unk00[9]; 524 | // HANDLE handle; 525 | // uint32_t unk50; 526 | // uint8_t success; 527 | // }; 528 | 529 | // 1.6 RVA: 0x2BCF150 / 45936976 530 | /// @pattern 0F B6 05 ? ? ? 02 C3 531 | /// @nth 6/12 532 | // bool __fastcall IsDebug(); 533 | 534 | // /// @pattern 40 53 48 81 EC 30 02 00 00 80 3D ? ? ? 02 00 48 8B D9 0F 85 B2 00 00 00 41 B8 04 01 00 00 48 535 | // bool __fastcall LaunchErrorReporter(ErrorReporter* errorReporter); 536 | 537 | // REGISTER_HOOK(bool __fastcall, LaunchErrorReporter, ErrorReporter* errorReporter) { 538 | // auto result = LaunchErrorReporter_Original(errorReporter); 539 | // if (result) { 540 | // } 541 | // return result; 542 | // } 543 | 544 | // 48 8D 68 A1 48 81 EC A0 00 00 00 0F B6 F1 545 | // 1.6 RVA: 0x2B93EF0 / 45694704 546 | // 1.61 RVA: 0x2B99290 547 | // 1.61hf RVA: 0x2B9BC70 548 | /// @pattern 4C 8B DC 49 89 5B 08 49 89 73 10 57 48 83 EC 20 48 8B 05 E1 C2 02 01 48 8B FA 40 8A F1 48 83 F8 549 | void __fastcall CrashFunc(uint8_t a1, uintptr_t a2); 550 | 551 | REGISTER_HOOK(void __fastcall, CrashFunc, uint8_t a1, uintptr_t a2) { 552 | 553 | time_t now = time(0); 554 | struct tm tstruct; 555 | char log_filename[80]; 556 | char niceTimestamp[80]; 557 | tstruct = *localtime(&now); 558 | strftime(log_filename, sizeof(log_filename), "%Y-%m-%d_%H-%M-%S.html", &tstruct); 559 | strftime(niceTimestamp, sizeof(niceTimestamp), "%Y-%m-%d %H:%M:%S", &tstruct); 560 | 561 | auto ctd_helper_dir = Utils::GetRootDir() / "red4ext" / "logs" / "ctd_helper"; 562 | auto currentLogFilePath = ctd_helper_dir / log_filename; 563 | currentLogFile = currentLogFilePath.wstring(); 564 | 565 | spdlog::error(L"Crash! Check {} for details", currentLogFile); 566 | 567 | std::filesystem::create_directories(ctd_helper_dir); 568 | 569 | std::ofstream htmlLog; 570 | htmlLog.open(currentLogFilePath); 571 | htmlLog << CTD_HELPER_HEADER; 572 | htmlLog << fmt::format("CTD Helper Report for Crash on {}\n", niceTimestamp); 573 | htmlLog << "\n"; 574 | // auto dlg = CreateDialog(pluginHandle, MAKEINTRESOURCE(CTD_HELPER_DIALOG), hWnd, dlg_proc); 575 | // auto dlg = CreateDialog(pluginHandle, MAKEINTRESOURCE(CTD_HELPER_DIALOG), GetConsoleWindow() , dlg_proc); 576 | // ShowWindow(dlg, SW_SHOW); 577 | 578 | htmlLog << fmt::format("

CTD Helper Report for Crash on {}

\n", niceTimestamp); 579 | htmlLog << "

Generated by CTD Helper. All code is decompiled redscript from the blob used in the game.

\n"; 580 | 581 | print_log(htmlLog, "RED4ext", Utils::GetRootDir() / "red4ext" / "logs" / "red4ext.log"); 582 | print_log(htmlLog, "Redscript", Utils::GetRootDir() / "r6" / "logs" / "redscript_rCURRENT.log"); 583 | print_log(htmlLog, "Input Loader", Utils::GetRootDir() / "red4ext" / "logs" / "input_loader.log"); 584 | 585 | if (scriptLinkingError) { 586 | std::wstring werror(errorMessage); 587 | std::string error(werror.begin(), werror.end()); 588 | htmlLog << fmt::format("
Script Linking Error\n
{}
", error); 589 | } 590 | 591 | std::map> orgd; 592 | 593 | for (auto &queue : funcCallQueues) { 594 | auto thread = queue.first; 595 | for (auto i = 0; queue.second.size(); i++) { 596 | auto call = queue.second.front(); 597 | // if (call.context.instance && call.context.refCount) { 598 | // call.self.type->ToString(call.context.instance, call.self.contextString); 599 | // call.parent.contextString = call.self.contextString; 600 | // } 601 | call.self.callType = call.isStatic ? CallType::Static : CallType::Method; 602 | call.self.line = call.line; 603 | if (orgd[thread].empty()) { 604 | call.self.callType = call.isStatic ? CallType::Static : CallType::Method; 605 | auto child = call.parent.children.emplace_back(call.self); 606 | auto parent = orgd[thread].emplace_back(call.parent); 607 | child.parent = &parent; 608 | } else { 609 | if (auto func = FindFunc(orgd[thread], call.parent.get_func()->fullName); func != nullptr) { 610 | auto child = func->children.emplace_back(call.self); 611 | child.parent = func; 612 | } else { 613 | auto child = call.parent.children.emplace_back(call.self); 614 | auto parent = orgd[thread].emplace_back(call.parent); 615 | child.parent = &parent; 616 | } 617 | } 618 | queue.second.pop(); 619 | } 620 | } 621 | 622 | for (auto &queue : orgd) { 623 | auto level = 0; 624 | std::queue stack; 625 | auto crashing = lastThread == queue.first; 626 | htmlLog << fmt::format("

{0}{1}

", queue.first, crashing ? " LAST EXECUTED":"") << std::endl; 627 | uint64_t last = 0; 628 | for (auto& call : queue.second) { 629 | PrintCall(htmlLog, call); 630 | } 631 | htmlLog << "
" << std::endl; 632 | } 633 | 634 | htmlLog << R"( 635 | )"; 636 | htmlLog.close(); 637 | 638 | ShellExecute(0, 0, currentLogFile.c_str(), 0, 0 , SW_SHOW ); 639 | 640 | bundle_free(bundle); 641 | 642 | auto latest = ctd_helper_dir / "latest.html"; 643 | std::filesystem::copy_file(currentLogFilePath, latest, std::filesystem::copy_options::overwrite_existing); 644 | spdlog::info("Log copied to {}", latest.string().c_str()); 645 | 646 | CrashFunc_Original(a1, a2); 647 | } 648 | 649 | // 1.6 RVA: 0x2B90C60 / 45681760 650 | // 1.61 RVA: 0x2B96000 651 | // 1.61hf RVA: 0x2B989E0 652 | /// @pattern 4C 89 4C 24 20 53 55 56 57 41 54 41 56 48 83 EC 68 80 3D 04 21 A1 00 00 49 8B F8 8B F2 48 8B E9 653 | __int64 AssertionFailed(const char *, int, const char *, const char *...); 654 | 655 | REGISTER_HOOK(__int64, AssertionFailed, const char* file, int lineNum, const char * condition, const char * message...) { 656 | va_list args; 657 | va_start(args, message); 658 | spdlog::error("File: {} @ Line {}", file, lineNum); 659 | if (condition) { 660 | spdlog::error("Condition: {}", condition); 661 | } 662 | if (message) { 663 | char buffer[0x400]; 664 | sprintf(buffer, message, args); 665 | spdlog::error("Message: {}", buffer); 666 | } 667 | return AssertionFailed_Original(file, lineNum, condition, message, args); 668 | } 669 | 670 | ModSettings::Variable* variable; 671 | 672 | RED4EXT_C_EXPORT bool RED4EXT_CALL Main(RED4ext::PluginHandle aHandle, RED4ext::EMainReason aReason, const RED4ext::Sdk *aSdk) { 673 | switch (aReason) { 674 | case RED4ext::EMainReason::Load: { 675 | pluginHandle = aHandle; 676 | 677 | Utils::CreateLogger(); 678 | spdlog::info("Starting up CTD Helper v{}.{}.{}", MOD_VERSION_MAJOR, MOD_VERSION_MINOR, MOD_VERSION_PATCH); 679 | 680 | auto ptr = GetModuleHandle(nullptr); 681 | spdlog::info("Base address: {}", fmt::ptr(ptr)); 682 | 683 | ModModuleFactory::GetInstance().Load(aSdk, aHandle); 684 | 685 | numberOfProcessors = std::thread::hardware_concurrency(); 686 | 687 | 688 | auto handle = GetModuleHandle(L"mod_settings"); 689 | if (!handle) { 690 | SetDllDirectory((Utils::GetRootDir() / "red4ext" / "plugins" / L"mod_settings").c_str()); 691 | handle = LoadLibrary(L"mod_settings"); 692 | } 693 | if (handle) { 694 | typedef void (WINAPI * add_variable_t)(ModSettings::Variable* variable); 695 | auto addVariable = reinterpret_cast(GetProcAddress(handle, "AddVariable")); 696 | 697 | variable = (ModSettings::Variable *)malloc(sizeof(ModSettings::Variable)); 698 | memset(variable, 0, sizeof(ModSettings::Variable)); 699 | variable->modName = "CTD Helper"; 700 | variable->className = "ctd_helper"; 701 | // variable->categoryName = "General"; 702 | variable->propertyName = "enabled"; 703 | variable->type = "Bool"; 704 | variable->displayName = "Enable Script Function Logging"; 705 | variable->description = "Enable the logging of script calls to aid in diagnosing crashes"; 706 | variable->defaultValue.b = ctd_helper_enabled; 707 | variable->callback = std::make_shared(ctd_helper_callback); 708 | addVariable(variable); 709 | // free(variable); 710 | } 711 | 712 | break; 713 | } 714 | case RED4ext::EMainReason::Unload: { 715 | // Free memory, detach hooks. 716 | // The game's memory is already freed, to not try to do anything with it. 717 | 718 | spdlog::info("Shutting down"); 719 | ModModuleFactory::GetInstance().Unload(aSdk, aHandle); 720 | free(variable); 721 | spdlog::shutdown(); 722 | break; 723 | } 724 | } 725 | 726 | return true; 727 | } 728 | 729 | RED4EXT_C_EXPORT void RED4EXT_CALL Query(RED4ext::PluginInfo *aInfo) { 730 | aInfo->name = L"CTD Helper"; 731 | aInfo->author = L"Jack Humbert"; 732 | aInfo->version = RED4EXT_SEMVER(MOD_VERSION_MAJOR, MOD_VERSION_MINOR, MOD_VERSION_PATCH); 733 | aInfo->runtime = RED4EXT_RUNTIME_LATEST; 734 | aInfo->sdk = RED4EXT_SDK_LATEST; 735 | } 736 | 737 | RED4EXT_C_EXPORT uint32_t RED4EXT_CALL Supports() { return RED4EXT_API_VERSION_LATEST; } 738 | -------------------------------------------------------------------------------- /src/red4ext/ScriptHost.hpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include "Addresses.hpp" 3 | 4 | struct ScriptFile { 5 | // Murmur3 6 | uint32_t hash1; 7 | uint32_t hash2; 8 | RED4ext::CString filename; 9 | RED4ext::DynArray unk28; 10 | RED4ext::DynArray unk38; 11 | uint32_t unk48; 12 | }; 13 | 14 | // CRC32B 15 | enum EScriptAction : uint32_t 16 | { 17 | ScriptProcessInfo = 0x260B1475, 18 | ScriptBreakpointUnbound = 0xD416A296, 19 | ScriptBreakpointConfirmation = 0xF5CECB4B, 20 | ScriptBinaryReload = 0xD3CDA57D, 21 | }; 22 | 23 | struct IScriptAction { 24 | virtual void * sub_00(); 25 | virtual void * sub_08(); 26 | virtual void * sub_10(); 27 | virtual void * sub_18(); 28 | virtual bool IsActionType(EScriptAction type); 29 | 30 | uint32_t id; // 08 31 | uint32_t unk0C; // 0C 32 | }; 33 | 34 | struct ScriptBreakpointConfirmation : IScriptAction { 35 | 36 | }; 37 | 38 | struct ScriptBinaryReloaded : IScriptAction { 39 | 40 | }; 41 | 42 | struct ScriptBreakRequest : IScriptAction 43 | { 44 | RED4ext::CString type; 45 | uint32_t thread; 46 | }; 47 | 48 | 49 | enum EBreakpointState : unsigned __int8 { 50 | Continue = 0x0, 51 | StepOver = 0x1, 52 | StepInto = 0x2, 53 | StepOut = 0x3, 54 | Pause = 0x4, 55 | }; 56 | 57 | // 48 89 5C 24 08 48 89 74 24 10 57 48 83 EC 20 48 8B FA 48 8B DA 48 C1 EF 02 48 8B F1 48 85 FF 75 58 | /// @pattern 48 89 5C 24 08 48 89 74 24 10 57 48 83 EC 20 4C 8B DA 48 8B F2 8B FA 49 C1 EB 02 49 8B D3 48 8B 59 | uint32_t __fastcall Murmur3_32(char *a1, unsigned __int64 length) { 60 | RED4ext::RelocFunc func(Murmur3_32_Addr); 61 | return func(a1, length); 62 | } 63 | 64 | struct ScriptInterface { 65 | /// @pattern 50 6F 6F 6C 48 54 54 50 00 00 00 00 00 00 00 66 | /// @offset -0x10 67 | static constexpr const uintptr_t VFT = ScriptInterface_VFT_Addr; 68 | 69 | virtual ~ScriptInterface() = default; 70 | virtual bool sub_08(IScriptAction ** scriptAction, void* debugger); 71 | 72 | RED4ext::DynArray unk10; 73 | uint32_t unk20; // state? 74 | uint16_t unk24; 75 | uint16_t unk26; 76 | uint64_t unk28; 77 | RED4ext::Map files; 78 | uint32_t breakpointThread; 79 | EBreakpointState breakpointState; 80 | uint8_t unk5D; 81 | uint8_t unk5E; 82 | uint8_t unk5F; 83 | }; 84 | RED4EXT_ASSERT_OFFSET(ScriptInterface, files, 0x28); 85 | 86 | struct ScriptHost { 87 | /// @pattern 50 6F 6F 6C 48 54 54 50 00 00 00 00 00 00 00 88 | /// @offset -0x20 89 | static constexpr const uintptr_t VFT = ScriptHost_VFT_Addr; 90 | 91 | virtual inline void sub_00() {}; // empty 92 | virtual inline void sub_08() {}; // load 93 | virtual inline void sub_10() {}; 94 | virtual inline void sub_18() {}; 95 | virtual inline void sub_20() {}; 96 | 97 | // something with files 98 | virtual inline void sub_28() {}; 99 | 100 | virtual inline void sub_30() {}; // empty 101 | 102 | // if unk20 == 0 103 | virtual inline void sub_38() {}; 104 | 105 | // sets unk24 106 | virtual inline void sub_40() {}; 107 | 108 | // gets unk24, called by StartProfiling 109 | virtual inline void sub_48() {}; 110 | 111 | // something with (), global exec|native functions 112 | virtual inline bool sub_50(RED4ext::CString * a1) { 113 | RED4ext::RelocFunc call(VFT, 0x50); 114 | return call(this, a1); 115 | }; 116 | 117 | // something else with (), scripted functions, exec || event 118 | virtual inline bool sub_58(RED4ext::IScriptable * aContext, RED4ext::CString * a2) { 119 | RED4ext::RelocFunc call(VFT, 0x58); 120 | return call(this, aContext, a2); 121 | }; 122 | 123 | virtual inline void sub_60() {}; 124 | virtual inline void sub_68() {}; 125 | virtual inline void sub_70() {}; 126 | virtual inline void sub_78() {}; 127 | virtual inline void sub_80() {}; 128 | virtual inline void sub_88() {}; 129 | virtual inline void sub_90() {}; 130 | virtual inline void sub_98() {}; 131 | 132 | // 1.6 RVA: 0x26BA70 / 2538096 133 | // 1.62 RVA: 0x26C0A0 / 2539680 134 | /// @pattern 48 83 EC 28 65 48 8B 04 25 58 00 00 00 BA 10 00 00 00 48 8B 08 8B 04 0A 39 05 36 97 6A 03 7F 0C 135 | static ScriptHost * Get() { 136 | RED4ext::RelocFunc call(ScriptHost_Get_Addr); 137 | return call(); 138 | }; 139 | 140 | ScriptInterface interface; 141 | uint64_t unk60; 142 | RED4ext::HashMap unk68; 143 | RED4ext::SharedMutex unk68MUTX; 144 | uint8_t unk99; 145 | uint8_t unk9A; 146 | uint8_t unk9B; 147 | uint8_t unk9C; 148 | uint8_t unk9D; 149 | uint8_t unk9E; 150 | uint8_t unk9F; 151 | void *psa; 152 | }; 153 | //char (*__kaboom)[offsetof(ScriptHost, unk10)] = 1; 154 | 155 | //const uintptr_t ScriptsHost_p = 0x3F17738; 156 | -------------------------------------------------------------------------------- /src/red4ext/Template.hpp: -------------------------------------------------------------------------------- 1 | const auto CTD_HELPER_CSS = 2 | #include "style.css.frag" 3 | ; 4 | const auto CTD_HELPER_HIGHLIGHT = 5 | #include "highlight.min.js.frag" 6 | ; 7 | // const auto CTD_HELPER_LINE_NUMBERS = 8 | // #include "line-numbers.min.js.frag" 9 | // ; 10 | 11 | const auto CTD_HELPER_HEADER = 12 | fmt::format(R"( 13 | 14 | 15 | 18 | 25 | )", CTD_HELPER_CSS, CTD_HELPER_HIGHLIGHT);//, CTD_HELPER_LINE_NUMBERS); 26 | -------------------------------------------------------------------------------- /src/red4ext/Utils.cpp: -------------------------------------------------------------------------------- 1 | #include "stdafx.hpp" 2 | #include "Utils.hpp" 3 | 4 | #include 5 | #include 6 | 7 | void Utils::CreateLogger() 8 | { 9 | auto rootDir = GetRootDir(); 10 | auto red4extDir = rootDir / L"red4ext"; 11 | auto logsDir = red4extDir / L"logs"; 12 | spdlog::filename_t logFile = (logsDir / L"ctd_helper.log"); 13 | 14 | auto console = std::make_shared(); 15 | auto file = std::make_shared(logFile, true); 16 | 17 | spdlog::sinks_init_list sinks = {console, file}; 18 | 19 | auto logger = std::make_shared("", sinks); 20 | spdlog::set_default_logger(logger); 21 | 22 | logger->flush_on(spdlog::level::trace); 23 | spdlog::set_level(spdlog::level::trace); 24 | } 25 | 26 | std::filesystem::path Utils::GetRootDir() 27 | { 28 | constexpr auto pathLength = MAX_PATH + 1; 29 | 30 | // Try to get the executable path until we can fit the length of the path. 31 | std::wstring filename; 32 | do 33 | { 34 | filename.resize(filename.size() + pathLength, '\0'); 35 | 36 | auto length = GetModuleFileName(nullptr, filename.data(), static_cast(filename.size())); 37 | if (length > 0) 38 | { 39 | // Resize it to the real, std::filesystem::path" will use the string's length instead of recounting it. 40 | filename.resize(length); 41 | } 42 | } while (GetLastError() == ERROR_INSUFFICIENT_BUFFER); 43 | 44 | auto rootDir = std::filesystem::path(filename) 45 | .parent_path() // Resolve to "x64" directory. 46 | .parent_path() // Resolve to "bin" directory. 47 | .parent_path(); // Resolve to game root directory. 48 | 49 | return rootDir; 50 | } 51 | 52 | std::wstring Utils::ToWString(const char* aText) 53 | { 54 | auto length = strlen(aText); 55 | 56 | std::wstring result(L"", length); 57 | mbstowcs(result.data(), aText, length); 58 | 59 | return result; 60 | } 61 | -------------------------------------------------------------------------------- /src/red4ext/Utils.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | namespace Utils 5 | { 6 | void CreateLogger(); 7 | std::filesystem::path GetRootDir(); 8 | std::wstring ToWString(const char* aText); 9 | } 10 | -------------------------------------------------------------------------------- /src/red4ext/highlight.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | Highlight.js v11.7.0 (git: 82688fad18) 3 | (c) 2006-2022 undefined and other contributors 4 | License: BSD-3-Clause 5 | */ 6 | var hljs=function(){"use strict";var e={exports:{}};function t(e){ 7 | return e instanceof Map?e.clear=e.delete=e.set=()=>{ 8 | throw Error("map is read-only")}:e instanceof Set&&(e.add=e.clear=e.delete=()=>{ 9 | throw Error("set is read-only") 10 | }),Object.freeze(e),Object.getOwnPropertyNames(e).forEach((n=>{var i=e[n] 11 | ;"object"!=typeof i||Object.isFrozen(i)||t(i)})),e} 12 | e.exports=t,e.exports.default=t;class n{constructor(e){ 13 | void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} 14 | ignoreMatch(){this.isMatchIgnored=!0}}function i(e){ 15 | return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") 16 | }function r(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t] 17 | ;return t.forEach((e=>{for(const t in e)n[t]=e[t]})),n} 18 | const s=e=>!!e.scope||e.sublanguage&&e.language;class o{constructor(e,t){ 19 | this.buffer="",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){ 20 | this.buffer+=i(e)}openNode(e){if(!s(e))return;let t="" 21 | ;t=e.sublanguage?"language-"+e.language:((e,{prefix:t})=>{if(e.includes(".")){ 22 | const n=e.split(".") 23 | ;return[`${t}${n.shift()}`,...n.map(((e,t)=>`${e}${"_".repeat(t+1)}`))].join(" ") 24 | }return`${t}${e}`})(e.scope,{prefix:this.classPrefix}),this.span(t)} 25 | closeNode(e){s(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ 26 | this.buffer+=``}}const a=(e={})=>{const t={children:[]} 27 | ;return Object.assign(t,e),t};class c{constructor(){ 28 | this.rootNode=a(),this.stack=[this.rootNode]}get top(){ 29 | return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ 30 | this.top.children.push(e)}openNode(e){const t=a({scope:e}) 31 | ;this.add(t),this.stack.push(t)}closeNode(){ 32 | if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ 33 | for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} 34 | walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){ 35 | return"string"==typeof t?e.addText(t):t.children&&(e.openNode(t), 36 | t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){ 37 | "string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ 38 | c._collapse(e)})))}}class l extends c{constructor(e){super(),this.options=e} 39 | addKeyword(e,t){""!==e&&(this.openNode(t),this.addText(e),this.closeNode())} 40 | addText(e){""!==e&&this.add(e)}addSublanguage(e,t){const n=e.root 41 | ;n.sublanguage=!0,n.language=t,this.add(n)}toHTML(){ 42 | return new o(this,this.options).value()}finalize(){return!0}}function g(e){ 43 | return e?"string"==typeof e?e:e.source:null}function d(e){return p("(?=",e,")")} 44 | function u(e){return p("(?:",e,")*")}function h(e){return p("(?:",e,")?")} 45 | function p(...e){return e.map((e=>g(e))).join("")}function f(...e){const t=(e=>{ 46 | const t=e[e.length-1] 47 | ;return"object"==typeof t&&t.constructor===Object?(e.splice(e.length-1,1),t):{} 48 | })(e);return"("+(t.capture?"":"?:")+e.map((e=>g(e))).join("|")+")"} 49 | function b(e){return RegExp(e.toString()+"|").exec("").length-1} 50 | const m=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./ 51 | ;function E(e,{joinWith:t}){let n=0;return e.map((e=>{n+=1;const t=n 52 | ;let i=g(e),r="";for(;i.length>0;){const e=m.exec(i);if(!e){r+=i;break} 53 | r+=i.substring(0,e.index), 54 | i=i.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?r+="\\"+(Number(e[1])+t):(r+=e[0], 55 | "("===e[0]&&n++)}return r})).map((e=>`(${e})`)).join(t)} 56 | const x="[a-zA-Z]\\w*",w="[a-zA-Z_]\\w*",y="\\b\\d+(\\.\\d+)?",_="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",O="\\b(0b[01]+)",v={ 57 | begin:"\\\\[\\s\\S]",relevance:0},N={scope:"string",begin:"'",end:"'", 58 | illegal:"\\n",contains:[v]},k={scope:"string",begin:'"',end:'"',illegal:"\\n", 59 | contains:[v]},M=(e,t,n={})=>{const i=r({scope:"comment",begin:e,end:t, 60 | contains:[]},n);i.contains.push({scope:"doctag", 61 | begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", 62 | end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0}) 63 | ;const s=f("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/) 64 | ;return i.contains.push({begin:p(/[ ]+/,"(",s,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),i 65 | },S=M("//","$"),R=M("/\\*","\\*/"),j=M("#","$");var A=Object.freeze({ 66 | __proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:x,UNDERSCORE_IDENT_RE:w, 67 | NUMBER_RE:y,C_NUMBER_RE:_,BINARY_NUMBER_RE:O, 68 | RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", 69 | SHEBANG:(e={})=>{const t=/^#![ ]*\// 70 | ;return e.binary&&(e.begin=p(t,/.*\b/,e.binary,/\b.*/)),r({scope:"meta",begin:t, 71 | end:/$/,relevance:0,"on:begin":(e,t)=>{0!==e.index&&t.ignoreMatch()}},e)}, 72 | BACKSLASH_ESCAPE:v,APOS_STRING_MODE:N,QUOTE_STRING_MODE:k,PHRASAL_WORDS_MODE:{ 73 | begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ 74 | },COMMENT:M,C_LINE_COMMENT_MODE:S,C_BLOCK_COMMENT_MODE:R,HASH_COMMENT_MODE:j, 75 | NUMBER_MODE:{scope:"number",begin:y,relevance:0},C_NUMBER_MODE:{scope:"number", 76 | begin:_,relevance:0},BINARY_NUMBER_MODE:{scope:"number",begin:O,relevance:0}, 77 | REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{scope:"regexp",begin:/\//, 78 | end:/\/[gimuy]*/,illegal:/\n/,contains:[v,{begin:/\[/,end:/\]/,relevance:0, 79 | contains:[v]}]}]},TITLE_MODE:{scope:"title",begin:x,relevance:0}, 80 | UNDERSCORE_TITLE_MODE:{scope:"title",begin:w,relevance:0},METHOD_GUARD:{ 81 | begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:e=>Object.assign(e,{ 82 | "on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{ 83 | t.data._beginMatch!==e[1]&&t.ignoreMatch()}})});function I(e,t){ 84 | "."===e.input[e.index-1]&&t.ignoreMatch()}function T(e,t){ 85 | void 0!==e.className&&(e.scope=e.className,delete e.className)}function L(e,t){ 86 | t&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", 87 | e.__beforeBegin=I,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, 88 | void 0===e.relevance&&(e.relevance=0))}function B(e,t){ 89 | Array.isArray(e.illegal)&&(e.illegal=f(...e.illegal))}function D(e,t){ 90 | if(e.match){ 91 | if(e.begin||e.end)throw Error("begin & end are not supported with match") 92 | ;e.begin=e.match,delete e.match}}function H(e,t){ 93 | void 0===e.relevance&&(e.relevance=1)}const P=(e,t)=>{if(!e.beforeMatch)return 94 | ;if(e.starts)throw Error("beforeMatch cannot be used with starts") 95 | ;const n=Object.assign({},e);Object.keys(e).forEach((t=>{delete e[t] 96 | })),e.keywords=n.keywords,e.begin=p(n.beforeMatch,d(n.begin)),e.starts={ 97 | relevance:0,contains:[Object.assign(n,{endsParent:!0})] 98 | },e.relevance=0,delete n.beforeMatch 99 | },C=["of","and","for","in","not","or","if","then","parent","list","value"] 100 | ;function $(e,t,n="keyword"){const i=Object.create(null) 101 | ;return"string"==typeof e?r(n,e.split(" ")):Array.isArray(e)?r(n,e):Object.keys(e).forEach((n=>{ 102 | Object.assign(i,$(e[n],t,n))})),i;function r(e,n){ 103 | t&&(n=n.map((e=>e.toLowerCase()))),n.forEach((t=>{const n=t.split("|") 104 | ;i[n[0]]=[e,U(n[0],n[1])]}))}}function U(e,t){ 105 | return t?Number(t):(e=>C.includes(e.toLowerCase()))(e)?0:1}const z={},K=e=>{ 106 | console.error(e)},W=(e,...t)=>{console.log("WARN: "+e,...t)},X=(e,t)=>{ 107 | z[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),z[`${e}/${t}`]=!0) 108 | },G=Error();function Z(e,t,{key:n}){let i=0;const r=e[n],s={},o={} 109 | ;for(let e=1;e<=t.length;e++)o[e+i]=r[e],s[e+i]=!0,i+=b(t[e-1]) 110 | ;e[n]=o,e[n]._emit=s,e[n]._multi=!0}function F(e){(e=>{ 111 | e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope, 112 | delete e.scope)})(e),"string"==typeof e.beginScope&&(e.beginScope={ 113 | _wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope 114 | }),(e=>{if(Array.isArray(e.begin)){ 115 | if(e.skip||e.excludeBegin||e.returnBegin)throw K("skip, excludeBegin, returnBegin not compatible with beginScope: {}"), 116 | G 117 | ;if("object"!=typeof e.beginScope||null===e.beginScope)throw K("beginScope must be object"), 118 | G;Z(e,e.begin,{key:"beginScope"}),e.begin=E(e.begin,{joinWith:""})}})(e),(e=>{ 119 | if(Array.isArray(e.end)){ 120 | if(e.skip||e.excludeEnd||e.returnEnd)throw K("skip, excludeEnd, returnEnd not compatible with endScope: {}"), 121 | G 122 | ;if("object"!=typeof e.endScope||null===e.endScope)throw K("endScope must be object"), 123 | G;Z(e,e.end,{key:"endScope"}),e.end=E(e.end,{joinWith:""})}})(e)}function V(e){ 124 | function t(t,n){ 125 | return RegExp(g(t),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(n?"g":"")) 126 | }class n{constructor(){ 127 | this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} 128 | addRule(e,t){ 129 | t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]), 130 | this.matchAt+=b(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null) 131 | ;const e=this.regexes.map((e=>e[1]));this.matcherRe=t(E(e,{joinWith:"|" 132 | }),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex 133 | ;const t=this.matcherRe.exec(e);if(!t)return null 134 | ;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),i=this.matchIndexes[n] 135 | ;return t.splice(0,n),Object.assign(t,i)}}class i{constructor(){ 136 | this.rules=[],this.multiRegexes=[], 137 | this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ 138 | if(this.multiRegexes[e])return this.multiRegexes[e];const t=new n 139 | ;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))), 140 | t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){ 141 | return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){ 142 | this.rules.push([e,t]),"begin"===t.type&&this.count++}exec(e){ 143 | const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex 144 | ;let n=t.exec(e) 145 | ;if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{ 146 | const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)} 147 | return n&&(this.regexIndex+=n.position+1, 148 | this.regexIndex===this.count&&this.considerAll()),n}} 149 | if(e.compilerExtensions||(e.compilerExtensions=[]), 150 | e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") 151 | ;return e.classNameAliases=r(e.classNameAliases||{}),function n(s,o){const a=s 152 | ;if(s.isCompiled)return a 153 | ;[T,D,F,P].forEach((e=>e(s,o))),e.compilerExtensions.forEach((e=>e(s,o))), 154 | s.__beforeBegin=null,[L,B,H].forEach((e=>e(s,o))),s.isCompiled=!0;let c=null 155 | ;return"object"==typeof s.keywords&&s.keywords.$pattern&&(s.keywords=Object.assign({},s.keywords), 156 | c=s.keywords.$pattern, 157 | delete s.keywords.$pattern),c=c||/\w+/,s.keywords&&(s.keywords=$(s.keywords,e.case_insensitive)), 158 | a.keywordPatternRe=t(c,!0), 159 | o&&(s.begin||(s.begin=/\B|\b/),a.beginRe=t(a.begin),s.end||s.endsWithParent||(s.end=/\B|\b/), 160 | s.end&&(a.endRe=t(a.end)), 161 | a.terminatorEnd=g(a.end)||"",s.endsWithParent&&o.terminatorEnd&&(a.terminatorEnd+=(s.end?"|":"")+o.terminatorEnd)), 162 | s.illegal&&(a.illegalRe=t(s.illegal)), 163 | s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((t=>r(e,{ 164 | variants:null},t)))),e.cachedVariants?e.cachedVariants:q(e)?r(e,{ 165 | starts:e.starts?r(e.starts):null 166 | }):Object.isFrozen(e)?r(e):e))("self"===e?s:e)))),s.contains.forEach((e=>{n(e,a) 167 | })),s.starts&&n(s.starts,o),a.matcher=(e=>{const t=new i 168 | ;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:"begin" 169 | }))),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:"end" 170 | }),e.illegal&&t.addRule(e.illegal,{type:"illegal"}),t})(a),a}(e)}function q(e){ 171 | return!!e&&(e.endsWithParent||q(e.starts))}class J extends Error{ 172 | constructor(e,t){super(e),this.name="HTMLInjectionError",this.html=t}} 173 | const Y=i,Q=r,ee=Symbol("nomatch");var te=(t=>{ 174 | const i=Object.create(null),r=Object.create(null),s=[];let o=!0 175 | ;const a="Could not find the language '{}', did you forget to load/include a language module?",c={ 176 | disableAutodetect:!0,name:"Plain text",contains:[]};let g={ 177 | ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i, 178 | languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", 179 | cssSelector:"pre code",languages:null,__emitter:l};function b(e){ 180 | return g.noHighlightRe.test(e)}function m(e,t,n){let i="",r="" 181 | ;"object"==typeof t?(i=e, 182 | n=t.ignoreIllegals,r=t.language):(X("10.7.0","highlight(lang, code, ...args) has been deprecated."), 183 | X("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), 184 | r=e,i=t),void 0===n&&(n=!0);const s={code:i,language:r};k("before:highlight",s) 185 | ;const o=s.result?s.result:E(s.language,s.code,n) 186 | ;return o.code=s.code,k("after:highlight",o),o}function E(e,t,r,s){ 187 | const c=Object.create(null);function l(){if(!N.keywords)return void M.addText(S) 188 | ;let e=0;N.keywordPatternRe.lastIndex=0;let t=N.keywordPatternRe.exec(S),n="" 189 | ;for(;t;){n+=S.substring(e,t.index) 190 | ;const r=y.case_insensitive?t[0].toLowerCase():t[0],s=(i=r,N.keywords[i]);if(s){ 191 | const[e,i]=s 192 | ;if(M.addText(n),n="",c[r]=(c[r]||0)+1,c[r]<=7&&(R+=i),e.startsWith("_"))n+=t[0];else{ 193 | const n=y.classNameAliases[e]||e;M.addKeyword(t[0],n)}}else n+=t[0] 194 | ;e=N.keywordPatternRe.lastIndex,t=N.keywordPatternRe.exec(S)}var i 195 | ;n+=S.substring(e),M.addText(n)}function d(){null!=N.subLanguage?(()=>{ 196 | if(""===S)return;let e=null;if("string"==typeof N.subLanguage){ 197 | if(!i[N.subLanguage])return void M.addText(S) 198 | ;e=E(N.subLanguage,S,!0,k[N.subLanguage]),k[N.subLanguage]=e._top 199 | }else e=x(S,N.subLanguage.length?N.subLanguage:null) 200 | ;N.relevance>0&&(R+=e.relevance),M.addSublanguage(e._emitter,e.language) 201 | })():l(),S=""}function u(e,t){let n=1;const i=t.length-1;for(;n<=i;){ 202 | if(!e._emit[n]){n++;continue}const i=y.classNameAliases[e[n]]||e[n],r=t[n] 203 | ;i?M.addKeyword(r,i):(S=r,l(),S=""),n++}}function h(e,t){ 204 | return e.scope&&"string"==typeof e.scope&&M.openNode(y.classNameAliases[e.scope]||e.scope), 205 | e.beginScope&&(e.beginScope._wrap?(M.addKeyword(S,y.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap), 206 | S=""):e.beginScope._multi&&(u(e.beginScope,t),S="")),N=Object.create(e,{parent:{ 207 | value:N}}),N}function p(e,t,i){let r=((e,t)=>{const n=e&&e.exec(t) 208 | ;return n&&0===n.index})(e.endRe,i);if(r){if(e["on:end"]){const i=new n(e) 209 | ;e["on:end"](t,i),i.isMatchIgnored&&(r=!1)}if(r){ 210 | for(;e.endsParent&&e.parent;)e=e.parent;return e}} 211 | if(e.endsWithParent)return p(e.parent,t,i)}function f(e){ 212 | return 0===N.matcher.regexIndex?(S+=e[0],1):(I=!0,0)}function b(e){ 213 | const n=e[0],i=t.substring(e.index),r=p(N,e,i);if(!r)return ee;const s=N 214 | ;N.endScope&&N.endScope._wrap?(d(), 215 | M.addKeyword(n,N.endScope._wrap)):N.endScope&&N.endScope._multi?(d(), 216 | u(N.endScope,e)):s.skip?S+=n:(s.returnEnd||s.excludeEnd||(S+=n), 217 | d(),s.excludeEnd&&(S=n));do{ 218 | N.scope&&M.closeNode(),N.skip||N.subLanguage||(R+=N.relevance),N=N.parent 219 | }while(N!==r.parent);return r.starts&&h(r.starts,e),s.returnEnd?0:n.length} 220 | let m={};function w(i,s){const a=s&&s[0];if(S+=i,null==a)return d(),0 221 | ;if("begin"===m.type&&"end"===s.type&&m.index===s.index&&""===a){ 222 | if(S+=t.slice(s.index,s.index+1),!o){const t=Error(`0 width match regex (${e})`) 223 | ;throw t.languageName=e,t.badRule=m.rule,t}return 1} 224 | if(m=s,"begin"===s.type)return(e=>{ 225 | const t=e[0],i=e.rule,r=new n(i),s=[i.__beforeBegin,i["on:begin"]] 226 | ;for(const n of s)if(n&&(n(e,r),r.isMatchIgnored))return f(t) 227 | ;return i.skip?S+=t:(i.excludeBegin&&(S+=t), 228 | d(),i.returnBegin||i.excludeBegin||(S=t)),h(i,e),i.returnBegin?0:t.length})(s) 229 | ;if("illegal"===s.type&&!r){ 230 | const e=Error('Illegal lexeme "'+a+'" for mode "'+(N.scope||"")+'"') 231 | ;throw e.mode=N,e}if("end"===s.type){const e=b(s);if(e!==ee)return e} 232 | if("illegal"===s.type&&""===a)return 1 233 | ;if(A>1e5&&A>3*s.index)throw Error("potential infinite loop, way more iterations than matches") 234 | ;return S+=a,a.length}const y=O(e) 235 | ;if(!y)throw K(a.replace("{}",e)),Error('Unknown language: "'+e+'"') 236 | ;const _=V(y);let v="",N=s||_;const k={},M=new g.__emitter(g);(()=>{const e=[] 237 | ;for(let t=N;t!==y;t=t.parent)t.scope&&e.unshift(t.scope) 238 | ;e.forEach((e=>M.openNode(e)))})();let S="",R=0,j=0,A=0,I=!1;try{ 239 | for(N.matcher.considerAll();;){ 240 | A++,I?I=!1:N.matcher.considerAll(),N.matcher.lastIndex=j 241 | ;const e=N.matcher.exec(t);if(!e)break;const n=w(t.substring(j,e.index),e) 242 | ;j=e.index+n} 243 | return w(t.substring(j)),M.closeAllNodes(),M.finalize(),v=M.toHTML(),{ 244 | language:e,value:v,relevance:R,illegal:!1,_emitter:M,_top:N}}catch(n){ 245 | if(n.message&&n.message.includes("Illegal"))return{language:e,value:Y(t), 246 | illegal:!0,relevance:0,_illegalBy:{message:n.message,index:j, 247 | context:t.slice(j-100,j+100),mode:n.mode,resultSoFar:v},_emitter:M};if(o)return{ 248 | language:e,value:Y(t),illegal:!1,relevance:0,errorRaised:n,_emitter:M,_top:N} 249 | ;throw n}}function x(e,t){t=t||g.languages||Object.keys(i);const n=(e=>{ 250 | const t={value:Y(e),illegal:!1,relevance:0,_top:c,_emitter:new g.__emitter(g)} 251 | ;return t._emitter.addText(e),t})(e),r=t.filter(O).filter(N).map((t=>E(t,e,!1))) 252 | ;r.unshift(n);const s=r.sort(((e,t)=>{ 253 | if(e.relevance!==t.relevance)return t.relevance-e.relevance 254 | ;if(e.language&&t.language){if(O(e.language).supersetOf===t.language)return 1 255 | ;if(O(t.language).supersetOf===e.language)return-1}return 0})),[o,a]=s,l=o 256 | ;return l.secondBest=a,l}function w(e){let t=null;const n=(e=>{ 257 | let t=e.className+" ";t+=e.parentNode?e.parentNode.className:"" 258 | ;const n=g.languageDetectRe.exec(t);if(n){const t=O(n[1]) 259 | ;return t||(W(a.replace("{}",n[1])), 260 | W("Falling back to no-highlight mode for this block.",e)),t?n[1]:"no-highlight"} 261 | return t.split(/\s+/).find((e=>b(e)||O(e)))})(e);if(b(n))return 262 | ;if(k("before:highlightElement",{el:e,language:n 263 | }),e.children.length>0&&(g.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."), 264 | console.warn("https://github.com/highlightjs/highlight.js/wiki/security"), 265 | console.warn("The element with unescaped HTML:"), 266 | console.warn(e)),g.throwUnescapedHTML))throw new J("One of your code blocks includes unescaped HTML.",e.innerHTML) 267 | ;t=e;const i=t.textContent,s=n?m(i,{language:n,ignoreIllegals:!0}):x(i) 268 | ;e.innerHTML=s.value,((e,t,n)=>{const i=t&&r[t]||n 269 | ;e.classList.add("hljs"),e.classList.add("language-"+i) 270 | })(e,n,s.language),e.result={language:s.language,re:s.relevance, 271 | relevance:s.relevance},s.secondBest&&(e.secondBest={ 272 | language:s.secondBest.language,relevance:s.secondBest.relevance 273 | }),k("after:highlightElement",{el:e,result:s,text:i})}let y=!1;function _(){ 274 | "loading"!==document.readyState?document.querySelectorAll(g.cssSelector).forEach(w):y=!0 275 | }function O(e){return e=(e||"").toLowerCase(),i[e]||i[r[e]]} 276 | function v(e,{languageName:t}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ 277 | r[e.toLowerCase()]=t}))}function N(e){const t=O(e) 278 | ;return t&&!t.disableAutodetect}function k(e,t){const n=e;s.forEach((e=>{ 279 | e[n]&&e[n](t)}))} 280 | "undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ 281 | y&&_()}),!1),Object.assign(t,{highlight:m,highlightAuto:x,highlightAll:_, 282 | highlightElement:w, 283 | highlightBlock:e=>(X("10.7.0","highlightBlock will be removed entirely in v12.0"), 284 | X("10.7.0","Please use highlightElement now."),w(e)),configure:e=>{g=Q(g,e)}, 285 | initHighlighting:()=>{ 286 | _(),X("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")}, 287 | initHighlightingOnLoad:()=>{ 288 | _(),X("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.") 289 | },registerLanguage:(e,n)=>{let r=null;try{r=n(t)}catch(t){ 290 | if(K("Language definition for '{}' could not be registered.".replace("{}",e)), 291 | !o)throw t;K(t),r=c} 292 | r.name||(r.name=e),i[e]=r,r.rawDefinition=n.bind(null,t),r.aliases&&v(r.aliases,{ 293 | languageName:e})},unregisterLanguage:e=>{delete i[e] 294 | ;for(const t of Object.keys(r))r[t]===e&&delete r[t]}, 295 | listLanguages:()=>Object.keys(i),getLanguage:O,registerAliases:v, 296 | autoDetection:N,inherit:Q,addPlugin:e=>{(e=>{ 297 | e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=t=>{ 298 | e["before:highlightBlock"](Object.assign({block:t.el},t)) 299 | }),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=t=>{ 300 | e["after:highlightBlock"](Object.assign({block:t.el},t))})})(e),s.push(e)} 301 | }),t.debugMode=()=>{o=!1},t.safeMode=()=>{o=!0 302 | },t.versionString="11.7.0",t.regex={concat:p,lookahead:d,either:f,optional:h, 303 | anyNumberOfTimes:u};for(const t in A)"object"==typeof A[t]&&e.exports(A[t]) 304 | ;return Object.assign(t,A),t})({});return te}() 305 | ;"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);/*! `swift` grammar compiled for Highlight.js 11.7.0 */ 306 | (()=>{var e=(()=>{"use strict";function e(e){ 307 | return e?"string"==typeof e?e:e.source:null}function a(e){return t("(?=",e,")")} 308 | function t(...a){return a.map((a=>e(a))).join("")}function n(...a){const t=(e=>{ 309 | const a=e[e.length-1] 310 | ;return"object"==typeof a&&a.constructor===Object?(e.splice(e.length-1,1),a):{} 311 | })(a);return"("+(t.capture?"":"?:")+a.map((a=>e(a))).join("|")+")"} 312 | const i=e=>t(/\b/,e,/\w$/.test(e)?/\b/:/\B/),s=["Protocol","Type"].map(i),u=["init","self"].map(i),c=["Any","Self"],r=["actor","any","associatedtype","async","await",/as\?/,/as!/,"as","break","case","catch","class","continue","convenience","default","defer","deinit","didSet","distributed","do","dynamic","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","isolated","nonisolated","lazy","let","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","postfix","precedencegroup","prefix",/private\(set\)/,"private","protected","const","cb","exec","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],o=["false","nil","true"],l=["assignment","associativity","higherThan","left","lowerThan","none","right"],m=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warn_unqualified_access","#warning"],p=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],d=n(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),F=n(d,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),b=t(d,F,"*"),h=n(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),f=n(h,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),w=t(h,f,"*"),y=t(/[A-Z]/,f,"*"),g=["autoclosure",t(/convention\(/,n("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",t(/objc\(/,w,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","resultBuilder","testable","UIApplicationMain","unknown","usableFromInline"],E=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"] 313 | ;return e=>{const d={match:/\s+/,relevance:0},h=e.COMMENT("/\\*","\\*/",{ 314 | contains:["self"]}),v=[e.C_LINE_COMMENT_MODE,h],A={match:[/\./,n(...s,...u)], 315 | className:{2:"keyword"}},N={match:t(/\./,n(...r)),relevance:0 316 | },C=r.filter((e=>"string"==typeof e)).concat(["_|0"]),D={variants:[{ 317 | className:"keyword", 318 | match:n(...r.filter((e=>"string"!=typeof e)).concat(c).map(i),...u)}]},k={ 319 | $pattern:n(/\b\w+/,/#\w+/),keyword:C.concat(m),literal:o},B=[A,N,D],_=[{ 320 | match:t(/\./,n(...p)),relevance:0},{className:"built_in", 321 | match:t(/\b/,n(...p),/(?=\()/)}],S={match:/->/,relevance:0},M=[S,{ 322 | className:"operator",relevance:0,variants:[{match:b},{match:`\\.(\\.|${F})+`}] 323 | }],x="([0-9a-fA-F]_*)+",I={className:"number",relevance:0,variants:[{ 324 | match:"\\b(([0-9]_*)+)(\\.(([0-9]_*)+))?([eE][+-]?(([0-9]_*)+))?\\b"},{ 325 | match:`\\b0x(${x})(\\.(${x}))?([pP][+-]?(([0-9]_*)+))?\\b`},{ 326 | match:/\b0o([0-7]_*)+\b/},{match:/\b0b([01]_*)+\b/}]},L=(e="")=>({ 327 | className:"subst",variants:[{match:t(/\\/,e,/[0\\tnr"']/)},{ 328 | match:t(/\\/,e,/u\{[0-9a-fA-F]{1,8}\}/)}]}),O=(e="")=>({className:"subst", 329 | match:t(/\\/,e,/[\t ]*(?:[\r\n]|\r\n)/)}),T=(e="")=>({className:"subst", 330 | label:"interpol",begin:t(/\\/,e,/\(/),end:/\)/}),$=(e="")=>({begin:t(e,/"""/), 331 | end:t(/"""/,e),contains:[L(e),O(e),T(e)]}),j=(e="")=>({begin:t(e,/"/), 332 | end:t(/"/,e),contains:[L(e),T(e)]}),P={className:"string", 333 | variants:[$(),$("#"),$("##"),$("###"),j(),j("#"),j("##"),j("###")]},K={ 334 | match:t(/`/,w,/`/)},z=[K,{className:"variable",match:/\$\d+/},{ 335 | className:"variable",match:`\\$${f}+`}],q=[{match:/(@|#(un)?)available/, 336 | className:"keyword",starts:{contains:[{begin:/\(/,end:/\)/,keywords:E, 337 | contains:[...M,I,P]}]}},{className:"keyword",match:t(/@/,n(...g))},{ 338 | className:"meta",match:t(/@/,w)}],U={match:a(/\b[A-Z]/),relevance:0,contains:[{ 339 | className:"type", 340 | match:t(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,f,"+") 341 | },{className:"type",match:y,relevance:0},{match:/[?!]+/,relevance:0},{ 342 | match:/\.\.\./,relevance:0},{match:t(/\s+&\s+/,a(y)),relevance:0}]},Z={ 343 | begin://,keywords:k,contains:[...v,...B,...q,S,U]};U.contains.push(Z) 344 | ;const V={begin:/\(/,end:/\)/,relevance:0,keywords:k,contains:["self",{ 345 | match:t(w,/\s*:/),keywords:"_|0",relevance:0 346 | },...v,...B,..._,...M,I,P,...z,...q,U]},W={begin://,contains:[...v,U] 347 | },G={begin:/\(/,end:/\)/,keywords:k,contains:[{ 348 | begin:n(a(t(w,/\s*:/)),a(t(w,/\s+/,w,/\s*:/))),end:/:/,relevance:0,contains:[{ 349 | className:"keyword",match:/\b_\b/},{className:"params",match:w}] 350 | },...v,...B,...M,I,P,...q,U,V],endsParent:!0,illegal:/["']/},R={ 351 | match:[/func/,/\s+/,n(K.match,w,b)],className:{1:"keyword",3:"title.function"}, 352 | contains:[W,G,d],illegal:[/\[/,/%/]},X={ 353 | match:[/\b(?:subscript|init[?!]?)/,/\s*(?=[<(])/],className:{1:"keyword"}, 354 | contains:[W,G,d],illegal:/\[|%/},H={match:[/operator/,/\s+/,b],className:{ 355 | 1:"keyword",3:"title"}},J={begin:[/precedencegroup/,/\s+/,y],className:{ 356 | 1:"keyword",3:"title"},contains:[U],keywords:[...l,...o],end:/}/} 357 | ;for(const e of P.variants){const a=e.contains.find((e=>"interpol"===e.label)) 358 | ;a.keywords=k;const t=[...B,..._,...M,I,P,...z];a.contains=[...t,{begin:/\(/, 359 | end:/\)/,contains:["self",...t]}]}return{name:"Swift",keywords:k, 360 | contains:[...v,R,X,{beginKeywords:"struct protocol class extension enum actor", 361 | end:"\\{",excludeEnd:!0,keywords:k,contains:[e.inherit(e.TITLE_MODE,{ 362 | className:"title.class",begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/}),...B] 363 | },H,J,{beginKeywords:"import",end:/$/,contains:[...v],relevance:0 364 | },...B,..._,...M,I,P,...z,...q,U,V]}}})();hljs.registerLanguage("swift",e)})(); -------------------------------------------------------------------------------- /src/red4ext/highlight.min.js.frag: -------------------------------------------------------------------------------- 1 | R"for_c++_include(/*! 2 | Highlight.js v11.7.0 (git: 82688fad18) 3 | (c) 2006-2022 undefined and other contributors 4 | License: BSD-3-Clause 5 | */ 6 | var hljs=function(){"use strict";var e={exports:{}};function t(e){ 7 | return e instanceof Map?e.clear=e.delete=e.set=()=>{ 8 | throw Error("map is read-only")}:e instanceof Set&&(e.add=e.clear=e.delete=()=>{ 9 | throw Error("set is read-only") 10 | }),Object.freeze(e),Object.getOwnPropertyNames(e).forEach((n=>{var i=e[n] 11 | ;"object"!=typeof i||Object.isFrozen(i)||t(i)})),e} 12 | e.exports=t,e.exports.default=t;class n{constructor(e){ 13 | void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} 14 | ignoreMatch(){this.isMatchIgnored=!0}}function i(e){ 15 | return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") 16 | }function r(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t] 17 | ;return t.forEach((e=>{for(const t in e)n[t]=e[t]})),n} 18 | const s=e=>!!e.scope||e.sublanguage&&e.language;class o{constructor(e,t){ 19 | this.buffer="",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){ 20 | this.buffer+=i(e)}openNode(e){if(!s(e))return;let t="" 21 | ;t=e.sublanguage?"language-"+e.language:((e,{prefix:t})=>{if(e.includes(".")){ 22 | const n=e.split(".") 23 | ;return[`${t}${n.shift()}`,...n.map(((e,t)=>`${e}${"_".repeat(t+1)}`))].join(" ") 24 | }return`${t}${e}`})(e.scope,{prefix:this.classPrefix}),this.span(t)} 25 | closeNode(e){s(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ 26 | this.buffer+=``}}const a=(e={})=>{const t={children:[]} 27 | ;return Object.assign(t,e),t};class c{constructor(){ 28 | this.rootNode=a(),this.stack=[this.rootNode]}get top(){ 29 | return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ 30 | this.top.children.push(e)}openNode(e){const t=a({scope:e}) 31 | ;this.add(t),this.stack.push(t)}closeNode(){ 32 | if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ 33 | for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} 34 | walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){ 35 | return"string"==typeof t?e.addText(t):t.children&&(e.openNode(t), 36 | t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){ 37 | "string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ 38 | c._collapse(e)})))}}class l extends c{constructor(e){super(),this.options=e} 39 | addKeyword(e,t){""!==e&&(this.openNode(t),this.addText(e),this.closeNode())} 40 | addText(e){""!==e&&this.add(e)}addSublanguage(e,t){const n=e.root 41 | ;n.sublanguage=!0,n.language=t,this.add(n)}toHTML(){ 42 | return new o(this,this.options).value()}finalize(){return!0}}function g(e){ 43 | return e?"string"==typeof e?e:e.source:null}function d(e){return p("(?=",e,")")} 44 | function u(e){return p("(?:",e,")*")}function h(e){return p("(?:",e,")?")} 45 | function p(...e){return e.map((e=>g(e))).join("")}function f(...e){const t=(e=>{ 46 | const t=e[e.length-1] 47 | ;return"object"==typeof t&&t.constructor===Object?(e.splice(e.length-1,1),t):{} 48 | })(e);return"("+(t.capture?"":"?:")+e.map((e=>g(e))).join("|")+")"} 49 | function b(e){return RegExp(e.toString()+"|").exec("").length-1} 50 | const m=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./ 51 | ;function E(e,{joinWith:t}){let n=0;return e.map((e=>{n+=1;const t=n 52 | ;let i=g(e),r="";for(;i.length>0;){const e=m.exec(i);if(!e){r+=i;break} 53 | r+=i.substring(0,e.index), 54 | i=i.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?r+="\\"+(Number(e[1])+t):(r+=e[0], 55 | "("===e[0]&&n++)}return r})).map((e=>`(${e})`)).join(t)} 56 | const x="[a-zA-Z]\\w*",w="[a-zA-Z_]\\w*",y="\\b\\d+(\\.\\d+)?",_="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",O="\\b(0b[01]+)",v={ 57 | begin:"\\\\[\\s\\S]",relevance:0},N={scope:"string",begin:"'",end:"'", 58 | illegal:"\\n",contains:[v]},k={scope:"string",begin:'"',end:'"',illegal:"\\n", 59 | contains:[v]},M=(e,t,n={})=>{const i=r({scope:"comment",begin:e,end:t, 60 | contains:[]},n);i.contains.push({scope:"doctag", 61 | begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", 62 | end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0}) 63 | ;const s=f("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/) 64 | ;return i.contains.push({begin:p(/[ ]+/,"(",s,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),i 65 | },S=M("//","$"),R=M("/\\*","\\*/"),j=M("#","$");var A=Object.freeze({ 66 | __proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:x,UNDERSCORE_IDENT_RE:w, 67 | NUMBER_RE:y,C_NUMBER_RE:_,BINARY_NUMBER_RE:O, 68 | RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", 69 | SHEBANG:(e={})=>{const t=/^#![ ]*\// 70 | ;return e.binary&&(e.begin=p(t,/.*\b/,e.binary,/\b.*/)),r({scope:"meta",begin:t, 71 | end:/$/,relevance:0,"on:begin":(e,t)=>{0!==e.index&&t.ignoreMatch()}},e)}, 72 | BACKSLASH_ESCAPE:v,APOS_STRING_MODE:N,QUOTE_STRING_MODE:k,PHRASAL_WORDS_MODE:{ 73 | begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ 74 | },COMMENT:M,C_LINE_COMMENT_MODE:S,C_BLOCK_COMMENT_MODE:R,HASH_COMMENT_MODE:j, 75 | NUMBER_MODE:{scope:"number",begin:y,relevance:0},C_NUMBER_MODE:{scope:"number", 76 | begin:_,relevance:0},BINARY_NUMBER_MODE:{scope:"number",begin:O,relevance:0}, 77 | REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{scope:"regexp",begin:/\//, 78 | end:/\/[gimuy]*/,illegal:/\n/,contains:[v,{begin:/\[/,end:/\]/,relevance:0, 79 | contains:[v]}]}]},TITLE_MODE:{scope:"title",begin:x,relevance:0}, 80 | UNDERSCORE_TITLE_MODE:{scope:"title",begin:w,relevance:0},METHOD_GUARD:{ 81 | begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:e=>Object.assign(e,{ 82 | "on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{ 83 | t.data._beginMatch!==e[1]&&t.ignoreMatch()}})});function I(e,t){ 84 | "."===e.input[e.index-1]&&t.ignoreMatch()}function T(e,t){ 85 | void 0!==e.className&&(e.scope=e.className,delete e.className)}function L(e,t){ 86 | t&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", 87 | e.__beforeBegin=I,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, 88 | void 0===e.relevance&&(e.relevance=0))}function B(e,t){ 89 | Array.isArray(e.illegal)&&(e.illegal=f(...e.illegal))}function D(e,t){ 90 | if(e.match){ 91 | if(e.begin||e.end)throw Error("begin & end are not supported with match") 92 | ;e.begin=e.match,delete e.match}}function H(e,t){ 93 | void 0===e.relevance&&(e.relevance=1)}const P=(e,t)=>{if(!e.beforeMatch)return 94 | ;if(e.starts)throw Error("beforeMatch cannot be used with starts") 95 | ;const n=Object.assign({},e);Object.keys(e).forEach((t=>{delete e[t] 96 | })),e.keywords=n.keywords,e.begin=p(n.beforeMatch,d(n.begin)),e.starts={ 97 | relevance:0,contains:[Object.assign(n,{endsParent:!0})] 98 | },e.relevance=0,delete n.beforeMatch 99 | },C=["of","and","for","in","not","or","if","then","parent","list","value"] 100 | ;function $(e,t,n="keyword"){const i=Object.create(null) 101 | ;return"string"==typeof e?r(n,e.split(" ")):Array.isArray(e)?r(n,e):Object.keys(e).forEach((n=>{ 102 | Object.assign(i,$(e[n],t,n))})),i;function r(e,n){ 103 | t&&(n=n.map((e=>e.toLowerCase()))),n.forEach((t=>{const n=t.split("|") 104 | ;i[n[0]]=[e,U(n[0],n[1])]}))}}function U(e,t){ 105 | return t?Number(t):(e=>C.includes(e.toLowerCase()))(e)?0:1}const z={},K=e=>{ 106 | console.error(e)},W=(e,...t)=>{console.log("WARN: "+e,...t)},X=(e,t)=>{ 107 | z[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),z[`${e}/${t}`]=!0) 108 | },G=Error();function Z(e,t,{key:n}){let i=0;const r=e[n],s={},o={} 109 | ;for(let e=1;e<=t.length;e++)o[e+i]=r[e],s[e+i]=!0,i+=b(t[e-1]) 110 | ;e[n]=o,e[n]._emit=s,e[n]._multi=!0}function F(e){(e=>{ 111 | e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope, 112 | delete e.scope)})(e),"string"==typeof e.beginScope&&(e.beginScope={ 113 | _wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope 114 | }),(e=>{if(Array.isArray(e.begin)){ 115 | if(e.skip||e.excludeBegin||e.returnBegin)throw K("skip, excludeBegin, returnBegin not compatible with beginScope: {}"), 116 | G 117 | ;if("object"!=typeof e.beginScope||null===e.beginScope)throw K("beginScope must be object"), 118 | G;Z(e,e.begin,{key:"beginScope"}),e.begin=E(e.begin,{joinWith:""})}})(e),(e=>{ 119 | if(Array.isArray(e.end)){ 120 | if(e.skip||e.excludeEnd||e.returnEnd)throw K("skip, excludeEnd, returnEnd not compatible with endScope: {}"), 121 | G 122 | ;if("object"!=typeof e.endScope||null===e.endScope)throw K("endScope must be object"), 123 | G;Z(e,e.end,{key:"endScope"}),e.end=E(e.end,{joinWith:""})}})(e)}function V(e){ 124 | function t(t,n){ 125 | return RegExp(g(t),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(n?"g":"")) 126 | }class n{constructor(){ 127 | this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} 128 | addRule(e,t){ 129 | t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]), 130 | this.matchAt+=b(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null) 131 | ;const e=this.regexes.map((e=>e[1]));this.matcherRe=t(E(e,{joinWith:"|" 132 | }),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex 133 | ;const t=this.matcherRe.exec(e);if(!t)return null 134 | ;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),i=this.matchIndexes[n] 135 | ;return t.splice(0,n),Object.assign(t,i)}}class i{constructor(){ 136 | this.rules=[],this.multiRegexes=[], 137 | this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ 138 | if(this.multiRegexes[e])return this.multiRegexes[e];const t=new n 139 | ;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))), 140 | t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){ 141 | return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){ 142 | this.rules.push([e,t]),"begin"===t.type&&this.count++}exec(e){ 143 | const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex 144 | ;let n=t.exec(e) 145 | ;if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{ 146 | const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)} 147 | return n&&(this.regexIndex+=n.position+1, 148 | this.regexIndex===this.count&&this.considerAll()),n}} 149 | if(e.compilerExtensions||(e.compilerExtensions=[]), 150 | e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") 151 | ;return e.classNameAliases=r(e.classNameAliases||{}),function n(s,o){const a=s 152 | ;if(s.isCompiled)return a 153 | ;[T,D,F,P].forEach((e=>e(s,o))),e.compilerExtensions.forEach((e=>e(s,o))), 154 | s.__beforeBegin=null,[L,B,H].forEach((e=>e(s,o))),s.isCompiled=!0;let c=null 155 | ;return"object"==typeof s.keywords&&s.keywords.$pattern&&(s.keywords=Object.assign({},s.keywords), 156 | c=s.keywords.$pattern, 157 | delete s.keywords.$pattern),c=c||/\w+/,s.keywords&&(s.keywords=$(s.keywords,e.case_insensitive)), 158 | a.keywordPatternRe=t(c,!0), 159 | o&&(s.begin||(s.begin=/\B|\b/),a.beginRe=t(a.begin),s.end||s.endsWithParent||(s.end=/\B|\b/), 160 | s.end&&(a.endRe=t(a.end)), 161 | a.terminatorEnd=g(a.end)||"",s.endsWithParent&&o.terminatorEnd&&(a.terminatorEnd+=(s.end?"|":"")+o.terminatorEnd)), 162 | s.illegal&&(a.illegalRe=t(s.illegal)), 163 | s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((t=>r(e,{ 164 | variants:null},t)))),e.cachedVariants?e.cachedVariants:q(e)?r(e,{ 165 | starts:e.starts?r(e.starts):null 166 | }):Object.isFrozen(e)?r(e):e))("self"===e?s:e)))),s.contains.forEach((e=>{n(e,a) 167 | })),s.starts&&n(s.starts,o),a.matcher=(e=>{const t=new i 168 | ;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:"begin" 169 | }))),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:"end" 170 | }),e.illegal&&t.addRule(e.illegal,{type:"illegal"}),t})(a),a}(e)}function q(e){ 171 | return!!e&&(e.endsWithParent||q(e.starts))}class J extends Error{ 172 | constructor(e,t){super(e),this.name="HTMLInjectionError",this.html=t}} 173 | const Y=i,Q=r,ee=Symbol("nomatch");var te=(t=>{ 174 | const i=Object.create(null),r=Object.create(null),s=[];let o=!0 175 | ;const a="Could not find the language '{}', did you forget to load/include a language module?",c={ 176 | disableAutodetect:!0,name:"Plain text",contains:[]};let g={ 177 | ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i, 178 | languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", 179 | cssSelector:"pre code",languages:null,__emitter:l};function b(e){ 180 | return g.noHighlightRe.test(e)}function m(e,t,n){let i="",r="" 181 | ;"object"==typeof t?(i=e, 182 | n=t.ignoreIllegals,r=t.language):(X("10.7.0","highlight(lang, code, ...args) has been deprecated."), 183 | X("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), 184 | r=e,i=t),void 0===n&&(n=!0);const s={code:i,language:r};k("before:highlight",s) 185 | ;const o=s.result?s.result:E(s.language,s.code,n) 186 | ;return o.code=s.code,k("after:highlight",o),o}function E(e,t,r,s){ 187 | const c=Object.create(null);function l(){if(!N.keywords)return void M.addText(S) 188 | ;let e=0;N.keywordPatternRe.lastIndex=0;let t=N.keywordPatternRe.exec(S),n="" 189 | ;for(;t;){n+=S.substring(e,t.index) 190 | ;const r=y.case_insensitive?t[0].toLowerCase():t[0],s=(i=r,N.keywords[i]);if(s){ 191 | const[e,i]=s 192 | ;if(M.addText(n),n="",c[r]=(c[r]||0)+1,c[r]<=7&&(R+=i),e.startsWith("_"))n+=t[0];else{ 193 | const n=y.classNameAliases[e]||e;M.addKeyword(t[0],n)}}else n+=t[0] 194 | ;e=N.keywordPatternRe.lastIndex,t=N.keywordPatternRe.exec(S)}var i 195 | ;n+=S.substring(e),M.addText(n)}function d(){null!=N.subLanguage?(()=>{ 196 | if(""===S)return;let e=null;if("string"==typeof N.subLanguage){ 197 | if(!i[N.subLanguage])return void M.addText(S) 198 | ;e=E(N.subLanguage,S,!0,k[N.subLanguage]),k[N.subLanguage]=e._top 199 | }else e=x(S,N.subLanguage.length?N.subLanguage:null) 200 | ;N.relevance>0&&(R+=e.relevance),M.addSublanguage(e._emitter,e.language) 201 | })():l(),S=""}function u(e,t){let n=1;const i=t.length-1;for(;n<=i;){ 202 | if(!e._emit[n]){n++;continue}const i=y.classNameAliases[e[n]]||e[n],r=t[n] 203 | ;i?M.addKeyword(r,i):(S=r,l(),S=""),n++}}function h(e,t){ 204 | return e.scope&&"string"==typeof e.scope&&M.openNode(y.classNameAliases[e.scope]||e.scope), 205 | e.beginScope&&(e.beginScope._wrap?(M.addKeyword(S,y.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap), 206 | S=""):e.beginScope._multi&&(u(e.beginScope,t),S="")),N=Object.create(e,{parent:{ 207 | value:N}}),N}function p(e,t,i){let r=((e,t)=>{const n=e&&e.exec(t) 208 | ;return n&&0===n.index})(e.endRe,i);if(r){if(e["on:end"]){const i=new n(e) 209 | ;e["on:end"](t,i),i.isMatchIgnored&&(r=!1)}if(r){ 210 | for(;e.endsParent&&e.parent;)e=e.parent;return e}} 211 | if(e.endsWithParent)return p(e.parent,t,i)}function f(e){ 212 | return 0===N.matcher.regexIndex?(S+=e[0],1):(I=!0,0)}function b(e){ 213 | const n=e[0],i=t.substring(e.index),r=p(N,e,i);if(!r)return ee;const s=N 214 | ;N.endScope&&N.endScope._wrap?(d(), 215 | M.addKeyword(n,N.endScope._wrap)):N.endScope&&N.endScope._multi?(d(), 216 | u(N.endScope,e)):s.skip?S+=n:(s.returnEnd||s.excludeEnd||(S+=n), 217 | d(),s.excludeEnd&&(S=n));do{ 218 | N.scope&&M.closeNode(),N.skip||N.subLanguage||(R+=N.relevance),N=N.parent 219 | }while(N!==r.parent);return r.starts&&h(r.starts,e),s.returnEnd?0:n.length} 220 | let m={};function w(i,s){const a=s&&s[0];if(S+=i,null==a)return d(),0 221 | ;if("begin"===m.type&&"end"===s.type&&m.index===s.index&&""===a){ 222 | if(S+=t.slice(s.index,s.index+1),!o){const t=Error(`0 width match regex (${e})`) 223 | ;throw t.languageName=e,t.badRule=m.rule,t}return 1} 224 | if(m=s,"begin"===s.type)return(e=>{ 225 | const t=e[0],i=e.rule,r=new n(i),s=[i.__beforeBegin,i["on:begin"]] 226 | ;for(const n of s)if(n&&(n(e,r),r.isMatchIgnored))return f(t) 227 | ;return i.skip?S+=t:(i.excludeBegin&&(S+=t), 228 | d(),i.returnBegin||i.excludeBegin||(S=t)),h(i,e),i.returnBegin?0:t.length})(s) 229 | ;if("illegal"===s.type&&!r){ 230 | const e=Error('Illegal lexeme "'+a+'" for mode "'+(N.scope||"")+'"') 231 | ;throw e.mode=N,e}if("end"===s.type){const e=b(s);if(e!==ee)return e} 232 | if("illegal"===s.type&&""===a)return 1 233 | ;if(A>1e5&&A>3*s.index)throw Error("potential infinite loop, way more iterations than matches") 234 | ;return S+=a,a.length}const y=O(e) 235 | ;if(!y)throw K(a.replace("{}",e)),Error('Unknown language: "'+e+'"') 236 | ;const _=V(y);let v="",N=s||_;const k={},M=new g.__emitter(g);(()=>{const e=[] 237 | ;for(let t=N;t!==y;t=t.parent)t.scope&&e.unshift(t.scope) 238 | ;e.forEach((e=>M.openNode(e)))})();let S="",R=0,j=0,A=0,I=!1;try{ 239 | for(N.matcher.considerAll();;){ 240 | A++,I?I=!1:N.matcher.considerAll(),N.matcher.lastIndex=j 241 | ;const e=N.matcher.exec(t);if(!e)break;const n=w(t.substring(j,e.index),e) 242 | ;j=e.index+n} 243 | return w(t.substring(j)),M.closeAllNodes(),M.finalize(),v=M.toHTML(),{ 244 | language:e,value:v,relevance:R,illegal:!1,_emitter:M,_top:N}}catch(n){ 245 | if(n.message&&n.message.includes("Illegal"))return{language:e,value:Y(t), 246 | illegal:!0,relevance:0,_illegalBy:{message:n.message,index:j, 247 | con)for_c++_include" 248 | R"for_c++_include(text:t.slice(j-100,j+100),mode:n.mode,resultSoFar:v},_emitter:M};if(o)return{ 249 | language:e,value:Y(t),illegal:!1,relevance:0,errorRaised:n,_emitter:M,_top:N} 250 | ;throw n}}function x(e,t){t=t||g.languages||Object.keys(i);const n=(e=>{ 251 | const t={value:Y(e),illegal:!1,relevance:0,_top:c,_emitter:new g.__emitter(g)} 252 | ;return t._emitter.addText(e),t})(e),r=t.filter(O).filter(N).map((t=>E(t,e,!1))) 253 | ;r.unshift(n);const s=r.sort(((e,t)=>{ 254 | if(e.relevance!==t.relevance)return t.relevance-e.relevance 255 | ;if(e.language&&t.language){if(O(e.language).supersetOf===t.language)return 1 256 | ;if(O(t.language).supersetOf===e.language)return-1}return 0})),[o,a]=s,l=o 257 | ;return l.secondBest=a,l}function w(e){let t=null;const n=(e=>{ 258 | let t=e.className+" ";t+=e.parentNode?e.parentNode.className:"" 259 | ;const n=g.languageDetectRe.exec(t);if(n){const t=O(n[1]) 260 | ;return t||(W(a.replace("{}",n[1])), 261 | W("Falling back to no-highlight mode for this block.",e)),t?n[1]:"no-highlight"} 262 | return t.split(/\s+/).find((e=>b(e)||O(e)))})(e);if(b(n))return 263 | ;if(k("before:highlightElement",{el:e,language:n 264 | }),e.children.length>0&&(g.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."), 265 | console.warn("https://github.com/highlightjs/highlight.js/wiki/security"), 266 | console.warn("The element with unescaped HTML:"), 267 | console.warn(e)),g.throwUnescapedHTML))throw new J("One of your code blocks includes unescaped HTML.",e.innerHTML) 268 | ;t=e;const i=t.textContent,s=n?m(i,{language:n,ignoreIllegals:!0}):x(i) 269 | ;e.innerHTML=s.value,((e,t,n)=>{const i=t&&r[t]||n 270 | ;e.classList.add("hljs"),e.classList.add("language-"+i) 271 | })(e,n,s.language),e.result={language:s.language,re:s.relevance, 272 | relevance:s.relevance},s.secondBest&&(e.secondBest={ 273 | language:s.secondBest.language,relevance:s.secondBest.relevance 274 | }),k("after:highlightElement",{el:e,result:s,text:i})}let y=!1;function _(){ 275 | "loading"!==document.readyState?document.querySelectorAll(g.cssSelector).forEach(w):y=!0 276 | }function O(e){return e=(e||"").toLowerCase(),i[e]||i[r[e]]} 277 | function v(e,{languageName:t}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ 278 | r[e.toLowerCase()]=t}))}function N(e){const t=O(e) 279 | ;return t&&!t.disableAutodetect}function k(e,t){const n=e;s.forEach((e=>{ 280 | e[n]&&e[n](t)}))} 281 | "undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ 282 | y&&_()}),!1),Object.assign(t,{highlight:m,highlightAuto:x,highlightAll:_, 283 | highlightElement:w, 284 | highlightBlock:e=>(X("10.7.0","highlightBlock will be removed entirely in v12.0"), 285 | X("10.7.0","Please use highlightElement now."),w(e)),configure:e=>{g=Q(g,e)}, 286 | initHighlighting:()=>{ 287 | _(),X("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")}, 288 | initHighlightingOnLoad:()=>{ 289 | _(),X("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.") 290 | },registerLanguage:(e,n)=>{let r=null;try{r=n(t)}catch(t){ 291 | if(K("Language definition for '{}' could not be registered.".replace("{}",e)), 292 | !o)throw t;K(t),r=c} 293 | r.name||(r.name=e),i[e]=r,r.rawDefinition=n.bind(null,t),r.aliases&&v(r.aliases,{ 294 | languageName:e})},unregisterLanguage:e=>{delete i[e] 295 | ;for(const t of Object.keys(r))r[t]===e&&delete r[t]}, 296 | listLanguages:()=>Object.keys(i),getLanguage:O,registerAliases:v, 297 | autoDetection:N,inherit:Q,addPlugin:e=>{(e=>{ 298 | e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=t=>{ 299 | e["before:highlightBlock"](Object.assign({block:t.el},t)) 300 | }),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=t=>{ 301 | e["after:highlightBlock"](Object.assign({block:t.el},t))})})(e),s.push(e)} 302 | }),t.debugMode=()=>{o=!1},t.safeMode=()=>{o=!0 303 | },t.versionString="11.7.0",t.regex={concat:p,lookahead:d,either:f,optional:h, 304 | anyNumberOfTimes:u};for(const t in A)"object"==typeof A[t]&&e.exports(A[t]) 305 | ;return Object.assign(t,A),t})({});return te}() 306 | ;"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);/*! `swift` grammar compiled for Highlight.js 11.7.0 */ 307 | (()=>{var e=(()=>{"use strict";function e(e){ 308 | return e?"string"==typeof e?e:e.source:null}function a(e){return t("(?=",e,")")} 309 | function t(...a){return a.map((a=>e(a))).join("")}function n(...a){const t=(e=>{ 310 | const a=e[e.length-1] 311 | ;return"object"==typeof a&&a.constructor===Object?(e.splice(e.length-1,1),a):{} 312 | })(a);return"("+(t.capture?"":"?:")+a.map((a=>e(a))).join("|")+")"} 313 | const i=e=>t(/\b/,e,/\w$/.test(e)?/\b/:/\B/),s=["Protocol","Type"].map(i),u=["init","self"].map(i),c=["Any","Self"],r=["actor","any","associatedtype","async","await",/as\?/,/as!/,"as","break","case","catch","class","continue","convenience","default","defer","deinit","didSet","distributed","do","dynamic","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","isolated","nonisolated","lazy","let","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","postfix","precedencegroup","prefix",/private\(set\)/,"private","protected","const","cb","exec","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],o=["false","nil","true"],l=["assignment","associativity","higherThan","left","lowerThan","none","right"],m=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warn_unqualified_access","#warning"],p=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],d=n(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),F=n(d,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),b=t(d,F,"*"),h=n(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),f=n(h,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),w=t(h,f,"*"),y=t(/[A-Z]/,f,"*"),g=["autoclosure",t(/convention\(/,n("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",t(/objc\(/,w,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","resultBuilder","testable","UIApplicationMain","unknown","usableFromInline"],E=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"] 314 | ;return e=>{const d={match:/\s+/,relevance:0},h=e.COMMENT("/\\*","\\*/",{ 315 | contains:["self"]}),v=[e.C_LINE_COMMENT_MODE,h],A={match:[/\./,n(...s,...u)], 316 | className:{2:"keyword"}},N={match:t(/\./,n(...r)),relevance:0 317 | },C=r.filter((e=>"string"==typeof e)).concat(["_|0"]),D={variants:[{ 318 | className:"keyword", 319 | match:n(...r.filter((e=>"string"!=typeof e)).concat(c).map(i),...u)}]},k={ 320 | $pattern:n(/\b\w+/,/#\w+/),keyword:C.concat(m),literal:o},B=[A,N,D],_=[{ 321 | match:t(/\./,n(...p)),relevance:0},{className:"built_in", 322 | match:t(/\b/,n(...p),/(?=\()/)}],S={match:/->/,relevance:0},M=[S,{ 323 | className:"operator",relevance:0,variants:[{match:b},{match:`\\.(\\.|${F})+`}] 324 | }],x="([0-9a-fA-F]_*)+",I={className:"number",relevance:0,variants:[{ 325 | match:"\\b(([0-9]_*)+)(\\.(([0-9]_*)+))?([eE][+-]?(([0-9]_*)+))?\\b"},{ 326 | match:`\\b0x(${x})(\\.(${x}))?([pP][+-]?(([0-9]_*)+))?\\b`},{ 327 | match:/\b0o([0-7]_*)+\b/},{match:/\b0b([01]_*)+\b/}]},L=(e="")=>({ 328 | className:"subst",variants:[{match:t(/\\/,e,/[0\\tnr"']/)},{ 329 | match:t(/\\/,e,/u\{[0-9a-fA-F]{1,8}\}/)}]}),O=(e="")=>({className:"subst", 330 | match:t(/\\/,e,/[\t ]*(?:[\r\n]|\r\n)/)}),T=(e="")=>({className:"subst", 331 | label:"interpol",begin:t(/\\/,e,/\(/),end:/\)/}),$=(e="")=>({begin:t(e,/"""/), 332 | end:t(/"""/,e),contains:[L(e),O(e),T(e)]}),j=(e="")=>({begin:t(e,/"/), 333 | end:t(/"/,e),contains:[L(e),T(e)]}),P={className:"string", 334 | variants:[$(),$("#"),$("##"),$("###"),j(),j("#"),j("##"),j("###")]},K={ 335 | match:t(/`/,w,/`/)},z=[K,{className:"variable",match:/\$\d+/},{ 336 | className:"variable",match:`\\$${f}+`}],q=[{match:/(@|#(un)?)available/, 337 | className:"keyword",starts:{contains:[{begin:/\(/,end:/\)/,keywords:E, 338 | contains:[...M,I,P]}]}},{className:"keyword",match:t(/@/,n(...g))},{ 339 | className:"meta",match:t(/@/,w)}],U={match:a(/\b[A-Z]/),relevance:0,contains:[{ 340 | className:"type", 341 | match:t(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,f,"+") 342 | },{className:"type",match:y,relevance:0},{match:/[?!]+/,relevance:0},{ 343 | match:/\.\.\./,relevance:0},{match:t(/\s+&\s+/,a(y)),relevance:0}]},Z={ 344 | begin://,keywords:k,contains:[...v,...B,...q,S,U]};U.contains.push(Z) 345 | ;const V={begin:/\(/,end:/\)/,relevance:0,keywords:k,contains:["self",{ 346 | match:t(w,/\s*:/),keywords:"_|0",relevance:0 347 | },...v,...B,..._,...M,I,P,...z,...q,U]},W={begin://,contains:[...v,U] 348 | },G={begin:/\(/,end:/\)/,keywords:k,contains:[{ 349 | begin:n(a(t(w,/\s*:/)),a(t(w,/\s+/,w,/\s*:/))),end:/:/,relevance:0,contains:[{ 350 | className:"keyword",match:/\b_\b/},{className:"params",match:w}] 351 | },...v,...B,...M,I,P,...q,U,V],endsParent:!0,illegal:/["']/},R={ 352 | match:[/func/,/\s+/,n(K.match,w,b)],className:{1:"keyword",3:"title.function"}, 353 | contains:[W,G,d],illegal:[/\[/,/%/]},X={ 354 | match:[/\b(?:subscript|init[?!]?)/,/\s*(?=[<(])/],className:{1:"keyword"}, 355 | contains:[W,G,d],illegal:/\[|%/},H={match:[/operator/,/\s+/,b],className:{ 356 | 1:"keyword",3:"title"}},J={begin:[/precedencegroup/,/\s+/,y],className:{ 357 | 1:"keyword",3:"title"},contains:[U],keywords:[...l,...o],end:/}/} 358 | ;for(const e of P.variants){const a=e.contains.find((e=>"interpol"===e.label)) 359 | ;a.keywords=k;const t=[...B,..._,...M,I,P,...z];a.contains=[...t,{begin:/\(/, 360 | end:/\)/,contains:["self",...t]}]}return{name:"Swift",keywords:k, 361 | contains:[...v,R,X,{beginKeywords:"struct protocol class extension enum actor", 362 | end:"\\{",excludeEnd:!0,keywords:k,contains:[e.inherit(e.TITLE_MODE,{ 363 | className:"title.class",begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/}),...B] 364 | },H,J,{beginKeywords:"import",end:/$/,contains:[...v],relevance:0 365 | },...B,..._,...M,I,P,...z,...q,U,V]}}})();hljs.registerLanguage("swift",e)})();)for_c++_include" 366 | -------------------------------------------------------------------------------- /src/red4ext/line-numbers.min.js: -------------------------------------------------------------------------------- 1 | !function(r, o) { 2 | "use strict"; 3 | var e, i = "hljs-ln", l = "hljs-ln-line", h = "hljs-ln-code", s = "hljs-ln-numbers", c = "hljs-ln-n", m = "data-line-number", a = /\r\n|\r|\n/g; 4 | function u(e) { 5 | for (var n = e.toString(), t = e.anchorNode; "TD" !== t.nodeName; ) 6 | t = t.parentNode; 7 | for (var r = e.focusNode; "TD" !== r.nodeName; ) 8 | r = r.parentNode; 9 | var o = parseInt(t.dataset.lineNumber) 10 | , a = parseInt(r.dataset.lineNumber); 11 | if (o == a) 12 | return n; 13 | var i, l = t.textContent, s = r.textContent; 14 | for (a < o && (i = o, 15 | o = a, 16 | a = i, 17 | i = l, 18 | l = s, 19 | s = i); 0 !== n.indexOf(l); ) 20 | l = l.slice(1); 21 | for (; -1 === n.lastIndexOf(s); ) 22 | s = s.slice(0, -1); 23 | for (var c = l, u = function(e) { 24 | for (var n = e; "TABLE" !== n.nodeName; ) 25 | n = n.parentNode; 26 | return n 27 | }(t), d = o + 1; d < a; ++d) { 28 | var f = p('.{0}[{1}="{2}"]', [h, m, d]); 29 | c += "\n" + u.querySelector(f).textContent 30 | } 31 | return c += "\n" + s 32 | } 33 | function n(e) { 34 | try { 35 | var n = o.querySelectorAll("code.hljs,code.nohighlight"); 36 | for (var t in n) 37 | n.hasOwnProperty(t) && (n[t].classList.contains("nohljsln") || d(n[t], e)) 38 | } catch (e) { 39 | r.console.error("LineNumbers error: ", e) 40 | } 41 | } 42 | function d(e, n) { 43 | "object" == typeof e && r.setTimeout(function() { 44 | e.innerHTML = f(e, n) 45 | }, 0) 46 | } 47 | function f(e, n) { 48 | var t, r, o = (t = e, 49 | { 50 | singleLine: function(e) { 51 | return !!e.singleLine && e.singleLine 52 | }(r = (r = n) || {}), 53 | startFrom: function(e, n) { 54 | var t = 1; 55 | isFinite(n.startFrom) && (t = n.startFrom); 56 | var r = function(e, n) { 57 | return e.hasAttribute(n) ? e.getAttribute(n) : null 58 | }(e, "data-ln-start-from"); 59 | return null !== r && (t = function(e, n) { 60 | if (!e) 61 | return n; 62 | var t = Number(e); 63 | return isFinite(t) ? t : n 64 | }(r, 1)), 65 | t 66 | }(t, r) 67 | }); 68 | return function e(n) { 69 | var t = n.childNodes; 70 | for (var r in t) { 71 | var o; 72 | t.hasOwnProperty(r) && (o = t[r], 73 | 0 < (o.textContent.trim().match(a) || []).length && (0 < o.childNodes.length ? e(o) : v(o.parentNode))) 74 | } 75 | }(e), 76 | function(e, n) { 77 | var t = g(e); 78 | "" === t[t.length - 1].trim() && t.pop(); 79 | if (1 < t.length || n.singleLine) { 80 | for (var r = "", o = 0, a = t.length; o < a; o++) 81 | r += p('
{6}', [l, s, c, m, h, o + n.startFrom, 0 < t[o].length ? t[o] : " "]); 82 | return p('{1}
', [i, r]) 83 | } 84 | return e 85 | }(e.innerHTML, o) 86 | } 87 | function v(e) { 88 | var n = e.className; 89 | if (/hljs-/.test(n)) { 90 | for (var t = g(e.innerHTML), r = 0, o = ""; r < t.length; r++) { 91 | o += p('{1}\n', [n, 0 < t[r].length ? t[r] : " "]) 92 | } 93 | e.innerHTML = o.trim() 94 | } 95 | } 96 | function g(e) { 97 | return 0 === e.length ? [] : e.split(a) 98 | } 99 | function p(e, t) { 100 | return e.replace(/\{(\d+)\}/g, function(e, n) { 101 | return void 0 !== t[n] ? t[n] : e 102 | }) 103 | } 104 | r.hljs ? (r.hljs.initLineNumbersOnLoad = function(e) { 105 | "interactive" === o.readyState || "complete" === o.readyState ? n(e) : r.addEventListener("DOMContentLoaded", function() { 106 | n(e) 107 | }) 108 | } 109 | , 110 | r.hljs.lineNumbersBlock = d, 111 | r.hljs.lineNumbersValue = function(e, n) { 112 | if ("string" != typeof e) 113 | return; 114 | var t = document.createElement("code"); 115 | return t.innerHTML = e, 116 | f(t, n) 117 | } 118 | , 119 | (e = o.createElement("style")).type = "text/css", 120 | e.innerHTML = p(".{0}{border-collapse:collapse}.{0} td{padding:0}.{1}:before{content:attr({2})}", [i, c, m]), 121 | o.getElementsByTagName("head")[0].appendChild(e)) : r.console.error("highlight.js not detected!"), 122 | document.addEventListener("copy", function(e) { 123 | var n, t = window.getSelection(); 124 | !function(e) { 125 | for (var n = e; n; ) { 126 | if (n.className && -1 !== n.className.indexOf("hljs-ln-code")) 127 | return 1; 128 | n = n.parentNode 129 | } 130 | }(t.anchorNode) || (n = -1 !== window.navigator.userAgent.indexOf("Edge") ? u(t) : t.toString(), 131 | e.clipboardData.setData("text/plain", n), 132 | e.preventDefault()) 133 | }) 134 | }(window, document); 135 | -------------------------------------------------------------------------------- /src/red4ext/line-numbers.min.js.frag: -------------------------------------------------------------------------------- 1 | R"for_c++_include(!function(r, o) { 2 | "use strict"; 3 | var e, i = "hljs-ln", l = "hljs-ln-line", h = "hljs-ln-code", s = "hljs-ln-numbers", c = "hljs-ln-n", m = "data-line-number", a = /\r\n|\r|\n/g; 4 | function u(e) { 5 | for (var n = e.toString(), t = e.anchorNode; "TD" !== t.nodeName; ) 6 | t = t.parentNode; 7 | for (var r = e.focusNode; "TD" !== r.nodeName; ) 8 | r = r.parentNode; 9 | var o = parseInt(t.dataset.lineNumber) 10 | , a = parseInt(r.dataset.lineNumber); 11 | if (o == a) 12 | return n; 13 | var i, l = t.textContent, s = r.textContent; 14 | for (a < o && (i = o, 15 | o = a, 16 | a = i, 17 | i = l, 18 | l = s, 19 | s = i); 0 !== n.indexOf(l); ) 20 | l = l.slice(1); 21 | for (; -1 === n.lastIndexOf(s); ) 22 | s = s.slice(0, -1); 23 | for (var c = l, u = function(e) { 24 | for (var n = e; "TABLE" !== n.nodeName; ) 25 | n = n.parentNode; 26 | return n 27 | }(t), d = o + 1; d < a; ++d) { 28 | var f = p('.{0}[{1}="{2}"]', [h, m, d]); 29 | c += "\n" + u.querySelector(f).textContent 30 | } 31 | return c += "\n" + s 32 | } 33 | function n(e) { 34 | try { 35 | var n = o.querySelectorAll("code.hljs,code.nohighlight"); 36 | for (var t in n) 37 | n.hasOwnProperty(t) && (n[t].classList.contains("nohljsln") || d(n[t], e)) 38 | } catch (e) { 39 | r.console.error("LineNumbers error: ", e) 40 | } 41 | } 42 | function d(e, n) { 43 | "object" == typeof e && r.setTimeout(function() { 44 | e.innerHTML = f(e, n) 45 | }, 0) 46 | } 47 | function f(e, n) { 48 | var t, r, o = (t = e, 49 | { 50 | singleLine: function(e) { 51 | return !!e.singleLine && e.singleLine 52 | }(r = (r = n) || {}), 53 | startFrom: function(e, n) { 54 | var t = 1; 55 | isFinite(n.startFrom) && (t = n.startFrom); 56 | var r = function(e, n) { 57 | return e.hasAttribute(n) ? e.getAttribute(n) : null 58 | }(e, "data-ln-start-from"); 59 | return null !== r && (t = function(e, n) { 60 | if (!e) 61 | return n; 62 | var t = Number(e); 63 | return isFinite(t) ? t : n 64 | }(r, 1)), 65 | t 66 | }(t, r) 67 | }); 68 | return function e(n) { 69 | var t = n.childNodes; 70 | for (var r in t) { 71 | var o; 72 | t.hasOwnProperty(r) && (o = t[r], 73 | 0 < (o.textContent.trim().match(a) || []).length && (0 < o.childNodes.length ? e(o) : v(o.parentNode))) 74 | } 75 | }(e), 76 | function(e, n) { 77 | var t = g(e); 78 | "" === t[t.length - 1].trim() && t.pop(); 79 | if (1 < t.length || n.singleLine) { 80 | for (var r = "", o = 0, a = t.length; o < a; o++) 81 | r += p('
{6}', [l, s, c, m, h, o + n.startFrom, 0 < t[o].length ? t[o] : " "]); 82 | return p('{1}
', [i, r]) 83 | } 84 | return e 85 | }(e.innerHTML, o) 86 | } 87 | function v(e) { 88 | var n = e.className; 89 | if (/hljs-/.test(n)) { 90 | for (var t = g(e.innerHTML), r = 0, o = ""; r < t.length; r++) { 91 | o += p('{1}\n', [n, 0 < t[r].length ? t[r] : " "]) 92 | } 93 | e.innerHTML = o.trim() 94 | } 95 | } 96 | function g(e) { 97 | return 0 === e.length ? [] : e.split(a) 98 | } 99 | function p(e, t) { 100 | return e.replace(/\{(\d+)\}/g, function(e, n) { 101 | return void 0 !== t[n] ? t[n] : e 102 | }) 103 | } 104 | r.hljs ? (r.hljs.initLineNumbersOnLoad = function(e) { 105 | "interactive" === o.readyState || "complete" === o.readyState ? n(e) : r.addEventListener("DOMContentLoaded", function() { 106 | n(e) 107 | }) 108 | } 109 | , 110 | r.hljs.lineNumbersBlock = d, 111 | r.hljs.lineNumbersValue = function(e, n) { 112 | if ("string" != typeof e) 113 | return; 114 | var t = document.createElement("code"); 115 | return t.innerHTML = e, 116 | f(t, n) 117 | } 118 | , 119 | (e = o.createElement("style")).type = "text/css", 120 | e.innerHTML = p(".{0}{border-collapse:collapse}.{0} td{padding:0}.{1}:before{content:attr({2})}", [i, c, m]), 121 | o.getElementsByTagName("head")[0].appendChild(e)) : r.console.error("highlight.js not detected!"), 122 | document.addEventListener("copy", function(e) { 123 | var n, t = window.getSelection(); 124 | !function(e) { 125 | for (var n = e; n; ) { 126 | if (n.className && -1 !== n.className.indexOf("hljs-ln-code")) 127 | return 1; 128 | n = n.parentNode 129 | } 130 | }(t.anchorNode) || (n = -1 !== window.navigator.userAgent.indexOf("Edge") ? u(t) : t.toString(), 131 | e.clipboardData.setData("text/plain", n), 132 | e.preventDefault()) 133 | }) 134 | }(window, document); 135 | )for_c++_include" 136 | -------------------------------------------------------------------------------- /src/red4ext/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /src/red4ext/stdafx.cpp: -------------------------------------------------------------------------------- 1 | #include "stdafx.hpp" 2 | -------------------------------------------------------------------------------- /src/red4ext/stdafx.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | #include 10 | #include 11 | #include 12 | 13 | #include 14 | #include 15 | -------------------------------------------------------------------------------- /src/red4ext/style.css: -------------------------------------------------------------------------------- 1 | .source { 2 | background-color: #282b2e; 3 | padding: 0.5em 0em; 4 | border-radius: 2px; 5 | } 6 | 7 | a { 8 | color: #cc7832; 9 | } 10 | 11 | pre { 12 | background-color: #282b2e; 13 | padding: 0em 0.5em; 14 | } 15 | 16 | pre.last-line { 17 | background-color: hsla(0, 87%, 63%, 0.25); 18 | } 19 | 20 | pre code.hljs { 21 | display: block; 22 | overflow-x: auto; 23 | } 24 | 25 | pre code.hljs.indent { 26 | padding-left: 5em; 27 | text-indent: -5em; 28 | } 29 | 30 | .hljs { 31 | color: #a9b7c6; 32 | } 33 | 34 | .hljs-bullet,.hljs-literal,.hljs-number,.hljs-symbol { 35 | color: #6897bb 36 | } 37 | 38 | .hljs-deletion,.hljs-keyword,.hljs-selector-tag { 39 | color: #cc7832 40 | } 41 | 42 | .hljs-link,.hljs-template-variable,.hljs-variable { 43 | color: #629755 44 | } 45 | 46 | .hljs-comment,.hljs-quote { 47 | color: grey 48 | } 49 | 50 | .hljs-meta { 51 | color: #bbb529 52 | } 53 | 54 | .hljs-addition,.hljs-attribute,.hljs-string { 55 | color: #6a8759 56 | } 57 | 58 | .hljs-title { 59 | color: #bbb529 60 | } 61 | 62 | .hljs-section,.hljs-type { 63 | color: #ffc66d 64 | } 65 | 66 | .hljs-name,.hljs-selector-class,.hljs-selector-id { 67 | color: #e8bf6a 68 | } 69 | 70 | .hljs-emphasis { 71 | font-style: italic 72 | } 73 | 74 | .hljs-strong { 75 | font-weight: 700 76 | } 77 | 78 | body { 79 | background: #1a1c1e; 80 | color: #a9b7c6; 81 | font-family: monospace; 82 | display: flex; 83 | gap: 8px; 84 | flex-direction: column; 85 | } 86 | 87 | .thread { 88 | display: flex; 89 | gap: 8px; 90 | flex-direction: column; 91 | } 92 | 93 | h1, h2, h3, h4, h5, p { 94 | margin: 0px; 95 | } 96 | 97 | pre {-moz-tab-size: 4;} 98 | pre { 99 | tab-size: 4; 100 | white-space: pre-wrap; 101 | margin: 0px; 102 | } 103 | 104 | details pre { 105 | margin-top: 0px; 106 | } 107 | 108 | .call { 109 | background: #42464a; 110 | border-radius: 5px; 111 | padding: .8em 0em; 112 | color:#eaeaea; 113 | display: flex; 114 | gap: 0.5em; 115 | flex-direction: column; 116 | border: #42464a solid 1px; 117 | } 118 | 119 | pre code { 120 | font-size: 12px; 121 | } 122 | 123 | .call h2, .call .call-name { 124 | font-family: monospace; 125 | font-size: 12px; 126 | margin: 0em 1em; 127 | } 128 | 129 | .call .call { 130 | /* background: #ddd; */ 131 | /* border: 1px solid #bbb; */ 132 | margin: 0.5em; 133 | padding: 0.5em 0em; 134 | } 135 | 136 | .hljs-ln-numbers { 137 | -webkit-touch-callout: none; 138 | -webkit-user-select: none; 139 | -khtml-user-select: none; 140 | -moz-user-select: none; 141 | -ms-user-select: none; 142 | user-select: none; 143 | 144 | text-align: right; 145 | color: #666; 146 | } 147 | 148 | .hljs-ln-n { 149 | padding-right: 5px; 150 | margin-right: 5px; 151 | } 152 | 153 | .hljs-ln-code { 154 | padding-left: 10px; 155 | } 156 | 157 | summary { 158 | font-weight: 800; 159 | font-size: 16px; 160 | } 161 | 162 | summary:hover { 163 | cursor: pointer; 164 | } -------------------------------------------------------------------------------- /src/red4ext/style.css.frag: -------------------------------------------------------------------------------- 1 | R"for_c++_include(.source { 2 | background-color: #282b2e; 3 | padding: 0.5em 0em; 4 | border-radius: 2px; 5 | } 6 | 7 | a { 8 | color: #cc7832; 9 | } 10 | 11 | pre { 12 | background-color: #282b2e; 13 | padding: 0em 0.5em; 14 | } 15 | 16 | pre.last-line { 17 | background-color: hsla(0, 87%, 63%, 0.25); 18 | } 19 | 20 | pre code.hljs { 21 | display: block; 22 | overflow-x: auto; 23 | } 24 | 25 | pre code.hljs.indent { 26 | padding-left: 5em; 27 | text-indent: -5em; 28 | } 29 | 30 | .hljs { 31 | color: #a9b7c6; 32 | } 33 | 34 | .hljs-bullet,.hljs-literal,.hljs-number,.hljs-symbol { 35 | color: #6897bb 36 | } 37 | 38 | .hljs-deletion,.hljs-keyword,.hljs-selector-tag { 39 | color: #cc7832 40 | } 41 | 42 | .hljs-link,.hljs-template-variable,.hljs-variable { 43 | color: #629755 44 | } 45 | 46 | .hljs-comment,.hljs-quote { 47 | color: grey 48 | } 49 | 50 | .hljs-meta { 51 | color: #bbb529 52 | } 53 | 54 | .hljs-addition,.hljs-attribute,.hljs-string { 55 | color: #6a8759 56 | } 57 | 58 | .hljs-title { 59 | color: #bbb529 60 | } 61 | 62 | .hljs-section,.hljs-type { 63 | color: #ffc66d 64 | } 65 | 66 | .hljs-name,.hljs-selector-class,.hljs-selector-id { 67 | color: #e8bf6a 68 | } 69 | 70 | .hljs-emphasis { 71 | font-style: italic 72 | } 73 | 74 | .hljs-strong { 75 | font-weight: 700 76 | } 77 | 78 | body { 79 | background: #1a1c1e; 80 | color: #a9b7c6; 81 | font-family: monospace; 82 | display: flex; 83 | gap: 8px; 84 | flex-direction: column; 85 | } 86 | 87 | .thread { 88 | display: flex; 89 | gap: 8px; 90 | flex-direction: column; 91 | } 92 | 93 | h1, h2, h3, h4, h5, p { 94 | margin: 0px; 95 | } 96 | 97 | pre {-moz-tab-size: 4;} 98 | pre { 99 | tab-size: 4; 100 | white-space: pre-wrap; 101 | margin: 0px; 102 | } 103 | 104 | details pre { 105 | margin-top: 0px; 106 | } 107 | 108 | .call { 109 | background: #42464a; 110 | border-radius: 5px; 111 | padding: .8em 0em; 112 | color:#eaeaea; 113 | display: flex; 114 | gap: 0.5em; 115 | flex-direction: column; 116 | border: #42464a solid 1px; 117 | } 118 | 119 | pre code { 120 | font-size: 12px; 121 | } 122 | 123 | .call h2, .call .call-name { 124 | font-family: monospace; 125 | font-size: 12px; 126 | margin: 0em 1em; 127 | } 128 | 129 | .call .call { 130 | /* background: #ddd; */ 131 | /* border: 1px solid #bbb; */ 132 | margin: 0.5em; 133 | padding: 0.5em 0em; 134 | } 135 | 136 | .hljs-ln-numbers { 137 | -webkit-touch-callout: none; 138 | -webkit-user-select: none; 139 | -khtml-user-select: none; 140 | -moz-user-select: none; 141 | -ms-user-select: none; 142 | user-select: none; 143 | 144 | text-align: right; 145 | color: #666; 146 | } 147 | 148 | .hljs-ln-n { 149 | padding-right: 5px; 150 | margin-right: 5px; 151 | } 152 | 153 | .hljs-ln-code { 154 | padding-left: 10px; 155 | } 156 | 157 | summary { 158 | font-weight: 800; 159 | font-size: 16px; 160 | } 161 | 162 | summary:hover { 163 | cursor: pointer; 164 | })for_c++_include" 165 | --------------------------------------------------------------------------------