[
  {
    "path": ".gitattributes",
    "content": "###############################################################################\n# Set default behavior to automatically normalize line endings.\n###############################################################################\n* text=auto\n\n###############################################################################\n# Set default behavior for command prompt diff.\n#\n# This is need for earlier builds of msysgit that does not have it on by\n# default for csharp files.\n# Note: This is only used by command line\n###############################################################################\n#*.cs     diff=csharp\n\n###############################################################################\n# Set the merge driver for project and solution files\n#\n# Merging from the command prompt will add diff markers to the files if there\n# are conflicts (Merging from VS is not affected by the settings below, in VS\n# the diff markers are never inserted). Diff markers may cause the following \n# file extensions to fail to load in VS. An alternative would be to treat\n# these files as binary and thus will always conflict and require user\n# intervention with every merge. To do so, just uncomment the entries below\n###############################################################################\n#*.sln       merge=binary\n#*.csproj    merge=binary\n#*.vbproj    merge=binary\n#*.vcxproj   merge=binary\n#*.vcproj    merge=binary\n#*.dbproj    merge=binary\n#*.fsproj    merge=binary\n#*.lsproj    merge=binary\n#*.wixproj   merge=binary\n#*.modelproj merge=binary\n#*.sqlproj   merge=binary\n#*.wwaproj   merge=binary\n\n###############################################################################\n# behavior for image files\n#\n# image files are treated as binary by default.\n###############################################################################\n#*.jpg   binary\n#*.png   binary\n#*.gif   binary\n\n###############################################################################\n# diff behavior for common document formats\n# \n# Convert binary document formats to text before diffing them. This feature\n# is only available from the command line. Turn it on by uncommenting the \n# entries below.\n###############################################################################\n#*.doc   diff=astextplain\n#*.DOC   diff=astextplain\n#*.docx  diff=astextplain\n#*.DOCX  diff=astextplain\n#*.dot   diff=astextplain\n#*.DOT   diff=astextplain\n#*.pdf   diff=astextplain\n#*.PDF   diff=astextplain\n#*.rtf   diff=astextplain\n#*.RTF   diff=astextplain\n"
  },
  {
    "path": ".github/CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, religion, or sexual identity\nand orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n* Demonstrating empathy and kindness toward other people\n* Being respectful of differing opinions, viewpoints, and experiences\n* Giving and gracefully accepting constructive feedback\n* Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n* Focusing on what is best not just for us as individuals, but for the\n  overall community\n\nExamples of unacceptable behavior include:\n\n* The use of sexualized language or imagery, and sexual attention or\n  advances of any kind\n* Trolling, insulting or derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or email\n  address, without their explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n## Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official e-mail address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement at\n.\nAll complaints will be reviewed and investigated promptly and fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n## Enforcement Guidelines\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n### 1. Correction\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n### 2. Warning\n\n**Community Impact**: A violation through a single incident or series\nof actions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or\npermanent ban.\n\n### 3. Temporary Ban\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n### 4. Permanent Ban\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior,  harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within\nthe community.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 2.0, available at\nhttps://www.contributor-covenant.org/version/2/0/code_of_conduct.html.\n\nCommunity Impact Guidelines were inspired by [Mozilla's code of conduct\nenforcement ladder](https://github.com/mozilla/diversity).\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see the FAQ at\nhttps://www.contributor-covenant.org/faq. Translations are available at\nhttps://www.contributor-covenant.org/translations.\n"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "Please, feel free to contribute. Especially if you own model differnt from G14 2022 and can offer extra features or support.\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\ncustom: https://g-helper.com/support\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "content": "name: Bug Report\ndescription: Something isn't working correctly\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Thanks for taking the time to fill out this bug report. The more information you provide, the easier it will be for me to fix it!\n  - type: checkboxes\n    id: rules\n    attributes:\n      label: Rules\n      options:\n        - label: I made myself familiar with the <a href='https://github.com/seerge/g-helper?tab=readme-ov-file'>Readme</a>, <a href='https://github.com/seerge/g-helper/wiki/FAQ'>FAQ</a> and <a href='https://github.com/seerge/g-helper/wiki/Troubleshooting'>Troubleshooting</a>.\n          required: true\n        - label: I understand that, if insufficient information or no app logs will be provided, my issue will be closed without an answer.\n          required: true\n    validations:\n      required: true\n  - type: textarea\n    id: description\n    attributes:\n      label: What's wrong?\n      description: Provide detailed description of what is wrong or does not work as expected.\n      placeholder: Provide detailed description of what is wrong or does not work as expected.\n    validations:\n      required: true\n  - type: textarea\n    id: reproduce\n    attributes:\n      label: How to reproduce the bug?\n      description: Describe how to reproduce the behavior. Be as specific as possible and provide as many details as possible.\n      placeholder: |\n        1. Go to '...'\n        2. Click on '....'\n        3. Scroll down to '....'\n        4. See error\n    validations:\n      required: true\n  - type: textarea\n    id: logs\n    attributes:\n      label: Logs\n      placeholder: Please drag and drop complete log file from ``%APPDATA%\\GHelper\\log.txt``\n      description: Please drag and drop complete log file from ``%APPDATA%\\GHelper\\log.txt``\n    validations:\n      required: true\n  - type: input\n    id: device\n    attributes:\n      label: Device and Model\n      description: Which laptop do you use?\n      placeholder: e.g. Asus Zephyrus G14 GA404RK\n    validations:\n      required: true\n  - type: textarea\n    id: additional\n    attributes:\n      label: Additional information. \n      description: If applicable, add screenshots or other relevant information to help explain your problem.\n  - type: dropdown\n    id: armoury\n    attributes:\n      label: Armoury Crate\n      description: Do you have Armoury Crate installed?\n      options:\n        - Uninstalled\n        - Installed\n        - Never installed\n      default: 0   \n  - type: input\n    id: asus\n    attributes:\n      label: Asus Services\n      description: How many Asus services do you have running (check ``Extra`` section in G-Helper)?\n      placeholder: e.g. None\n  - type: input\n    id: version\n    attributes:\n      label: Version\n      description: G-Helper version?\n      placeholder: e.g. 0.146\n  - type: input\n    id: os\n    attributes:\n      label: OS\n      description: Which operating system do you use?\n      placeholder: e.g. Windows 11 21H2     \n          \n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "content": "name: Feature request\ndescription: Suggest an idea for this project\nbody:\n  - type: checkboxes\n    id: rules\n    attributes:\n      label: Rules\n      options:\n        - label: I made myself familiar with the <a href='https://github.com/seerge/g-helper?tab=readme-ov-file'>Readme</a>, <a href='https://github.com/seerge/g-helper/wiki/FAQ'>FAQ</a> and <a href='https://github.com/seerge/g-helper/wiki/Troubleshooting'>Troubleshooting</a>.\n          required: true\n        - label: I understand that, if insufficient information will be provided, my issue will be closed without an answer.\n          required: true\n    validations:\n      required: true\n  - type: textarea\n    id: description\n    attributes:\n      label: Is your feature request related to a problem? Please describe\n      placeholder: A clear and concise description of what the problem is.\n    validations:\n      required: true\n  - type: textarea\n    id: solution\n    attributes:\n      label: Describe the solution you'd like\n      placeholder: A clear and concise description of what you want to happen.\n    validations:\n      required: true\n  - type: textarea\n    id: alternatives\n    attributes:\n      label: Describe alternatives you've considered\n      placeholder: A clear and concise description of any alternative solutions or features you've considered.\n  - type: input\n    id: device\n    attributes:\n      label: Device and Model\n      description: Which laptop do you use?\n      placeholder: e.g. Asus Zephyrus G14 GA404RK\n    validations:\n      required: true\n  - type: textarea\n    id: additional\n    attributes:\n      label: Additional information. \n      placeholder: If applicable, add screenshots or other relevant information          \n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/peripherals_request.yml",
    "content": "name: Mouse and other peripherals support request\ndescription: Request support for a new device\nbody:\n  - type: input\n    id: device\n    attributes:\n      label: Mouse / peripheral model and version\n      placeholder: e.g. Asus TUF M4 Wireless\n    validations:\n      required: true\n  - type: textarea\n    id: description\n    attributes:\n      label: Armoury Crate Screenshots\n      description: Connect your mouse to Armoury Crate (maybe in a VM if you do not want to install it on your PC) and upload here screenshots of all the pages for your mouse for settings.\n      placeholder: Drag and drop screenshots here\n    validations:\n      required: true\n  - type: textarea\n    id: solution\n    attributes:\n      label: USB Details\n      description: Also, please use <a href=https://www.uwe-sieber.de/usbtreeview.html>USB Tree View</a> and send the text (especially the block with all the child devices) of the mouse. <img width=\"1168\" alt=\"image\" src=\"https://github.com/seerge/g-helper/assets/12786283/8b51dd4d-c9fe-444e-b1b1-415175e10555\">\n      placeholder: USB Tree View details\n    validations:\n      required: true\n  - type: textarea\n    id: additional\n    attributes:\n      label: Additional information. \n      placeholder: If applicable, add screenshots or other relevant information          \n"
  },
  {
    "path": ".github/SECURITY.md",
    "content": "# Security Policy\n\n## Supported Versions\n\n| Version | Supported          |\n| ------- | ------------------ |\n| 0.200+   | :white_check_mark: |\n| < 0.200  | :x:                |\n\n## Reporting a Vulnerability\n\nUse this section to tell people how to report a vulnerability.\n\nTell them where to go, how often they can expect to get an update on a\nreported vulnerability, what to expect if the vulnerability is accepted or\ndeclined, etc.\n"
  },
  {
    "path": ".github/workflows/build.yml",
    "content": "name: Build\n\non:\n  push:\n    branches: [ main ]\n  pull_request:\n    branches: [ main ]\n  workflow_dispatch:\n\npermissions:\n  contents: read\n\njobs:\n  build:\n    runs-on: windows-2022\n    steps:\n    - uses: actions/checkout@v4\n    - name: Setup dotnet\n      uses: actions/setup-dotnet@v4\n      with:\n        dotnet-version: '8.0.x'\n    - name: Build\n      run: |\n        dotnet build app/GHelper.sln\n"
  },
  {
    "path": ".github/workflows/codeql.yml",
    "content": "name: CodeQL\n\non:\n  push:\n    branches: [ main ]\n  pull_request:\n    branches: [ main ]\n  schedule:\n  - cron: '34 18 * * 3'\n\npermissions:\n  actions: read\n  contents: read\n  security-events: write\n\njobs:\n  codeql:\n    runs-on: windows-2022\n    steps:\n    - uses: actions/checkout@v4\n    - name: Initialize CodeQL\n      uses: github/codeql-action/init@v3\n      with:\n        languages: c#\n    - name: Autobuild\n      uses: github/codeql-action/autobuild@v3\n    - name: Analyze\n      uses: github/codeql-action/analyze@v3\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: Release\n\non:\n  release:\n    types: [ published ]\n  workflow_dispatch:\n\npermissions:\n  contents: write\n  id-token: write\n  attestations: write\n\njobs:\n  release:\n    runs-on: windows-2022\n    steps:\n    - uses: actions/checkout@v4\n    - name: Setup dotnet\n      uses: actions/setup-dotnet@v4\n      with:\n        dotnet-version: '8.0.x'\n\n    - name: Publish\n      run: |\n        dotnet publish app/GHelper.sln --configuration Release --runtime win-x64 -p:PublishSingleFile=true --no-self-contained\n\n    - name: Upload unsigned EXE\n      id: upload-unsigned\n      uses: actions/upload-artifact@v4\n      with:\n        path: app/bin/x64/Release/net8.0-windows/win-x64/publish/GHelper.exe\n\n    - id: sign-exe\n      uses: signpath/github-action-submit-signing-request@v1.1\n      with:\n        api-token: ${{ secrets.SIGNPATH_API_TOKEN }}\n        organization-id: ${{ secrets.SIGNPATH_ORG_ID }}\n        project-slug: ${{ secrets.SIGNPATH_PROJECT }}\n        signing-policy-slug: ${{ secrets.SIGNPATH_POLICY }}\n        github-artifact-id: ${{ steps.upload-unsigned.outputs.artifact-id }}\n        wait-for-completion: true\n        output-artifact-directory: './signed'\n\n    - name: Create ZIP from signed EXE\n      run: powershell Compress-Archive ./signed/GHelper.exe ./signed/GHelper.zip\n\n    - name: Upload signed EXE and ZIP\n      env:\n        GH_TOKEN: ${{ github.token }}\n      run: |\n        gh release upload \"${{ github.event.release.tag_name }}\" ./signed/GHelper.exe ./signed/GHelper.zip --clobber\n    - name: Generate SLSA build provenance attestation\n      uses: actions/attest-build-provenance@v2\n      with:\n        subject-path: |\n          ./signed/GHelper.exe\n          ./signed/GHelper.zip\n"
  },
  {
    "path": ".gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore\n\n# User-specific files\n*.rsuser\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Mono auto generated files\nmono_crash.*\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\n[Ww][Ii][Nn]32/\n[Aa][Rr][Mm]/\n[Aa][Rr][Mm]64/\nbld/\n[Bb]in/\n[Oo]bj/\n[Oo]ut/\n[Ll]og/\n[Ll]ogs/\n\n# Visual Studio 2015/2017 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# Visual Studio 2017 auto generated files\nGenerated\\ Files/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUnit\n*.VisualState.xml\nTestResult.xml\nnunit-*.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# Benchmark Results\nBenchmarkDotNet.Artifacts/\n\n# .NET Core\nproject.lock.json\nproject.fragment.lock.json\nartifacts/\n\n# ASP.NET Scaffolding\nScaffoldingReadMe.txt\n\n# StyleCop\nStyleCopReport.xml\n\n# Files built by Visual Studio\n*_i.c\n*_p.c\n*_h.h\n*.ilk\n*.meta\n*.obj\n*.iobj\n*.pch\n*.pdb\n*.ipdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*_wpftmp.csproj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# Visual Studio Trace Files\n*.e2e\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# AxoCover is a Code Coverage Tool\n.axoCover/*\n!.axoCover/settings.json\n\n# Coverlet is a free, cross platform Code Coverage Tool\ncoverage*.json\ncoverage*.xml\ncoverage*.info\n\n# Visual Studio code coverage results\n*.coverage\n*.coveragexml\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\nnCrunchTemp_*\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# Note: Comment the next line if you want to checkin your web deploy settings,\n# but database connection strings (with potential passwords) will be unencrypted\n*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\n\n# NuGet Packages\n*.nupkg\n# NuGet Symbol Packages\n*.snupkg\n# The packages folder can be ignored because of Package Restore\n**/[Pp]ackages/*\n# except build/, which is used as an MSBuild target.\n!**/[Pp]ackages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/[Pp]ackages/repositories.config\n# NuGet v3's project.json files produces more ignorable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\n*.appx\n*.appxbundle\n*.appxupload\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!?*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.pfx\n*.publishsettings\norleans.codegen.cs\n\n# Including strong name files can present a security risk\n# (https://github.com/github/gitignore/pull/2483#issue-259490424)\n#*.snk\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\nServiceFabricBackup/\n*.rptproj.bak\n\n# SQL Server files\n*.mdf\n*.ldf\n*.ndf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n*.rptproj.rsuser\n*- [Bb]ackup.rdl\n*- [Bb]ackup ([0-9]).rdl\n*- [Bb]ackup ([0-9][0-9]).rdl\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# GhostDoc plugin setting file\n*.GhostDoc.xml\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\nnode_modules/\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)\n*.vbw\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# CodeRush personal settings\n.cr/personal\n\n# Python Tools for Visual Studio (PTVS)\n__pycache__/\n*.pyc\n\n# Cake - Uncomment if you are using it\n# tools/**\n# !tools/packages.config\n\n# Tabs Studio\n*.tss\n\n# Telerik's JustMock configuration file\n*.jmconfig\n\n# BizTalk build output\n*.btp.cs\n*.btm.cs\n*.odx.cs\n*.xsd.cs\n\n# OpenCover UI analysis results\nOpenCover/\n\n# Azure Stream Analytics local run output\nASALocalRun/\n\n# MSBuild Binary and Structured Log\n*.binlog\n\n# NVidia Nsight GPU debugger configuration file\n*.nvuser\n\n# MFractors (Xamarin productivity tool) working folder\n.mfractor/\n\n# Local History for Visual Studio\n.localhistory/\n\n# BeatPulse healthcheck temp database\nhealthchecksdb\n\n# Backup folder for Package Reference Convert tool in Visual Studio 2017\nMigrationBackup/\n\n# Ionide (cross platform F# VS Code tools) working folder\n.ionide/\n\n# Fody - auto-generated XML schema\nFodyWeavers.xsd"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "app/.editorconfig",
    "content": "﻿[*.{cs,vb}]\n\n# IDE0017: Simplify object initialization\ndotnet_style_object_initializer = true\n"
  },
  {
    "path": "app/Ally/AllyControl.cs",
    "content": "﻿using GHelper.Gpu.AMD;\nusing GHelper.Helpers;\nusing GHelper.Input;\nusing GHelper.Mode;\nusing GHelper.USB;\nusing HidSharp;\nusing System.Text;\n\n\n\nnamespace GHelper.Ally\n{\n\n    public enum ControllerMode : int\n    {\n        Auto = 0,\n        Gamepad = 1,\n        WASD = 2,\n        Mouse = 3,\n        Skip = -1,\n    }\n\n    public enum BindingZone : byte\n    {\n        DPadUpDown = 1,\n        DPadLeftRight = 2,\n        StickClick = 3,\n        Bumper = 4,\n        AB = 5,\n        XY = 6,\n        ViewMenu = 7,\n        M1M2 = 8,\n        Trigger = 9\n    }\n\n    public class AllyControl\n    {\n        static System.Timers.Timer timer = default!;\n        static AmdGpuControl amdControl = new AmdGpuControl();\n\n        SettingsForm settings;\n\n        static ControllerMode _mode = ControllerMode.Auto;\n        static ControllerMode _applyMode = ControllerMode.Mouse;\n\n        static int _autoCount = 0;\n\n        static int _upCount = 0;\n        static int _downCount = 0;\n\n        static int tdpMin = 6;\n        static int tdpStable = tdpMin;\n        static int tdpCurrent = -1;\n\n        static bool autoTDP = false;\n\n        static int fpsLimit = -1;\n\n\n        public const string BindA = \"01-01\";\n        public const string BindB = \"01-02\";\n        public const string BindX = \"01-03\";\n        public const string BindY = \"01-04\";\n        public const string BindLB = \"01-05\";\n        public const string BindRB = \"01-06\";\n        public const string BindLS = \"01-07\";\n        public const string BindRS = \"01-08\";\n        public const string BindDU = \"01-09\";\n        public const string BindDD = \"01-0A\";\n        public const string BindDL = \"01-0B\";\n        public const string BindDR = \"01-0C\";\n        public const string BindVB = \"01-11\";\n        public const string BindMB = \"01-12\";\n        public const string BindM1 = \"02-8F\";\n        public const string BindM2 = \"02-8E\";\n        public const string BindLT = \"01-0D\";\n        public const string BindRT = \"01-0E\";\n        public const string BindXB = \"01-13\";\n\n        public const string BindMouseL = \"03-01\";\n        public const string BindMouseR = \"03-02\";\n\n        public const string BindKBU = \"02-98\";\n        public const string BindKBD = \"02-99\";\n        public const string BindKBL = \"02-9A\";\n        public const string BindKBR = \"02-9B\";\n\n        public const string BindTab = \"02-0D\";\n        public const string BindEnter = \"02-5A\";\n        public const string BindBack = \"02-66\";\n        public const string BindEsc = \"02-76\";\n\n        public const string BindPgU = \"02-96\";\n        public const string BindPgD = \"02-97\";\n\n        public const string BindShift = \"02-88\";\n        public const string BindCtrl = \"02-8C\";\n        public const string BindAlt = \"02-8A\";\n        public const string BindWin = \"02-82\";\n\n        public const string BindTaskManager = \"04-03-8C-88-76\";\n        public const string BindCloseWindow = \"04-02-8A-0C\";\n\n        public const string BindBrightnessDown = \"04-04-8C-88-8A-05\";\n        public const string BindBrightnessUp = \"04-04-8C-88-8A-06\";\n        public const string BindXGM = \"04-04-8C-88-8A-04\";\n        public const string BindToggleMode = \"04-04-8C-88-8A-0C\";\n        public const string BindToggleFPSLimit = \"04-04-8C-88-8A-01\";\n        public const string BindToggleTouchScreen = \"04-04-8C-88-8A-0B\";\n\n        public const string BindOverlay = \"04-03-8C-88-44\";\n\n        public const string BindShiftTab = \"04-02-88-0D\";\n        public const string BindAltTab = \"04-02-8A-0D\";\n        public const string BindWinTab = \"04-02-82-0D\";\n\n        public const string BindVolUp = \"05-03\";\n        public const string BindVolDown = \"05-02\";\n\n        public const string BindPrintScrn = \"02-C3\";\n\n        public const string BindScreenshot = \"04-03-82-88-1B\";\n        public const string BindShowDesktop = \"04-02-82-23\";\n\n        public const string BindShowKeyboard = \"05-19\";\n\n        static byte[] CommandReady = new byte[] { AsusHid.INPUT_ID, 0xD1, 0x0A, 0x01 };\n        static byte[] CommandSave = new byte[] { AsusHid.INPUT_ID, 0xD1, 0x0F, 0x20 };\n\n        public static Dictionary<string, string> BindCodes = new Dictionary<string, string>\n        {\n            { \"\", \"--------\" },\n            { \"00-00\", \"[ Disabled ]\" },\n\n            { BindM1, \"M1\" },\n            { BindM2, \"M2\" },\n\n            { BindA, \"A\" },\n            { BindB, \"B\" },\n\n            { BindX, \"X\" },\n            { BindY, \"Y\" },\n\n            { BindLB, \"Left Bumper\" },\n            { BindRB, \"Right Bumper\" },\n\n            { BindLS, \"Left Stick Click\" },\n            { BindRS, \"Right Stick Click\" },\n\n            { BindDU, \"DPad Up\" },\n            { BindDD, \"DPad Down\" },\n\n            { BindDL, \"DPad Left\" },\n            { BindDR, \"DPad Right\" },\n\n            { BindVB, \"View Button\" },\n            { BindMB, \"Menu Button\" },\n\n            { BindXB, \"XBox/Steam\" },\n\n            { BindToggleMode, \"Controller Mode\" },\n            { BindToggleFPSLimit, \"FPS Limit\" },\n            { BindToggleTouchScreen, \"Toggle TouchScreen\" },\n\n            { BindVolUp, \"Vol Up\" },\n            { BindVolDown, \"Vol Down\" },\n            { BindBrightnessUp, \"Bright Up\" },\n            { BindBrightnessDown, \"Bright Down\" },\n\n            { BindShowKeyboard, \"Show Keyboard\" },\n            { BindShowDesktop, \"Show Desktop\" },\n            { BindScreenshot, \"Screenshot\" },\n\n            { BindOverlay, \"AMD Overlay\" },\n            { BindTaskManager, \"Task Manager\" },\n            { BindCloseWindow, \"Close Window\" },\n            { BindShiftTab, \"Shift-Tab\" },\n            { BindAltTab, \"Alt-Tab\" },\n            { BindWinTab, \"Win-Tab\" },\n            { BindXGM, \"XGM Toggle\" },\n\n\n            { BindEsc, \"Esc\" },\n            { BindBack, \"Backspace\" },\n            { BindTab, \"Tab\" },\n            { BindEnter, \"Enter\" },\n            { BindShift, \"LShift\" },\n            { BindAlt, \"LAlt\" },\n            { BindCtrl, \"LCtl\" },\n            { BindWin, \"WIN\" },\n            { BindPrintScrn, \"PrntScn\" },\n\n            { BindPgU, \"PgUp\" },\n            { BindPgD, \"PgDwn\" },\n            { BindKBU, \"UpArrow\" },\n            { BindKBD, \"DownArrow\" },\n            { BindKBL, \"LeftArrow\" },\n            { BindKBR, \"RightArrow\" },\n\n            { \"02-05\", \"F1\" },\n            { \"02-06\", \"F2\" },\n            { \"02-04\", \"F3\" },\n            { \"02-0C\", \"F4\" },\n            { \"02-03\", \"F5\" },\n            { \"02-0B\", \"F6\" },\n            { \"02-80\", \"F7\" },\n            { \"02-0A\", \"F8\" },\n            { \"02-01\", \"F9\" },\n            { \"02-09\", \"F10\" },\n            { \"02-78\", \"F11\" },\n            { \"02-07\", \"F12\" },\n            { \"02-0E\", \"`\" },\n            { \"02-16\", \"1\" },\n            { \"02-1E\", \"2\" },\n            { \"02-26\", \"3\" },\n            { \"02-25\", \"4\" },\n            { \"02-2E\", \"5\" },\n            { \"02-36\", \"6\" },\n            { \"02-3D\", \"7\" },\n            { \"02-3E\", \"8\" },\n            { \"02-46\", \"9\" },\n            { \"02-45\", \"0\" },\n            { \"02-4E\", \"-\" },\n            { \"02-55\", \"=\" },\n            { \"02-15\", \"Q\" },\n            { \"02-1D\", \"W\" },\n            { \"02-24\", \"E\" },\n            { \"02-2D\", \"R\" },\n            { \"02-2C\", \"T\" },\n            { \"02-35\", \"Y\" },\n            { \"02-3C\", \"U\" },\n            { \"02-44\", \"O\" },\n            { \"02-4D\", \"P\" },\n            { \"02-54\", \"[\" },\n            { \"02-5B\", \"]\" },\n            { \"02-5D\", \"|\" },\n            { \"02-58\", \"Caps\" },\n            { \"02-1C\", \"A\" },\n            { \"02-1B\", \"S\" },\n            { \"02-23\", \"D\" },\n            { \"02-2B\", \"F\" },\n            { \"02-34\", \"G\" },\n            { \"02-33\", \"H\" },\n            { \"02-3B\", \"J\" },\n            { \"02-42\", \"k\" },\n            { \"02-4B\", \"l\" },\n            { \"02-4C\", \";\" },\n            { \"02-52\", \"'\" },\n            { \"02-22\", \"X\" },\n            { \"02-1A\", \"Z\" },\n            { \"02-21\", \"C\" },\n            { \"02-2A\", \"V\" },\n            { \"02-32\", \"B\" },\n            { \"02-31\", \"N\" },\n            { \"02-3A\", \"M\" },\n            { \"02-41\", \",\" },\n            { \"02-49\", \".\" },\n            { \"02-89\", \"RShift\" },\n            { \"02-29\", \"Space\" },\n            { \"02-8B\", \"RAlt\" },\n            { \"02-84\", \"App menu\" },\n            { \"02-8D\", \"RCtl\" },\n            { \"02-7E\", \"ScrLk\" },\n            { \"02-C2\", \"Insert\" },\n            { \"02-C0\", \"Delete\" },\n            { \"02-94\", \"Home\" },\n            { \"02-95\", \"End\" },\n            { \"02-77\", \"NumLock\" },\n            { \"02-90\", \"NumSlash\" },\n            { \"02-7C\", \"NumStar\" },\n            { \"02-7B\", \"NumHyphen\" },\n            { \"02-70\", \"Num0\" },\n            { \"02-69\", \"Num1\" },\n            { \"02-72\", \"Num2\" },\n            { \"02-7A\", \"Num3\" },\n            { \"02-6B\", \"Num4\" },\n            { \"02-73\", \"Num5\" },\n            { \"02-74\", \"Num6\" },\n            { \"02-6C\", \"Num7\" },\n            { \"02-75\", \"Num8\" },\n            { \"02-7D\", \"Num9\" },\n            { \"02-79\", \"NumPlus\" },\n            { \"02-81\", \"NumEnter\" },\n            { \"02-71\", \"NumPeriod\" },\n\n            { BindMouseL, \"Mouse left click\" },\n            { BindMouseR, \"Mouse right click\" },\n            { \"03-03\", \"Mouse middle click\" },\n            { \"03-04\", \"Mouse scroll up\" },\n            { \"03-05\", \"Mouse scroll down\" },\n\n            //{ \"05-16\", \"Screenshot\" },\n            //{ \"05-1C\", \"Show desktop\" },\n\n            { \"05-1E\", \"Begin recording\" },\n            { \"05-01\", \"Mic off\" },\n\n        };\n\n        public AllyControl(SettingsForm settingsForm)\n        {\n            if (!AppConfig.IsAlly()) return;\n            settings = settingsForm;\n\n            if (timer is null)\n            {\n                timer = new System.Timers.Timer(300);\n                timer.Elapsed += Timer_Elapsed;\n                Logger.WriteLine(\"Ally timer\");\n            }\n        }\n\n        private int GetMaxTDP()\n        {\n            int tdp = AppConfig.GetMode(\"limit_total\");\n            if (tdp > 0) return tdp;\n            switch (Modes.GetCurrentBase())\n            {\n                case 1:\n                    return 25;\n                case 2:\n                    return 10;\n                default:\n                    return 15;\n            }\n        }\n\n        private int GetTDP()\n        {\n            if (tdpCurrent < 0) tdpCurrent = GetMaxTDP();\n            return tdpCurrent;\n        }\n\n        private void SetTDP(int tdp, string log)\n        {\n            if (tdp < tdpStable) tdp = tdpStable;\n\n            int max = GetMaxTDP();\n            if (tdp > max) tdp = max;\n\n            if (tdp == tdpCurrent) return;\n            if (!autoTDP) return;\n\n            Program.acpi.DeviceSet(AsusACPI.PPT_APUA0, tdp, log);\n            Program.acpi.DeviceSet(AsusACPI.PPT_APUA3, tdp, null);\n            Program.acpi.DeviceSet(AsusACPI.PPT_APUC1, tdp, null);\n\n            tdpCurrent = tdp;\n        }\n\n        private void Timer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)\n        {\n            if (!autoTDP && _mode != ControllerMode.Auto) return;\n\n            float fps = amdControl.GetFPS();\n            int? usage = 0;\n\n            if (autoTDP && fpsLimit > 0 && fpsLimit <= 120)\n            {\n                int power = (int)amdControl.GetGpuPower();\n                //Debug.WriteLine($\"{power}: {fps}\");\n\n                if (fps <= Math.Min(fpsLimit * 0.9, fpsLimit - 4)) _upCount++;\n                else _upCount = 0;\n\n                if (fps >= Math.Min(fpsLimit * 0.95, fpsLimit - 2)) _downCount++;\n                else _downCount = 0;\n\n                var tdp = GetTDP();\n                if (_upCount >= 1)\n                {\n                    _downCount = 0;\n                    _upCount = 0;\n                    SetTDP(tdp + 1, $\"AutoTDP+ [{power}]{fps}\");\n                }\n\n                if (_downCount >= 8 && power < tdp)\n                {\n                    _upCount = 0;\n                    _downCount--;\n                    SetTDP(tdp - 1, $\"AutoTDP- [{power}]{fps}\");\n                }\n            }\n\n            if (_mode == ControllerMode.Auto)\n            {\n                if (fps > 0) usage = amdControl.GetiGpuUse();\n                ControllerMode newMode = (fps > 0 && usage > 15) ? ControllerMode.Gamepad : ControllerMode.Mouse;\n\n                if (_applyMode != newMode) _autoCount++;\n                else _autoCount = 0;\n\n                if (_autoCount == 3)\n                {\n                    _autoCount = 0;\n                    ApplyMode(newMode);\n                    Logger.WriteLine($\"Controller Mode (FPS={fps}, USAGE={usage}%): {newMode}\");\n                }\n            }\n\n        }\n\n        public void ToggleAutoTDP()\n        {\n            autoTDP = !autoTDP;\n            tdpCurrent = -1;\n\n            if (!autoTDP)\n            {\n                Program.modeControl.SetPerformanceMode();\n            }\n\n            settings.VisualiseAutoTDP(autoTDP);\n\n        }\n\n        public void Init()\n        {\n            if (AppConfig.IsAlly()) settings.VisualiseAlly(true);\n            else return;\n\n            SetMode((ControllerMode)AppConfig.Get(\"controller_mode\", (int)ControllerMode.Auto), true);\n\n            settings.VisualiseBacklight(InputDispatcher.GetBacklight());\n\n            fpsLimit = amdControl.GetFPSLimit();\n            settings.VisualiseFPSLimit(fpsLimit);\n        }\n\n        public void ToggleFPSLimit(bool toast = false)\n        {\n            switch (fpsLimit)\n            {\n                case 30:\n                    fpsLimit = 40;\n                    break;\n                case 40:\n                    fpsLimit = 45;\n                    break;\n                case 45:\n                    fpsLimit = 50;\n                    break;\n                case 50:\n                    fpsLimit = 60;\n                    break;\n                case 60:\n                    fpsLimit = 75;\n                    break;\n                case 75:\n                    fpsLimit = 90;\n                    break;\n                case 90:\n                    fpsLimit = 120;\n                    break;\n                case 120:\n                    fpsLimit = 240;\n                    break;\n                default:\n                    fpsLimit = 30;\n                    break;\n            }\n\n            int result = amdControl.SetFPSLimit(fpsLimit);\n            Logger.WriteLine($\"FPS Limit {fpsLimit}: {result}\");\n\n            settings.VisualiseFPSLimit(fpsLimit);\n            if (toast) Program.toast.RunToast(\"FPS Limit \" + ((fpsLimit > 0 && fpsLimit <= 120) ? fpsLimit : \"OFF\"));\n\n        }\n\n\n        public void ToggleBacklight()\n        {\n            InputDispatcher.SetBacklight(4, true);\n            settings.VisualiseBacklight(InputDispatcher.GetBacklight());\n        }\n\n        static private byte[] DecodeBinding(string binding = \"\")\n        {\n            byte[] bytes;\n\n            if (binding == \"\" || binding is null) return new byte[2];\n\n            try\n            {\n                bytes = AppConfig.StringToBytes(binding);\n            }\n            catch\n            {\n                return new byte[2];\n            }\n\n            byte[] code = new byte[10];\n            code[0] = bytes[0];\n\n            switch (bytes[0])\n            {\n                case 0x02:\n                    code[2] = bytes[1];\n                    break;\n                case 0x03:\n                    code[4] = bytes[1];\n                    break;\n                case 0x04:\n                    bytes.Skip(1).ToArray().CopyTo(code, 5);\n                    break;\n                case 0x05:\n                    code[3] = bytes[1];\n                    break;\n                default:\n                    code[1] = bytes[1];\n                    break;\n            }\n\n            return code;\n        }\n\n        static private void BindZone(BindingZone zone)\n        {\n            string KeyL1, KeyR1;\n            string KeyL2, KeyR2;\n\n            bool desktop = (_applyMode == ControllerMode.Mouse);\n\n            switch (zone)\n            {\n                case BindingZone.DPadUpDown:\n                    KeyL1 = AppConfig.GetString(\"bind_du\", desktop ? BindKBU : BindDU);\n                    KeyR1 = AppConfig.GetString(\"bind_dd\", desktop ? BindKBD : BindDD);\n                    KeyL2 = AppConfig.GetString(\"bind2_du\", BindShowKeyboard);\n                    KeyR2 = AppConfig.GetString(\"bind2_dd\", BindShowDesktop);\n                    break;\n                case BindingZone.DPadLeftRight:\n                    KeyL1 = AppConfig.GetString(\"bind_dl\", desktop ? BindKBL : BindDL);\n                    KeyR1 = AppConfig.GetString(\"bind_dr\", desktop ? BindKBR : BindDR);\n                    KeyL2 = AppConfig.GetString(\"bind2_dl\", BindBrightnessDown);\n                    KeyR2 = AppConfig.GetString(\"bind2_dr\", BindBrightnessUp);\n                    break;\n                case BindingZone.StickClick:\n                    KeyL1 = AppConfig.GetString(\"bind_ls\", desktop ? BindShift : BindLS);\n                    KeyR1 = AppConfig.GetString(\"bind_rs\", desktop ? BindMouseL : BindRS);\n                    KeyL2 = AppConfig.GetString(\"bind2_ls\");\n                    KeyR2 = AppConfig.GetString(\"bind2_rs\", BindToggleMode);\n                    break;\n                case BindingZone.Bumper:\n                    KeyL1 = AppConfig.GetString(\"bind_lb\", desktop ? BindTab : BindLB);\n                    KeyR1 = AppConfig.GetString(\"bind_rb\", desktop ? BindMouseL : BindRB);\n                    KeyL2 = AppConfig.GetString(\"bind2_lb\");\n                    KeyR2 = AppConfig.GetString(\"bind2_rb\");\n                    break;\n                case BindingZone.AB:\n                    KeyL1 = AppConfig.GetString(\"bind_a\", desktop ? BindEnter : BindA);\n                    KeyR1 = AppConfig.GetString(\"bind_b\", desktop ? BindEsc : BindB);\n                    KeyL2 = AppConfig.GetString(\"bind2_a\");\n                    KeyR2 = AppConfig.GetString(\"bind2_b\");\n                    break;\n                case BindingZone.XY:\n                    KeyL1 = AppConfig.GetString(\"bind_x\", desktop ? BindPgD : BindX);\n                    KeyR1 = AppConfig.GetString(\"bind_y\", desktop ? BindPgU : BindY);\n                    KeyL2 = AppConfig.GetString(\"bind2_x\", BindScreenshot);\n                    KeyR2 = AppConfig.GetString(\"bind2_y\", BindOverlay);\n                    break;\n                case BindingZone.ViewMenu:\n                    KeyL1 = AppConfig.GetString(\"bind_vb\", BindVB);\n                    KeyR1 = AppConfig.GetString(\"bind_mb\", BindMB);\n                    KeyL2 = AppConfig.GetString(\"bind2_vb\");\n                    KeyR2 = AppConfig.GetString(\"bind2_mb\");\n                    break;\n                case BindingZone.M1M2:\n                    KeyL1 = AppConfig.GetString(\"bind_m2\", BindM2);\n                    KeyR1 = AppConfig.GetString(\"bind_m1\", BindM1);\n                    KeyL2 = AppConfig.GetString(\"bind2_m2\", BindM2);\n                    KeyR2 = AppConfig.GetString(\"bind2_m1\", BindM1);\n                    break;\n                default:\n                    KeyL1 = AppConfig.GetString(\"bind_lt\", desktop ? BindShiftTab : BindLT);\n                    KeyR1 = AppConfig.GetString(\"bind_rt\", desktop ? BindMouseR : BindRT);\n                    KeyL2 = AppConfig.GetString(\"bind2_lt\");\n                    KeyR2 = AppConfig.GetString(\"bind2_rt\");\n                    break;\n            }\n\n            if (KeyL1 == \"\" && KeyR1 == \"\") return;\n\n            byte[] bindings = new byte[50];\n            byte[] init = new byte[] { AsusHid.INPUT_ID, 0xd1, 0x02, (byte)zone, 0x2c };\n\n            init.CopyTo(bindings, 0);\n\n            DecodeBinding(KeyL1).CopyTo(bindings, 5);\n            DecodeBinding(KeyL2).CopyTo(bindings, 16);\n\n            DecodeBinding(KeyR1).CopyTo(bindings, 27);\n            DecodeBinding(KeyR2).CopyTo(bindings, 38);\n\n            //AsusHid.WriteInput(CommandReady, null);\n            AsusHid.WriteInput(bindings, null);\n\n        }\n\n        static void WakeUp()\n        {\n            AsusHid.WriteInput(Encoding.ASCII.GetBytes(\"ZASUS Tech.Inc.\"), \"Init\");\n        }\n\n        static public void SetDeadzones()\n        {\n            AsusHid.WriteInput(new byte[] { AsusHid.INPUT_ID, 0xd1, 4, 4,\n                (byte)AppConfig.Get(\"ls_min\", 0),\n                (byte)AppConfig.Get(\"ls_max\", 100),\n                (byte)AppConfig.Get(\"rs_min\", 0),\n                (byte)AppConfig.Get(\"rs_max\", 100)\n            }, null);\n\n            AsusHid.WriteInput(new byte[] { AsusHid.INPUT_ID, 0xd1, 5, 4,\n                (byte)AppConfig.Get(\"lt_min\", 0),\n                (byte)AppConfig.Get(\"lt_max\", 100),\n                (byte)AppConfig.Get(\"rt_min\", 0),\n                (byte)AppConfig.Get(\"rt_max\", 100)\n            }, null);\n\n            AsusHid.WriteInput(new byte[] { AsusHid.INPUT_ID, 0xd1, 6, 2,\n                (byte)AppConfig.Get(\"vibra\", 100),\n                (byte)AppConfig.Get(\"vibra\", 100)\n            }, null);\n\n        }\n\n        public static void DisableXBoxController(bool disabled)\n        {\n            AsusHid.WriteInput([AsusHid.INPUT_ID, 0xD1, 0x0B, 0x01, disabled ? (byte)0x02 : (byte)0x01], $\"ControllerDisabled: {disabled}\");\n        }\n\n        public static void ApplyMode(ControllerMode applyMode = ControllerMode.Auto, bool init = false)\n        {\n            Task.Run(() =>\n            {\n\n                if (applyMode == ControllerMode.Skip) return;\n\n                HidStream? input = AsusHid.FindHidStream(AsusHid.INPUT_ID);\n                int count = 0;\n\n                while (input == null && count++ < 10)\n                {\n                    input = AsusHid.FindHidStream(AsusHid.INPUT_ID);\n                    Thread.Sleep(500);\n                }\n\n                if (input == null)\n                {\n                    Logger.WriteLine($\"Controller not found\");\n                    return;\n                }\n\n                if (applyMode != ControllerMode.Auto) _applyMode = applyMode;\n\n                if (init)\n                {\n                    WakeUp();\n                    InputDispatcher.SetBacklightAuto();\n                }\n\n                AsusHid.WriteInput([AsusHid.INPUT_ID, 0xD1, 0x01, 0x01, (byte)_applyMode], \"Controller\");\n                //AsusHid.WriteInput(CommandSave, null);\n\n                BindZone(BindingZone.M1M2);\n                BindZone(BindingZone.DPadUpDown);\n                BindZone(BindingZone.DPadLeftRight);\n                BindZone(BindingZone.StickClick);\n                BindZone(BindingZone.Bumper);\n                BindZone(BindingZone.AB);\n                BindZone(BindingZone.XY);\n                BindZone(BindingZone.ViewMenu);\n                BindZone(BindingZone.Trigger);\n\n                AsusHid.WriteInput(CommandSave, null);\n\n                SetDeadzones();\n\n                if (init && AppConfig.Is(\"controller_disabled\"))\n                {\n                    Thread.Sleep(500);\n                    DisableXBoxController(false);\n                    DisableXBoxController(true);\n                }\n\n            });\n        }\n\n        private void SetMode(ControllerMode mode, bool init = false)\n        {\n\n            _mode = mode;\n            AppConfig.Set(\"controller_mode\", (int)mode);\n\n            amdControl.StopFPS();\n            ApplyMode(mode, init);\n\n            amdControl.StartFPS();\n            timer.Start();\n\n            settings.VisualiseController(mode);\n        }\n\n\n        public void ToggleModeHotkey()\n        {\n            if (_applyMode == ControllerMode.Gamepad)\n            {\n                SetMode(ControllerMode.Mouse);\n                Program.toast.RunToast(\"Mouse\", ToastIcon.Controller);\n            }\n            else\n            {\n                SetMode(ControllerMode.Gamepad);\n                Program.toast.RunToast(\"Gamepad\", ToastIcon.Controller);\n            }\n        }\n\n        public void ToggleMode()\n        {\n            switch (_mode)\n            {\n                case ControllerMode.Auto:\n                    SetMode(ControllerMode.Gamepad);\n                    break;\n                case ControllerMode.Gamepad:\n                    SetMode(ControllerMode.Mouse);\n                    break;\n                case ControllerMode.Mouse:\n                    SetMode(ControllerMode.Skip);\n                    break;\n                case ControllerMode.Skip:\n                    SetMode(ControllerMode.Auto);\n                    break;\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "app/AnimeMatrix/AniMatrixControl.cs",
    "content": "﻿using NAudio.CoreAudioApi;\nusing NAudio.Wave;\nusing System.Diagnostics;\nusing System.Drawing.Drawing2D;\nusing System.Drawing.Imaging;\nusing System.Timers;\n\nnamespace GHelper.AnimeMatrix\n{\n\n    public class AniMatrixControl : NAudio.CoreAudioApi.Interfaces.IMMNotificationClient\n    {\n\n        SettingsForm settings;\n\n        System.Timers.Timer matrixTimer = default!;\n        System.Timers.Timer slashTimer = default!;\n\n        public AnimeMatrixDevice? deviceMatrix;\n        public SlashDevice? deviceSlash;\n\n        public static bool lidClose = false;\n        private static bool _wakeUp = false;\n\n        double[]? AudioValues;\n        WasapiCapture? AudioDevice;\n        string? AudioDeviceId;\n        private MMDeviceEnumerator? AudioDeviceEnum;\n\n        private readonly object _audioLock = new();\n        private volatile bool _listeningToAudio;\n        private volatile bool _stoppingAudio;\n\n        public bool IsValid => deviceMatrix != null || deviceSlash != null;\n        public bool IsSlash => deviceSlash != null;\n\n        private long lastPresent;\n        private List<double> maxes = new List<double>();\n        \n        private int slashBrightness = 0;\n        private SlashMode slashMode;\n\n        public AniMatrixControl(SettingsForm settingsForm)\n        {\n            settings = settingsForm;\n            if (!AppConfig.IsSlash() && !AppConfig.IsAnimeMatrix()) return;\n            \n            try\n            {\n                if (AppConfig.IsSlash())\n                {\n                    if (AppConfig.IsSlashAura())\n                        deviceSlash = new SlashDeviceAura();\n                    else\n                        deviceSlash = new SlashDevice();\n                }\n                else\n                {\n                    deviceMatrix = new AnimeMatrixDevice();\n                }\n\n                matrixTimer = new System.Timers.Timer(100);\n                matrixTimer.Elapsed += MatrixTimer_Elapsed;\n\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine(ex.Message);\n            }\n\n        }\n\n        public void SetDevice(bool wakeUp = false)\n        {\n            if (deviceMatrix is not null) SetMatrix(wakeUp);\n            if (deviceSlash is not null) SetSlash(wakeUp);\n        }\n\n        public void SetSlash(bool wakeUp = false)\n        {\n            if (deviceSlash is null) return;\n\n            int brightness = AppConfig.Get(\"matrix_brightness\", 0);\n            int running = AppConfig.Get(\"matrix_running\", 0);\n            int inteval = AppConfig.Get(\"matrix_interval\", 0);\n\n            bool auto = AppConfig.Is(\"matrix_auto\");\n            bool lid = AppConfig.Is(\"matrix_lid\");\n\n            StopAudio();\n\n            Task.Run(() =>\n            {\n                try\n                {\n                    deviceSlash.SetProvider();\n                }\n                catch (Exception ex)\n                {\n                    Logger.WriteLine(ex.Message);\n                    return;\n                }\n\n                if (wakeUp) _wakeUp = true;\n\n                if (brightness == 0 || (auto && SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Online) || (lid && lidClose))\n                {\n                    deviceSlash.SetSleepActive(false);\n                    deviceSlash.SetEnabled(false);\n                    //deviceSlash.Init();\n                    //deviceSlash.SetOptions(false, 0, 0);\n                }\n                else\n                {\n                    if (_wakeUp)\n                    {\n                        deviceSlash.WakeUp();\n                        _wakeUp = false;\n                    }\n\n                    deviceSlash.SetEnabled(true);\n                    deviceSlash.Init();\n\n                    switch ((SlashMode)running)\n                    {\n                        case SlashMode.Static:\n                            var custom = AppConfig.GetString(\"slash_custom\");\n                            if (custom is not null && custom.Length > 0)\n                            {\n                                Logger.WriteLine(\"Slash: Static\");\n                                deviceSlash.SetCustom(AppConfig.StringToBytes(custom));\n                            }\n                            else\n                            {\n                                deviceSlash.SetMode((SlashMode)running);\n                                deviceSlash.SetOptions(true, brightness, inteval);\n                                deviceSlash.Save();\n                            }\n                            break;\n                        case SlashMode.BatteryLevel:\n                            // call tick to immediately update the pattern\n                            Logger.WriteLine(\"Slash: Battery Level\");\n                            SlashTimer_start();\n                            SlashTimer_tick();\n                            break;\n                        case SlashMode.Audio:\n                        case SlashMode.AudioSpectrum:\n                            slashMode = (SlashMode)running;\n                            Logger.WriteLine(\"Slash: Audio\");\n                            SetAudio();\n                            break;\n                        default:\n                            deviceSlash.SetMode((SlashMode)running);\n                            deviceSlash.SetOptions(true, brightness, inteval);\n                            deviceSlash.Save();\n                            break;\n                    }\n\n                    // kill the timer if we are not displaying battery pattern\n\n                    deviceSlash.SetSleepActive(AppConfig.IsNotFalse(\"slash_sleep\"));\n                }\n            });\n        }\n\n        public void SetLidMode(bool force = false)\n        {\n            bool matrixLid = AppConfig.Is(\"matrix_lid\");\n\n            if (deviceSlash is not null)\n            {\n                deviceSlash.SetLidCloseAnimation(!matrixLid && !AppConfig.Is(\"slash_sleep\"));\n            }\n\n            if (matrixLid || force)\n            {\n                Logger.WriteLine($\"Matrix LidClosed: {lidClose}\");\n                SetDevice(true);\n            }\n        }\n\n        public void SetBatteryAuto()\n        {\n            if (deviceSlash is not null)\n            {\n                bool auto = AppConfig.Is(\"matrix_auto\");\n                deviceSlash.SetBatterySaver(auto);\n                if (!auto) SetSlash();\n            }\n\n            if (deviceMatrix is not null) SetMatrix();\n        }\n\n        public void SetMatrix(bool wakeUp = false)\n        {\n\n            if (deviceMatrix is null) return;\n\n            int brightness = AppConfig.Get(\"matrix_brightness\", 0);\n            int running = AppConfig.Get(\"matrix_running\", 0);\n            bool auto = AppConfig.Is(\"matrix_auto\");\n            bool lid = AppConfig.Is(\"matrix_lid\");\n\n            StopMatrixTimer();\n            StopAudio();\n\n            Task.Run(() =>\n            {\n                try\n                {\n                    deviceMatrix.SetProvider();\n                }\n                catch (Exception ex)\n                {\n                    Logger.WriteLine(ex.Message);\n                    return;\n                }\n\n                if (wakeUp) deviceMatrix.WakeUp();\n\n                if (brightness == 0 || (auto && SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Online) || (lid && lidClose))\n                {\n                    deviceMatrix.SetDisplayState(false);\n                    deviceMatrix.SetDisplayState(false); // some devices are dumb\n                    Logger.WriteLine(\"Matrix Off\");\n                }\n                else\n                {\n                    if (wakeUp) deviceMatrix.WakeUp();\n                    deviceMatrix.SetDisplayState(true);\n                    deviceMatrix.SetBrightness((BrightnessMode)brightness);\n\n                    switch (running)\n                    {\n                        case 2:\n                            SetMatrixPicture(AppConfig.GetString(\"matrix_picture\"), false);\n                            break;\n                        case 3:\n                            SetMatrixClock();\n                            break;\n                        case 4:\n                            SetAudio();\n                            break;\n                        default:\n                            SetBuiltIn(running);\n                            break;\n                    }\n\n                }\n            });\n\n\n        }\n\n        private void SetBuiltIn(int running)\n        {\n            BuiltInAnimation animation = new BuiltInAnimation(\n                (BuiltInAnimation.Running)running,\n                (BuiltInAnimation.Sleeping)AppConfig.Get(\"matrix_sleep\", (int)BuiltInAnimation.Sleeping.Starfield),\n                (BuiltInAnimation.Shutdown)AppConfig.Get(\"matrix_shutdown\", (int)BuiltInAnimation.Shutdown.SeeYa),\n                (BuiltInAnimation.Startup)AppConfig.Get(\"matrix_startup\", (int)BuiltInAnimation.Startup.StaticEmergence)\n            );\n            deviceMatrix.SetBuiltInAnimation(true, animation);\n            Logger.WriteLine(\"Matrix builtin: \" + animation.AsByte);\n        }\n\n        private void StartMatrixTimer(int interval = 100)\n        {\n            matrixTimer.Interval = interval;\n            matrixTimer.Start();\n        }\n\n        private void StopMatrixTimer()\n        {\n            matrixTimer.Stop();\n        }\n\n        private void MatrixTimer_Elapsed(object? sender, ElapsedEventArgs e)\n        {\n\n            if (deviceMatrix is null) return;\n\n            switch (AppConfig.Get(\"matrix_running\"))\n            {\n                case 2:\n                    deviceMatrix.PresentNextFrame();\n                    break;\n                case 3:\n                    deviceMatrix.PresentClock();\n                    break;\n            }\n\n        }\n\n        public void SetMatrixClock()\n        {\n            deviceMatrix.SetBuiltInAnimation(false);\n            StartMatrixTimer(1000);\n            Logger.WriteLine(\"Matrix Clock\");\n        }\n\n\n        private void SlashTimer_start(int interval = 180000)\n        {\n            // 100% to 0% in 1hr = 1% every 36 seconds\n            // 1 bracket every 14.2857 * 36s = 514s ~ 8m 30s\n            // only ~5 actually distinguishable levels, so refresh every <= 514/5 ~ 100s\n            // default is 60s\n\n            // create the timer if first call\n            // this way, the timer only spawns if user tries to use battery pattern\n            if (slashTimer == default(System.Timers.Timer))\n            {\n                slashTimer = new System.Timers.Timer(interval);\n                slashTimer.Elapsed += SlashTimer_elapsed;\n                slashTimer.AutoReset = true;\n            }\n            // only write if interval changed\n            if (slashTimer.Interval != interval)\n            {\n                slashTimer.Interval = interval;\n            }\n\n            slashTimer.Start();\n        }\n\n        private void SlashTimer_elapsed(object? sender, ElapsedEventArgs e)\n        {\n            SlashTimer_tick();\n        }\n\n        private void SlashTimer_tick()\n        {\n            if (deviceSlash is null) return;\n\n            //kill timer if called but not in battery pattern mode\n            if ((SlashMode)AppConfig.Get(\"matrix_running\", 0) != SlashMode.BatteryLevel)\n            {\n                slashTimer.Stop();\n                slashTimer.Dispose();\n                return;\n            }\n\n            deviceSlash.SetBatteryPattern(AppConfig.Get(\"matrix_brightness\", 0));\n        }\n\n\n        public void Dispose()\n        {\n            StopAudio();\n        }\n\n        void StopAudio()\n        {\n            lock (_audioLock)\n            {\n                _stoppingAudio = true;\n                _listeningToAudio = false;\n\n                if (AudioDeviceEnum is not null)\n                {\n                    try\n                    {\n                        AudioDeviceEnum.UnregisterEndpointNotificationCallback(this);\n                    }\n                    catch (Exception ex)\n                    {\n                        Logger.WriteLine(\"UnregisterEndpointNotificationCallback failed: \" + ex);\n                    }\n                }\n\n                if (AudioDevice is not null)\n                {\n                    try\n                    {\n                        AudioDevice.DataAvailable -= WaveIn_DataAvailable;\n                        AudioDevice.StopRecording();\n                        AudioDevice.Dispose();\n                    }\n                    catch (Exception ex)\n                    {\n                        Logger.WriteLine(ex.ToString());\n                    }\n\n                    AudioDevice = null;\n                }\n\n                AudioDeviceId = null;\n\n                if (AudioDeviceEnum is not null)\n                {\n                    try { AudioDeviceEnum.Dispose(); } catch { /* ignore */ }\n                    AudioDeviceEnum = null;\n                }\n\n                _stoppingAudio = false;\n            }\n        }\n\n        void SetAudio()\n        {\n            if (deviceMatrix is not null) deviceMatrix.SetBuiltInAnimation(false);\n            else if (deviceSlash is not null) deviceSlash.SetEmpty();\n            else return;\n\n            StopAudio();\n            slashBrightness = AppConfig.Get(\"matrix_brightness\", 0);\n\n            lock (_audioLock)\n            {\n                _stoppingAudio = false;\n                _listeningToAudio = true;\n\n                try\n                {\n                    AudioDeviceEnum = new MMDeviceEnumerator();\n                    AudioDeviceEnum.RegisterEndpointNotificationCallback(this);\n\n                    using (MMDevice device = AudioDeviceEnum.GetDefaultAudioEndpoint(DataFlow.Render, Role.Console))\n                    {\n                        AudioDevice = new WasapiLoopbackCapture(device);\n                        AudioDeviceId = device.ID;\n\n                        var fmt = AudioDevice.WaveFormat;\n                        AudioValues = new double[fmt.SampleRate / 1000];\n\n                        AudioDevice.DataAvailable += WaveIn_DataAvailable;\n                        AudioDevice.StartRecording();\n                    }\n\n                    Logger.WriteLine(\"Subscribed to Audio\");\n                }\n                catch (Exception ex)\n                {\n                    Logger.WriteLine(ex.ToString());\n                    _listeningToAudio = false;\n                }\n            }\n        }\n\n        private void WaveIn_DataAvailable(object? sender, WaveInEventArgs e)\n        {\n            int bytesPerSamplePerChannel = AudioDevice.WaveFormat.BitsPerSample / 8;\n            int bytesPerSample = bytesPerSamplePerChannel * AudioDevice.WaveFormat.Channels;\n            int bufferSampleCount = e.Buffer.Length / bytesPerSample;\n\n            if (bufferSampleCount >= AudioValues.Length)\n            {\n                bufferSampleCount = AudioValues.Length;\n            }\n\n            if (bytesPerSamplePerChannel == 2 && AudioDevice.WaveFormat.Encoding == WaveFormatEncoding.Pcm)\n            {\n                for (int i = 0; i < bufferSampleCount; i++)\n                    AudioValues[i] = BitConverter.ToInt16(e.Buffer, i * bytesPerSample);\n            }\n            else if (bytesPerSamplePerChannel == 4 && AudioDevice.WaveFormat.Encoding == WaveFormatEncoding.Pcm)\n            {\n                for (int i = 0; i < bufferSampleCount; i++)\n                    AudioValues[i] = BitConverter.ToInt32(e.Buffer, i * bytesPerSample);\n            }\n            else if (bytesPerSamplePerChannel == 4 && AudioDevice.WaveFormat.Encoding == WaveFormatEncoding.IeeeFloat)\n            {\n                for (int i = 0; i < bufferSampleCount; i++)\n                    AudioValues[i] = BitConverter.ToSingle(e.Buffer, i * bytesPerSample);\n            }\n\n            double[] paddedAudio = FftSharp.Pad.ZeroPad(AudioValues);\n            var fft = FftSharp.FFT.Forward(paddedAudio);\n            double[] fftMag = FftSharp.FFT.Magnitude(fft);\n\n            PresentAudio(fftMag);\n        }\n\n        void PresentAudio(double[] audio)\n        {\n\n            if (deviceMatrix is null && deviceSlash is null) return;\n\n            if (Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastPresent) < 30)   return;\n            lastPresent = DateTimeOffset.Now.ToUnixTimeMilliseconds();\n\n            int size = 20;\n            double[] bars = new double[size];\n            double max = 2, maxAverage;\n\n            for (int i = 0; i < size; i++)\n            {\n                bars[i] = Math.Sqrt(audio[i] * 10000);\n                if (bars[i] > max) max = bars[i];\n            }\n\n            maxes.Add(max);\n            if (maxes.Count > 20) maxes.RemoveAt(0);\n            maxAverage = maxes.Average();\n\n            if (deviceMatrix is not null)\n            {\n                deviceMatrix.Clear();\n                for (int i = 0; i < size; i++) deviceMatrix.DrawBar(20 - i, bars[i] * 20 / maxAverage);\n                deviceMatrix.Present();\n            }\n\n            if (deviceSlash is not null)\n            {\n                if (slashMode == SlashMode.Audio)\n                {\n                    var bassLevel = 30 * (bars[0] + bars[1]) / maxAverage;\n                    deviceSlash.SetAudioPattern(slashBrightness, bassLevel, 10 * (bars[3] + bars[4] + bars[5] + bars[6]) / maxAverage);\n                    //Program.settingsForm.VisualiseAudio(bassLevel);\n                } \n                else\n                {\n                    var payload = new byte[7];\n                    for (int i = 0; i < 7; i++) payload[6-i] = (byte)(Math.Min(255, Math.Pow((bars[2 * i] + bars[2 * i + 1]) / 2 / maxAverage, 2) * 0x8F));\n                    deviceSlash.ContinueCustom(payload, null);\n                }\n            }\n        }\n\n        public void OpenMatrixPicture()\n        {\n            string fileName = null;\n\n            Thread t = new Thread(() =>\n            {\n                OpenFileDialog of = new OpenFileDialog();\n                of.Filter = \"Image Files (*.bmp;*.jpg;*.jpeg,*.png,*.gif)|*.BMP;*.JPG;*.JPEG;*.PNG;*.GIF\";\n                if (of.ShowDialog() == DialogResult.OK)\n                {\n                    fileName = of.FileName;\n                }\n                return;\n            });\n\n            t.SetApartmentState(ApartmentState.STA);\n            t.Start();\n            t.Join();\n\n            if (fileName is not null)\n            {\n                AppConfig.Set(\"matrix_picture\", fileName);\n                AppConfig.Set(\"matrix_running\", 2);\n\n                SetMatrixPicture(fileName);\n                settings.VisualiseMatrixRunning(2);\n\n            }\n\n        }\n\n        public void SetMatrixPicture(string fileName, bool visualise = true)\n        {\n\n            if (deviceMatrix is null) return;\n\n            StopMatrixTimer();\n\n            try\n            {\n                using (var fs = new FileStream(fileName, FileMode.Open))\n                //using (var ms = new MemoryStream())\n                {\n                    /*\n                    ms.SetLength(0);\n                    fs.CopyTo(ms);\n                    ms.Position = 0;\n                    */\n                    using (Image image = Image.FromStream(fs))\n                    {\n                        ProcessPicture(image);\n                        Logger.WriteLine(\"Matrix \" + fileName);\n                    }\n\n                    fs.Close();\n                    if (visualise) settings.VisualiseMatrixPicture(fileName);\n                }\n            }\n            catch\n            {\n                Debug.WriteLine(\"Error loading picture\");\n                return;\n            }\n\n        }\n\n        protected void ProcessPicture(Image image)\n        {\n            deviceMatrix.SetBuiltInAnimation(false);\n            deviceMatrix.ClearFrames();\n\n            int matrixX = AppConfig.Get(\"matrix_x\", 0);\n            int matrixY = AppConfig.Get(\"matrix_y\", 0);\n\n            int matrixZoom = AppConfig.Get(\"matrix_zoom\", 100);\n            int matrixContrast = AppConfig.Get(\"matrix_contrast\", 100);\n            int matrixGamma = AppConfig.Get(\"matrix_gamma\", 0);\n\n            int matrixSpeed = AppConfig.Get(\"matrix_speed\", 50);\n\n            MatrixRotation rotation = (MatrixRotation)AppConfig.Get(\"matrix_rotation\", 0);\n\n            InterpolationMode matrixQuality = (InterpolationMode)AppConfig.Get(\"matrix_quality\", 0);\n\n\n            FrameDimension dimension = new FrameDimension(image.FrameDimensionsList[0]);\n            int frameCount = image.GetFrameCount(dimension);\n\n            if (frameCount > 1)\n            {\n                var delayPropertyBytes = image.GetPropertyItem(0x5100).Value;\n                var frameDelay = BitConverter.ToInt32(delayPropertyBytes) * 10;\n\n                for (int i = 0; i < frameCount; i++)\n                {\n                    image.SelectActiveFrame(dimension, i);\n\n                    if (rotation == MatrixRotation.Planar)\n                        deviceMatrix.GenerateFrame(image, matrixZoom, matrixX, matrixY, matrixQuality, matrixContrast, matrixGamma);\n                    else\n                        deviceMatrix.GenerateFrameDiagonal(image, matrixZoom, matrixX, matrixY, matrixQuality, matrixContrast, matrixGamma);\n\n                    deviceMatrix.AddFrame();\n                }\n\n\n                Logger.WriteLine(\"GIF Delay:\" + frameDelay);\n                StartMatrixTimer(Math.Max(matrixSpeed, frameDelay));\n\n                //image.SelectActiveFrame(dimension, 0);\n\n            }\n            else\n            {\n                if (rotation == MatrixRotation.Planar)\n                    deviceMatrix.GenerateFrame(image, matrixZoom, matrixX, matrixY, matrixQuality, matrixContrast, matrixGamma);\n                else\n                    deviceMatrix.GenerateFrameDiagonal(image, matrixZoom, matrixX, matrixY, matrixQuality, matrixContrast, matrixGamma);\n\n                deviceMatrix.Present();\n            }\n\n        }\n\n        public void OnDeviceStateChanged(string deviceId, DeviceState newState)\n        {\n\n        }\n\n        public void OnDeviceAdded(string pwstrDeviceId)\n        {\n\n        }\n\n        public void OnDeviceRemoved(string deviceId)\n        {\n\n        }\n\n        public void OnDefaultDeviceChanged(DataFlow flow, Role role, string defaultDeviceId)\n        {\n            if (!_listeningToAudio) return;\n            if (_stoppingAudio) return;\n\n            int running = AppConfig.Get(\"matrix_running\");\n            if (flow != DataFlow.Render || role != Role.Console || running != 4) return;\n\n            var currentId = AudioDeviceId;\n            if (!string.IsNullOrEmpty(currentId) && currentId == defaultDeviceId) return;\n\n            //Restart audio if default audio changed\n            Logger.WriteLine(\"Matrix Audio: Default Output changed to \" + defaultDeviceId);\n\n            //Already set the device here. Otherwise this will be called multiple times in a short succession and causes a crash due to dispose during initalization.\n            AudioDeviceId = defaultDeviceId;\n\n            Task.Delay(50).ContinueWith(_ =>\n            {\n                if (!_listeningToAudio) return;\n                SetMatrix();\n            });\n        }\n\n        public void OnPropertyValueChanged(string pwstrDeviceId, PropertyKey key)\n        {\n\n        }\n    }\n}\n"
  },
  {
    "path": "app/AnimeMatrix/AnimeMatrixDevice.cs",
    "content": "﻿// Source thanks to https://github.com/vddCore/Starlight with some adjustments from me\n\nusing GHelper.AnimeMatrix.Communication;\nusing System.Drawing.Drawing2D;\nusing System.Drawing.Text;\nusing System.Text;\n\nnamespace GHelper.AnimeMatrix\n{\n    public class BuiltInAnimation\n    {\n        public enum Startup\n        {\n            GlitchConstruction,\n            StaticEmergence\n        }\n\n        public enum Shutdown\n        {\n            GlitchOut,\n            SeeYa\n        }\n\n        public enum Sleeping\n        {\n            BannerSwipe,\n            Starfield\n        }\n\n        public enum Running\n        {\n            BinaryBannerScroll,\n            RogLogoGlitch\n        }\n\n        public byte AsByte { get; }\n\n        public BuiltInAnimation(\n            Running running,\n            Sleeping sleeping,\n            Shutdown shutdown,\n            Startup startup\n        )\n        {\n            AsByte |= (byte)(((int)running & 0x01) << 0);\n            AsByte |= (byte)(((int)sleeping & 0x01) << 1);\n            AsByte |= (byte)(((int)shutdown & 0x01) << 2);\n            AsByte |= (byte)(((int)startup & 0x01) << 3);\n        }\n    }\n\n    public enum MatrixRotation\n    {\n        Planar,\n        Diagonal\n    }\n\n    internal class AnimeMatrixPacket : Packet\n    {\n        public AnimeMatrixPacket(byte[] command)\n            : base(0x5E, 640, command)\n        {\n        }\n    }\n\n    public enum AnimeType\n    {\n        GA401,\n        GA402,\n        GU604,\n        STRIX\n    }\n\n\n    public enum BrightnessMode : byte\n    {\n        Off = 0,\n        Dim = 1,\n        Medium = 2,\n        Full = 3\n    }\n\n\n    public class AnimeMatrixDevice : Device\n    {\n        int UpdatePageLength = 490;\n        int LedCount = 1450;\n\n        byte[] _displayBuffer;\n        List<byte[]> frames = new List<byte[]>();\n\n        public int MaxRows = 61;\n        public int MaxColumns = 34;\n        public int LedStart = 0;\n        public int FullRows = 11;\n\n        private int frameIndex = 0;\n\n        private static AnimeType _model = AnimeType.GA402;\n\n        [System.Runtime.InteropServices.DllImport(\"gdi32.dll\")]\n        private static extern IntPtr AddFontMemResourceEx(IntPtr pbFont, uint cbFont, IntPtr pdv, [System.Runtime.InteropServices.In] ref uint pcFonts);\n        private PrivateFontCollection fonts = new PrivateFontCollection();\n\n        public AnimeMatrixDevice() : base(0x0B05, 0x193B, 640)\n        {\n            if (AppConfig.ContainsModel(\"401\"))\n            {\n                _model = AnimeType.GA401;\n                MaxColumns = 33;\n                MaxRows = 55;\n                LedCount = 1245;\n                UpdatePageLength = 410;\n                FullRows = 5;\n                LedStart = 1;\n            }\n\n            if (AppConfig.ContainsModel(\"GU604\"))\n            {\n                _model = AnimeType.GU604;\n                MaxColumns = 39;\n                MaxRows = 92;\n                LedCount = 1711;\n                UpdatePageLength = 630;\n                FullRows = 9;\n            }\n\n            if (AppConfig.ContainsModel(\"G635\") || AppConfig.ContainsModel(\"G615\") || AppConfig.ContainsModel(\"G835\") || AppConfig.ContainsModel(\"G815\"))\n            {\n                _model = AnimeType.STRIX;\n                MaxColumns = 34;\n                MaxRows = 68;\n                LedCount = 810;\n                UpdatePageLength = 490;\n                FullRows = 29;\n            }\n\n            _displayBuffer = new byte[LedCount];\n\n            LoadMFont();\n\n        }\n\n        public void WakeUp()\n        {\n            Set(Packet<AnimeMatrixPacket>(Encoding.ASCII.GetBytes(\"ASUS Tech.Inc.\")));\n        }\n\n        public void SetBrightness(BrightnessMode mode)\n        {\n            Set(Packet<AnimeMatrixPacket>(0xC0, 0x04, (byte)mode));\n        }\n\n        public void SetDisplayState(bool enable)\n        {\n            Set(Packet<AnimeMatrixPacket>(0xC3, 0x01, enable ? (byte)0x00 : (byte)0x80));\n        }\n\n        public void SetBuiltInAnimation(bool enable)\n        {\n            Set(Packet<AnimeMatrixPacket>(0xC4, 0x01, enable ? (byte)0x00 : (byte)0x80));\n        }\n\n        public void SetBuiltInAnimation(bool enable, BuiltInAnimation animation)\n        {\n            SetBuiltInAnimation(enable);\n            Set(Packet<AnimeMatrixPacket>(0xC5, animation.AsByte));\n        }\n\n        public void Present()\n        {\n\n            int page = 0;\n            int start, end;\n\n            while (page * UpdatePageLength < LedCount)\n            {\n                start = page * UpdatePageLength;\n                end = Math.Min(LedCount, (page + 1) * UpdatePageLength);\n\n                Set(Packet<AnimeMatrixPacket>(0xC0, 0x02)\n                    .AppendData(BitConverter.GetBytes((ushort)(start + 1)))\n                    .AppendData(BitConverter.GetBytes((ushort)(end - start)))\n                    .AppendData(_displayBuffer[start..end])\n                );\n\n                page++;\n            }\n\n            Set(Packet<AnimeMatrixPacket>(0xC0, 0x03));\n        }\n\n\n        private void LoadMFont()\n        {\n            byte[] fontData = GHelper.Properties.Resources.MFont;\n            IntPtr fontPtr = System.Runtime.InteropServices.Marshal.AllocCoTaskMem(fontData.Length);\n            System.Runtime.InteropServices.Marshal.Copy(fontData, 0, fontPtr, fontData.Length);\n            uint dummy = 0;\n\n            fonts.AddMemoryFont(fontPtr, GHelper.Properties.Resources.MFont.Length);\n            AddFontMemResourceEx(fontPtr, (uint)GHelper.Properties.Resources.MFont.Length, IntPtr.Zero, ref dummy);\n            System.Runtime.InteropServices.Marshal.FreeCoTaskMem(fontPtr);\n        }\n\n\n        public void PresentNextFrame()\n        {\n            if (frameIndex >= frames.Count) frameIndex = 0;\n            _displayBuffer = frames[frameIndex];\n            Present();\n            frameIndex++;\n        }\n\n        public void ClearFrames()\n        {\n            frames.Clear();\n            frameIndex = 0;\n        }\n\n        public void AddFrame()\n        {\n            frames.Add(_displayBuffer.ToArray());\n        }\n\n        public int Width(int y)\n        {\n            switch (_model)\n            {\n                case AnimeType.GA401:\n                    return 33;\n                case AnimeType.GU604:\n                    return 39;\n                case AnimeType.STRIX:\n                    return 1 + y / 2;\n                default:\n                    return 34;\n            }\n        }\n\n        public int FirstX(int y)\n        {\n            switch (_model)\n            {\n                case AnimeType.GA401:\n                    if (y < 5 && y % 2 == 0)\n                    {\n                        return 1;\n                    }\n                    return (int)Math.Ceiling(Math.Max(0, y - FullRows) / 2F);\n                case AnimeType.GU604:\n                    if (y < 9 && y % 2 == 0)\n                    {\n                        return 1;\n                    }\n                    return (int)Math.Ceiling(Math.Max(0, y - FullRows) / 2F);\n                default:\n                    return (int)Math.Ceiling(Math.Max(0, y - FullRows) / 2F);\n            }\n        }\n\n\n        public int Pitch(int y)\n        {\n            switch (_model)\n            {\n                case AnimeType.GA401:\n                    switch (y)\n                    {\n                        case 0:\n                        case 2:\n                        case 4:\n                            return 33;\n                        case 1:\n                        case 3:\n                            return 35;\n                        default:\n                            return 36 - y / 2;\n                    }\n                case AnimeType.GU604:\n                    switch (y)\n                    {\n                        case 0:\n                        case 2:\n                        case 4:\n                        case 6:\n                        case 8:\n                            return 38;\n                        case 1:\n                        case 3:\n                        case 5:\n                        case 7:\n                        case 9:\n                            return 39;\n                        default:\n                            return Width(y) - FirstX(y);\n                    }\n                default:\n                    return Width(y) - FirstX(y);\n            }\n        }\n\n\n        public int RowToLinearAddress(int y)\n        {\n            int ret = LedStart;\n            for (var i = 0; i < y; i++)\n                ret += Pitch(i);\n\n            return ret;\n        }\n\n        public void SetLedPlanar(int x, int y, byte value)\n        {\n            if (!IsRowInRange(y)) return;\n\n            if (x >= FirstX(y) && x < Width(y))\n                SetLedLinear(RowToLinearAddress(y) - FirstX(y) + x, value);\n            }\n\n        public void SetLedDiagonal(int x, int y, byte color, int deltaX = 0, int deltaY = 0)\n        {\n            x += deltaX;\n            y -= deltaY;\n\n            int plX = (x - y) / 2;\n            int plY = x + y;\n\n            if (x - y == -1) plX = -1;\n\n            SetLedPlanar(plX, plY, color);\n        }\n\n\n        public void SetLedLinear(int address, byte value)\n        {\n            if (!IsAddressableLed(address)) return;\n            _displayBuffer[address] = value;\n        }\n\n\n        public void Clear(bool present = false)\n        {\n            for (var i = 0; i < _displayBuffer.Length; i++) _displayBuffer[i] = 0;\n            if (present) Present();\n        }\n\n        private void SetBitmapDiagonal(Bitmap bmp, int deltaX = 0, int deltaY = 0, int contrast = 100, int gamma = 0)\n        {\n            for (int y = 0; y < bmp.Height; y++)\n            {\n                for (int x = 0; x < bmp.Width; x++)\n                {\n                    var pixel = bmp.GetPixel(x, y);\n                    var color = Math.Min((pixel.R + pixel.G + pixel.B + gamma) * contrast / 300, 255);\n                    if (color > 20)\n                        SetLedDiagonal(x, y, (byte)color, deltaX, deltaY - (FullRows / 2) - 1);\n                }\n            }\n        }\n\n        private void SetBitmapLinear(Bitmap bmp, int contrast = 100, int gamma = 0)\n        {\n            for (int y = 0; y < bmp.Height; y++)\n            {\n                for (int x = 0; x < bmp.Width; x++)\n                    if (x % 2 == y % 2)\n                    {\n                        var pixel = bmp.GetPixel(x, y);\n                        var color = Math.Min((pixel.R + pixel.G + pixel.B + gamma) * contrast / 300, 255);\n                        if (color > 20)\n                            SetLedPlanar(x / 2, y, (byte)color);\n                    }\n            }\n        }\n\n        public void Text(string text, float fontSize = 10, int x = 0, int y = 0)\n        {\n\n            int width = MaxRows;\n            int height = MaxRows - FullRows;\n            int textHeight, textWidth;\n\n            using (Bitmap bmp = new Bitmap(width, height))\n            {\n                using (Graphics g = Graphics.FromImage(bmp))\n                {\n                    g.CompositingQuality = CompositingQuality.HighQuality;\n                    g.SmoothingMode = SmoothingMode.AntiAlias;\n                    g.TextRenderingHint = TextRenderingHint.SingleBitPerPixel;\n\n                    using (Font font = new Font(fonts.Families[0], fontSize, FontStyle.Regular, GraphicsUnit.Pixel))\n                    {\n                        SizeF textSize = g.MeasureString(text, font);\n                        textHeight = (int)textSize.Height;\n                        textWidth = (int)textSize.Width;\n                        g.DrawString(text, font, Brushes.White, x, height - y);\n                    }\n                }\n\n                SetBitmapDiagonal(bmp, 5, height);\n\n            }\n        }\n\n        public void PresentClock()\n        {\n            string timeFormat = AppConfig.GetString(\"matrix_time\", \"HH:mm\");\n            string dateFormat = AppConfig.GetString(\"matrix_date\", \"yy.MM.dd\");\n\n            if (DateTime.Now.Second % 2 != 0) timeFormat = timeFormat.Replace(\":\", \"  \");\n\n            Clear();\n            switch (_model)\n            {\n                case AnimeType.STRIX:\n                //case AnimeType.GA402:\n                    Text(DateTime.Now.ToString(timeFormat), 15, 4, 20);\n                    break;\n                default:\n                    Text(DateTime.Now.ToString(timeFormat), 15, 7 - FullRows / 2, 25);\n                    Text(DateTime.Now.ToString(dateFormat), 11.5F, 0, 14);\n                    break;\n            }\n            Present();\n\n        }\n\n        public void DrawBar(int pos, double h)\n        {\n            switch (_model)\n            {\n                //case AnimeType.GA402:\n                case AnimeType.STRIX:\n                    DrawBarDiagonal(pos, h);\n                    break;\n                default:\n                    DrawBarPlanar(pos, h);\n                    break;\n            }\n        }\n\n        public void DrawBarPlanar(int pos, double h)\n        {\n            int dx = pos * 2;\n            int dy = 20;\n\n            byte color;\n\n            for (int y = 0; y < h - (h % 2); y++)\n                for (int x = 0; x < 2 - (y % 2); x++)\n                {\n                    //color = (byte)(Math.Min(1,(h - y - 2)*2) * 255);\n                    SetLedPlanar(x + dx, dy + y, (byte)(h * 255 / 30));\n                    SetLedPlanar(x + dx, dy - y, 255);\n                }\n        }\n\n        public void DrawBarDiagonal(int pos, double h)\n        {\n            int dx = pos * 2;\n            int dy = 0;\n\n            byte color;\n\n            for (int y = 0; y < h/2 ; y++)\n                for (int x = 0; x < 2 ; x++)\n                {\n                    color = (byte)(Math.Min(1, (h - y - 2) * 2) * 255);\n                    SetLedDiagonal(x + dx, dy - y, (byte)(h * 255 / 30), 10, -(FullRows/2));\n                }\n        }\n\n        public void GenerateFrame(Image image, float zoom = 100, int panX = 0, int panY = 0, InterpolationMode quality = InterpolationMode.Default, int contrast = 100, int gamma = 0)\n        {\n            int width = MaxColumns / 2 * 6;\n            int height = MaxRows;\n\n            int targetWidth = MaxColumns * 2;\n\n            float scale;\n\n            using (Bitmap bmp = new Bitmap(targetWidth, height))\n            {\n                scale = Math.Min((float)width / (float)image.Width, (float)height / (float)image.Height) * zoom / 100;\n\n                using (var graph = Graphics.FromImage(bmp))\n                {\n                    var scaleWidth = (float)(image.Width * scale);\n                    var scaleHeight = (float)(image.Height * scale);\n\n                    graph.InterpolationMode = quality;\n                    graph.CompositingQuality = CompositingQuality.HighQuality;\n                    graph.SmoothingMode = SmoothingMode.AntiAlias;\n\n                    graph.DrawImage(image, (float)Math.Round(targetWidth - (scaleWidth + panX) * targetWidth / width), -panY, (float)Math.Round(scaleWidth * targetWidth / width), scaleHeight);\n\n                }\n\n                Clear();\n                SetBitmapLinear(bmp, contrast, gamma);\n            }\n        }\n\n        public void GenerateFrameDiagonal(Image image, float zoom = 100, int panX = 0, int panY = 0, InterpolationMode quality = InterpolationMode.Default, int contrast = 100, int gamma = 0)\n        {\n            int width = MaxRows + FullRows;\n            int height = MaxColumns + FullRows;\n\n            if ((image.Height / image.Width) > (height / width)) height = MaxColumns;\n\n            float scale;\n\n            using (Bitmap bmp = new Bitmap(width, height))\n            {\n                scale = Math.Min((float)width / (float)image.Width, (float)height / (float)image.Height) * zoom / 100;\n\n                using (var graph = Graphics.FromImage(bmp))\n                {\n                    var scaleWidth = (float)(image.Width * scale);\n                    var scaleHeight = (float)(image.Height * scale);\n\n                    graph.InterpolationMode = quality;\n                    graph.CompositingQuality = CompositingQuality.HighQuality;\n                    graph.SmoothingMode = SmoothingMode.AntiAlias;\n\n                    graph.DrawImage(image, (width - scaleWidth) / 2, height - scaleHeight, scaleWidth, scaleHeight);\n\n                }\n\n                Clear();\n                SetBitmapDiagonal(bmp, -panX, height + panY, contrast, gamma);\n            }\n        }\n\n\n        private bool IsRowInRange(int row)\n        {\n            return (row >= 0 && row < MaxRows);\n        }\n\n        private bool IsAddressableLed(int address)\n        {\n            return (address >= 0 && address < LedCount);\n        }\n    }\n}"
  },
  {
    "path": "app/AnimeMatrix/Communication/Device.cs",
    "content": "﻿// Source thanks to https://github.com/vddCore/Starlight :)\n\nusing GHelper.AnimeMatrix.Communication.Platform;\n\nnamespace GHelper.AnimeMatrix.Communication\n{\n    public abstract class Device : IDisposable\n    {\n        protected UsbProvider? _usbProvider;\n\n        protected ushort _vendorId;\n        protected ushort _productId;\n        protected int _maxFeatureReportLength;\n\n        protected Device(ushort vendorId, ushort productId)\n        {\n            _vendorId = vendorId;\n            _productId = productId;\n        }\n\n        protected Device(ushort vendorId, ushort productId, int maxFeatureReportLength)\n        {\n            _vendorId = vendorId;\n            _productId = productId;\n            _maxFeatureReportLength = maxFeatureReportLength;\n            SetProvider();\n        }\n\n        public ushort VendorID()\n        {\n            return _vendorId;\n        }\n\n        public ushort ProductID()\n        {\n            return _productId;\n        }\n\n        public virtual void SetProvider()\n        {\n            _usbProvider = new WindowsUsbProvider(_vendorId, _productId, _maxFeatureReportLength);\n        }\n\n        protected T Packet<T>(params byte[] command) where T : Packet\n        {\n            return (T)Activator.CreateInstance(typeof(T), command)!;\n        }\n\n        public void Set(Packet packet)\n            => _usbProvider?.Set(packet.Data);\n\n        public byte[] Get(Packet packet)\n            => _usbProvider?.Get(packet.Data);\n\n        public void Read(byte[] data)\n            => _usbProvider?.Read(data);\n        public void Write(byte[] data)\n            => _usbProvider?.Write(data);\n\n        public virtual void Dispose()\n        {\n            _usbProvider?.Dispose();\n        }\n    }\n}"
  },
  {
    "path": "app/AnimeMatrix/Communication/Packet.cs",
    "content": "﻿// Source thanks to https://github.com/vddCore/Starlight :)\n\nnamespace GHelper.AnimeMatrix.Communication\n{\n    public abstract class Packet\n    {\n        private int _currentDataIndex = 1;\n\n        public byte[] Data { get; }\n\n        internal Packet(byte reportId, int packetLength, params byte[] data)\n        {\n            if (packetLength < 1)\n            {\n                throw new ArgumentOutOfRangeException(\n                    nameof(packetLength),\n                    \"Packet length must be at least 1.\"\n                );\n            }\n\n            Data = new byte[packetLength];\n            Data[0] = reportId;\n\n            if (data.Length > 0)\n            {\n                if (_currentDataIndex >= Data.Length)\n                {\n                    throw new ArgumentOutOfRangeException(\n                        nameof(data),\n                        \"Your packet length does not allow for initial data to be appended.\"\n                    );\n                }\n\n                AppendData(data);\n            }\n        }\n\n        public Packet AppendData(params byte[] data)\n            => AppendData(out _, data);\n\n        public Packet AppendData(out int bytesWritten, params byte[] data)\n        {\n            bytesWritten = 0;\n\n            for (var i = 0;\n                 i < data.Length && _currentDataIndex < Data.Length - 1;\n                 i++, bytesWritten++, _currentDataIndex++)\n            {\n                if (_currentDataIndex > Data.Length - 1)\n                    break;\n\n                Data[_currentDataIndex] = data[i];\n            }\n\n            return this;\n        }\n    }\n}"
  },
  {
    "path": "app/AnimeMatrix/Communication/Platform/UsbProvider.cs",
    "content": "namespace GHelper.AnimeMatrix.Communication.Platform\n{\n    public abstract class UsbProvider : IDisposable\n    {\n        protected ushort VendorID { get; }\n        protected ushort ProductID { get; }\n\n        protected UsbProvider(ushort vendorId, ushort productId)\n        {\n            VendorID = vendorId;\n            ProductID = productId;\n        }\n\n        public abstract void Set(byte[] data);\n        public abstract byte[] Get(byte[] data);\n        public abstract void Read(byte[] data);\n        public abstract void Write(byte[] data);\n\n        public abstract void Dispose();\n    }\n}"
  },
  {
    "path": "app/AnimeMatrix/Communication/Platform/WindowsUsbProvider.cs",
    "content": "using System.ComponentModel;\nusing HidSharp;\n\nnamespace GHelper.AnimeMatrix.Communication.Platform\n{\n    internal class WindowsUsbProvider : UsbProvider\n    {\n        protected HidDevice HidDevice { get; }\n        protected HidStream HidStream { get; }\n\n        public WindowsUsbProvider(ushort vendorId, ushort productId, string path, int timeout = 500) : base(vendorId, productId)\n        {\n            try\n            {\n                HidDevice = DeviceList.Local.GetHidDevices(vendorId, productId)\n                   .First(x => x.DevicePath.Contains(path));\n            }\n            catch\n            {\n                throw new IOException(\"HID device was not found on your machine.\");\n            }\n\n            var config = new OpenConfiguration();\n            config.SetOption(OpenOption.Interruptible, true);\n            config.SetOption(OpenOption.Exclusive, false);\n            config.SetOption(OpenOption.Priority, 10);\n            HidStream = HidDevice.Open(config);\n            HidStream.ReadTimeout = timeout;\n            HidStream.WriteTimeout = timeout;\n        }\n\n        public WindowsUsbProvider(ushort vendorId, ushort productId, int maxFeatureReportLength)\n            : base(vendorId, productId)\n        {\n            try\n            {\n                HidDevice = DeviceList.Local\n                    .GetHidDevices(vendorId, productId)\n                    .First(x => x.GetMaxFeatureReportLength() >= maxFeatureReportLength);\n                Logger.WriteLine(\"Matrix Device: \" + HidDevice.DevicePath + \" \" + HidDevice.GetMaxFeatureReportLength());\n            }\n            catch\n            {\n                throw new IOException(\"Matrix control device was not found on your machine.\");\n            }\n\n            var config = new OpenConfiguration();\n            config.SetOption(OpenOption.Interruptible, true);\n            config.SetOption(OpenOption.Exclusive, false);\n            config.SetOption(OpenOption.Priority, 10);\n\n            HidStream = HidDevice.Open(config);\n        }\n\n        public override void Set(byte[] data)\n        {\n            WrapException(() =>\n            {\n                HidStream.SetFeature(data);\n                HidStream.Flush();\n            });\n        }\n\n        public override byte[] Get(byte[] data)\n        {\n            var outData = new byte[data.Length];\n            Array.Copy(data, outData, data.Length);\n\n            WrapException(() =>\n            {\n                HidStream.GetFeature(outData);\n                HidStream.Flush();\n            });\n\n            return data;\n        }\n\n        public override void Read(byte[] data)\n        {\n            WrapException(() =>\n            {\n                HidStream.Read(data);\n            });\n        }\n\n        public override void Write(byte[] data)\n        {\n            WrapException(() =>\n            {\n                HidStream.Write(data);\n                HidStream.Flush();\n            });\n        }\n\n        public override void Dispose()\n        {\n            HidStream.Dispose();\n        }\n\n        private void WrapException(Action action)\n        {\n            try\n            {\n                action();\n            }\n            catch (IOException e)\n            {\n                if (e.InnerException is Win32Exception w32e)\n                {\n                    if (w32e.NativeErrorCode != 0)\n                    {\n                        throw;\n                    }\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "app/AnimeMatrix/SlashDevice.cs",
    "content": "﻿using GHelper.AnimeMatrix.Communication;\nusing System.Management;\nusing System.Text;\n\nnamespace GHelper.AnimeMatrix\n{\n    public enum SlashMode\n    {\n        Bounce,\n        Slash,\n        Loading,\n        BitStream,\n        Transmission,\n        Flow,\n        Flux,\n        Phantom,\n        Spectrum,\n        Hazard,\n        Interfacing,\n        Ramp,\n        GameOver,\n        Start,\n        Buzzer,\n        Static,\n        FX1,\n        FX2,\n        FX3,\n        BatteryLevel,\n        Audio,\n        AudioSpectrum\n    }\n\n    public class SlashPacket : Packet\n    {\n        public SlashPacket(byte[] command, byte reportID = 0x5E) : base(reportID, 128, command)\n        {\n        }\n    }\n\n\n    public class SlashDevice : Device\n    {\n\n        protected virtual byte reportID => 0x5E;\n\n        protected virtual SlashPacket CreatePacket(byte[] command)\n        {\n            return new SlashPacket(command, reportID);\n        }\n\n        public static Dictionary<SlashMode, string> Modes = new Dictionary<SlashMode, string>\n        {\n            { SlashMode.Bounce, Properties.Strings.SlashBounce},\n            { SlashMode.Slash, Properties.Strings.SlashMode},\n            { SlashMode.Loading, Properties.Strings.SlashLoading},\n\n            { SlashMode.BitStream, Properties.Strings.SlashBitStream},\n            { SlashMode.Transmission, Properties.Strings.SlashTransmission},\n\n            { SlashMode.Flow, Properties.Strings.SlashFlow},\n            { SlashMode.Flux, Properties.Strings.SlashFlux},\n            { SlashMode.Phantom, Properties.Strings.SlashPhantom},\n            { SlashMode.Spectrum, Properties.Strings.SlashSpectrum},\n\n            { SlashMode.Hazard, Properties.Strings.SlashHazard},\n            { SlashMode.Interfacing, Properties.Strings.SlashInterfacing},\n            { SlashMode.Ramp, Properties.Strings.SlashRamp},\n\n            { SlashMode.GameOver, Properties.Strings.SlashGameOver},\n            { SlashMode.Start, Properties.Strings.SlashStart},\n            { SlashMode.Buzzer, Properties.Strings.SlashBuzzer},\n\n            { SlashMode.Static, Properties.Strings.SlashStatic},\n\n            { SlashMode.FX1, \"FX1\"},\n            { SlashMode.FX2, \"FX2\"},\n            { SlashMode.FX3, \"FX3\"},\n\n            { SlashMode.BatteryLevel, Properties.Strings.SlashBatteryLevel},\n            { SlashMode.Audio, Properties.Strings.MatrixAudio}\n\n        };\n\n        private static Dictionary<SlashMode, byte> modeCodes = new Dictionary<SlashMode, byte>\n        {\n            { SlashMode.Static, 0x06},\n            { SlashMode.Bounce, 0x10},\n            { SlashMode.Slash, 0x12},\n            { SlashMode.Loading, 0x13},\n\n            { SlashMode.BitStream, 0x1D},\n            { SlashMode.Transmission, 0x1A},\n\n            { SlashMode.Flow, 0x19},\n            { SlashMode.Flux, 0x25},\n            { SlashMode.Phantom, 0x24},\n            { SlashMode.Spectrum, 0x26},\n\n            { SlashMode.Hazard, 0x32},\n            { SlashMode.Interfacing, 0x33},\n            { SlashMode.Ramp, 0x34},\n\n            { SlashMode.GameOver, 0x42},\n            { SlashMode.Start, 0x43},\n            { SlashMode.Buzzer, 0x44},\n\n            { SlashMode.FX1, 0x60},\n            { SlashMode.FX2, 0x61},\n            { SlashMode.FX3, 0x62},\n        };\n\n        public SlashDevice(ushort productId = 0x193B) : base(0x0B05, productId, 128)\n        {\n        }\n\n        public void WakeUp()\n        {\n            Set(CreatePacket(Encoding.ASCII.GetBytes(\"ASUS Tech.Inc.\")), \"SlashWakeUp\");\n            Set(CreatePacket([0xC2]), \"SlashWakeUp\");\n            Set(CreatePacket([0xD1, 0x01, 0x00, 0x01 ]), \"SlashWakeUp\");\n        }\n\n        public void Init()\n        {\n            Set(CreatePacket([0xD7, 0x00, 0x00, 0x01, 0xAC]), \"SlashInit\");\n            Set(CreatePacket([0xD2, 0x02, 0x01, 0x08, 0xAB]), \"SlashInit\");\n        }\n\n        public void SetEnabled(bool status = true)\n        {\n            Set(CreatePacket([0xD8, 0x02, 0x00, 0x01, status ? (byte)0x00 : (byte)0x80]), $\"SlashEnable {status}\");\n        }\n\n        public void Save()\n        {\n            Set(CreatePacket([0xD4, 0x00, 0x00, 0x01, 0xAB]), \"SlashSave\");\n        }\n\n        public void SetMode(SlashMode mode)\n        {\n            byte modeByte;\n\n            try\n            {\n                modeByte = modeCodes[mode];\n            }\n            catch (Exception)\n            {\n                modeByte = 0x00;\n            }\n\n            Set(CreatePacket([0xD2, 0x03, 0x00, 0x0C]), \"SlashMode\");\n            //Set(CreatePacket([0xD3, 0x04, 0x00, 0x0C, 0x01, modeByte, 0x02, 0x19, 0x03, 0x13, 0x04, 0x11, 0x05, 0x12, 0x06, 0x13]), \"SlashMode\");\n            Set(CreatePacket([0xD3, 0x04, 0x00, 0x0C, 0x01, modeByte, 0x02, 0x42, 0x03, 0x13, 0x04, 0x11, 0x05, 0x12, 0x06, 0x13]), \"SlashMode\");\n        }\n\n        private byte[] GetPercentagePattern(int brightness, double percentage)\n        {\n            // because 7 segments, within each led segment represents a percentage bracket of (100/7 = 14.2857%)\n            // set brightness to reflect battery's percentage within that range\n\n            int bracket = (int)Math.Floor(percentage / 14.2857);\n            if (bracket >= 7) return Enumerable.Repeat((byte)(brightness * 85.333), 7).ToArray();\n\n            byte[] batteryPattern = Enumerable.Repeat((byte)(0x00), 7).ToArray();\n            for (int i = 6; i > 6 - bracket; i--)\n            {\n                batteryPattern[i] = (byte)(brightness * 85.333);\n            }\n\n            //set the \"selected\" bracket to the percentage of that bracket filled from 0 to 255 as a hex\n            batteryPattern[6 - bracket] = (byte)(((percentage % 14.2857) * brightness * 85.333) / 14.2857);\n\n            return batteryPattern;\n        }\n\n        public void SetBatteryPattern(int brightness)\n        {\n            SetCustom(GetPercentagePattern(brightness, 100 * (HardwareControl.GetBatteryChargePercentage() / AppConfig.Get(\"charge_limit\", 100))), null);\n        }\n\n        public void SetEmpty()\n        {\n            SetCustom(GetPercentagePattern(0, 0));\n        }\n\n        public void SetAudioPattern(int brightness, double bass, double treble)\n        {\n            byte[] payload = new byte[7];\n            double step = 100.0 / 7.0;\n            for (int i = 0; i < 7; i++)\n            {\n                double s = step * i, e = step * (i + 1);\n                if (bass > s) payload[6 - i] |= (byte)(Math.Min((bass - s) / (e - s), 1) * brightness * 0x20);\n                if (treble > s) payload[6 - i] |= (byte)(Math.Min((treble - s) / (e - s), 1) * brightness * 0x50);\n            }\n            ContinueCustom(payload, null);\n        }\n\n\n        public void SetCustom(byte[] data, string? log = \"Static Data\")\n        {\n            Set(CreatePacket([0xD2, 0x02, 0x01, 0x08, 0xAC]), null);\n            Set(CreatePacket([0xD3, 0x03, 0x01, 0x08, 0xAC, 0xFF, 0xFF, 0x01, 0x05, 0xFF, 0xFF]), null);\n            Set(CreatePacket([0xD4, 0x00, 0x00, 0x01, 0xAC]), null);\n            ContinueCustom(data, log);\n        }\n\n        public void ContinueCustom(byte[] data, string? log)\n        {\n            byte[] payload = new byte[] { 0xD3, 0x00, 0x00, 0x07 };\n            Set(CreatePacket(payload.Concat(data.Take(7)).ToArray()), log);\n        }\n\n        public void SetOptions(bool status, int brightness = 0, int interval = 0)\n        {\n            byte brightnessByte = (byte)(brightness * 85.333);\n\n            Set(CreatePacket([0xD3, 0x03, 0x01, 0x08, 0xAB, 0xFF, 0x01, status ? (byte)0x01 : (byte)0x00, 0x06, brightnessByte, 0xFF, (byte)interval]), \"SlashOptions\");\n        }\n\n        public void SetBatterySaver(bool status)\n        {\n            Set(CreatePacket([0xD8, 0x01, 0x00, 0x01, status ? (byte)0x80 : (byte)0x00]), $\"SlashBatterySaver {status}\");\n        }\n\n        public void SetLidCloseAnimation(bool status)\n        {\n            Set(CreatePacket([0xD8, 0x00, 0x00, 0x02, 0xA5, status ? (byte)0x00 : (byte)0x80]), $\"SlashLidCloseAnimation {status}\");\n        }\n\n        public void SetSleepActive(bool status)\n        {\n            Set(CreatePacket([0xD2, 0x02, 0x01, 0x08, 0xA1]), \"SlashSleepInit\");\n            Set(CreatePacket([0xD3, 0x03, 0x01, 0x08, 0xA1, 0x00, 0xFF, status ? (byte)0x01 : (byte)0x00, 0x02, 0xFF, 0xFF]), $\"SlashSleep {status}\");\n        }\n\n        public void Set(Packet packet, string? log = null)\n        {\n            _usbProvider?.Set(packet.Data);\n            if (log is not null) Logger.WriteLine($\"{log}:\" + BitConverter.ToString(packet.Data).Substring(0, 48));\n        }\n    }\n\n    public class SlashDeviceAura : SlashDevice\n    {\n        protected override byte reportID => 0x5D;\n\n        public SlashDeviceAura() : base(0x19B6)\n        {\n        }\n\n        protected override SlashPacket CreatePacket(byte[] command)\n        {\n            return new SlashPacket(command, reportID);\n        }\n\n    }\n}"
  },
  {
    "path": "app/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n\t<System.Windows.Forms.ApplicationConfigurationSection>\n\t\t<add key=\"DpiAwareness\" value=\"PerMonitorV2\" />\n\t</System.Windows.Forms.ApplicationConfigurationSection>\n\t<appSettings>\n\t\t<add key=\"EnableWindowsFormsHighDpiAutoResizing\" value=\"true\" />\n\t</appSettings>\n</configuration>\n\n"
  },
  {
    "path": "app/AppConfig.cs",
    "content": "using GHelper.Mode;\nusing System.Diagnostics;\nusing System.Management;\nusing System.Text.Json;\n\npublic static class AppConfig\n{\n\n    private static string configFile;\n\n    private static string? _model;\n    private static string? _modelShort;\n    private static string? _bios;\n\n    private static Dictionary<string, object> config = new Dictionary<string, object>();\n    private static System.Timers.Timer timer = new System.Timers.Timer(2000);\n    private static long lastWrite;\n\n    static AppConfig()\n    {\n\n        string startupPath = Application.StartupPath.Trim('\\\\');\n        string appPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + \"\\\\GHelper\";\n        string configName = \"\\\\config.json\";\n\n        if (File.Exists(startupPath + configName))\n        {\n            configFile = startupPath + configName;\n        }\n        else\n        {\n            configFile = appPath + configName;\n        }\n\n\n        if (!System.IO.Directory.Exists(appPath))\n            System.IO.Directory.CreateDirectory(appPath);\n\n        if (File.Exists(configFile))\n        {\n            string text = File.ReadAllText(configFile);\n            try\n            {\n                config = JsonSerializer.Deserialize<Dictionary<string, object>>(text);\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine($\"Broken config: {ex.Message} {text}\");\n                try\n                {\n                    text = File.ReadAllText(configFile + \".bak\");\n                    config = JsonSerializer.Deserialize<Dictionary<string, object>>(text);\n                }\n                catch (Exception exb)\n                {\n                    Logger.WriteLine($\"Broken backup config: {exb.Message} {text}\");\n                    File.Copy(configFile, configFile + \".old\", true);\n                    File.Copy(configFile + \".bak\", configFile + \".bak.old\", true);\n                    Init();\n                }\n            }\n        }\n        else\n        {\n            Init();\n        }\n\n        timer.Elapsed += Timer_Elapsed;\n\n    }\n\n    private static void Timer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)\n    {\n\n        timer.Stop();\n        string jsonString = JsonSerializer.Serialize(config, new JsonSerializerOptions { WriteIndented = true });\n        var backup = configFile + \".bak\";\n\n        try\n        {\n            File.WriteAllText(configFile, jsonString);\n            //Debug.WriteLine($\"{DateTime.Now}: Config write\");\n        }\n        catch (Exception)\n        {\n            Thread.Sleep(1000);\n            try\n            {\n                File.WriteAllText(configFile, jsonString);\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine(ex.Message);\n            }\n            return;\n        }\n\n        lastWrite = DateTimeOffset.Now.ToUnixTimeMilliseconds();\n\n        Thread.Sleep(5000);\n\n        if (Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastWrite) < 4000) return;\n\n        var backupText = File.ReadAllText(configFile);\n        bool isValid =\n            !string.IsNullOrWhiteSpace(backupText) &&\n            backupText.IndexOf('\\0') == -1 &&                     \n            backupText.StartsWith(\"{\") &&\n            backupText.Trim().EndsWith(\"}\") &&\n            backupText.Length >= 10;\n\n        if (isValid)\n        {\n            File.Copy(configFile, backup, true);\n            //Debug.WriteLine($\"{DateTime.Now}: Config backup\");\n        }\n        else\n        {\n            Logger.WriteLine(\"Error writing config\");\n        }\n\n    }\n\n    public static string GetModel()\n    {\n        if (_model is null)\n        {\n            _model = \"\";\n            try\n            {\n                using (var searcher = new ManagementObjectSearcher(@\"Select * from Win32_ComputerSystem\"))\n                {\n                    foreach (var process in searcher.Get())\n                    {\n                        _model = process[\"Model\"].ToString();\n                        break;\n                    }\n                }\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine(ex.Message);\n            }\n        }\n\n        //if (_model.Contains(\"GA402RK\")) _model = \"ROG Flow Z13 GZ302EA\"; // Debug Purposes\n\n        return _model;\n    }\n\n    public static (string, string) GetBiosAndModel()\n    {\n        if (_bios is not null && _modelShort is not null) return (_bios, _modelShort);\n\n        using (ManagementObjectSearcher objSearcher = new ManagementObjectSearcher(@\"SELECT * FROM Win32_BIOS\"))\n        {\n            using (ManagementObjectCollection objCollection = objSearcher.Get())\n            {\n                foreach (ManagementObject obj in objCollection)\n                    if (obj[\"SMBIOSBIOSVersion\"] is not null)\n                    {\n                        string[] results = obj[\"SMBIOSBIOSVersion\"].ToString().Split(\".\");\n                        if (results.Length > 1)\n                        {\n                            _modelShort = results[0];\n                            _bios = results[1];\n                        }\n                        else\n                        {\n                            _modelShort = obj[\"SMBIOSBIOSVersion\"].ToString();\n                        }\n                    }\n\n                return (_bios, _modelShort);\n            }\n        }\n    }\n\n    public static string GetModelShort()\n    {\n        string model = GetModel();\n        int trim = model.LastIndexOf(\"_\");\n        if (trim > 0) model = model.Substring(0, trim);\n        return model;\n    }\n\n    public static bool ContainsModel(string contains)\n    {\n        GetModel();\n        return (_model is not null && _model.ToLower().Contains(contains.ToLower()));\n    }\n\n\n    private static void Init()\n    {\n        config = new Dictionary<string, object>();\n        config[\"performance_mode\"] = 0;\n        string jsonString = JsonSerializer.Serialize(config);\n        File.WriteAllText(configFile, jsonString);\n    }\n\n    public static bool Exists(string name)\n    {\n        return config.ContainsKey(name);\n    }\n\n    public static int Get(string name, int empty = -1)\n    {\n        if (config.ContainsKey(name))\n        {\n            //Debug.WriteLine(name);\n            return int.Parse(config[name].ToString());\n        }\n        else\n        {\n            //Debug.WriteLine(name + \"E\");\n            return empty;\n        }\n    }\n\n    public static bool Is(string name)\n    {\n        return Get(name) == 1;\n    }\n\n    public static bool IsNotFalse(string name)\n    {\n        return Get(name) != 0;\n    }\n\n    public static bool IsOnBattery(string zone)\n    {\n        return Get(zone + \"_bat\", Get(zone)) != 0;\n    }\n\n    public static string GetString(string name, string empty = null)\n    {\n        if (config.ContainsKey(name))\n            return config[name].ToString();\n        else return empty;\n    }\n\n    private static void Write()\n    {\n        timer.Stop();\n        timer.Start();\n    }\n\n    public static void Set(string name, int value)\n    {\n        config[name] = value;\n        Write();\n    }\n\n    public static void Set(string name, string value)\n    {\n        config[name] = value;\n        Write();\n    }\n    public static void Remove(string name)\n    {\n        config.Remove(name);\n        Write();\n    }\n\n    public static void RemoveMode(string name)\n    {\n        Remove(name + \"_\" + Modes.GetCurrent());\n    }\n\n    public static string GgetParamName(AsusFan device, string paramName = \"fan_profile\")\n    {\n        int mode = Modes.GetCurrent();\n        string name;\n\n        switch (device)\n        {\n            case AsusFan.GPU:\n                name = \"gpu\";\n                break;\n            case AsusFan.Mid:\n                name = \"mid\";\n                break;\n            case AsusFan.XGM:\n                name = \"xgm\";\n                break;\n            default:\n                name = \"cpu\";\n                break;\n\n        }\n\n        return paramName + \"_\" + name + \"_\" + mode;\n    }\n\n    public static byte[] GetFanConfig(AsusFan device)\n    {\n        string curveString = GetString(GgetParamName(device));\n        byte[] curve = { };\n\n        if (curveString is not null)\n            curve = StringToBytes(curveString);\n\n        return curve;\n    }\n\n    public static void SetFanConfig(AsusFan device, byte[] curve)\n    {\n        string bitCurve = BitConverter.ToString(curve);\n        Set(GgetParamName(device), bitCurve);\n    }\n\n\n    public static byte[] StringToBytes(string str)\n    {\n        String[] arr = str.Split('-');\n        byte[] array = new byte[arr.Length];\n        for (int i = 0; i < arr.Length; i++) array[i] = Convert.ToByte(arr[i], 16);\n        return array;\n    }\n\n    public static byte[] GetDefaultCurve(AsusFan device)\n    {\n        int mode = Modes.GetCurrentBase();\n        byte[] curve;\n\n        switch (mode)\n        {\n            case AsusACPI.PerformanceTurbo:\n                switch (device)\n                {\n                    case AsusFan.GPU:\n                        return StringToBytes(\"1E-3F-44-48-4C-50-54-62-16-1F-26-2D-39-47-55-5F\");\n                    default:\n                        return StringToBytes(\"1E-3F-44-48-4C-50-54-62-11-1A-22-29-34-43-51-5A\");\n                }\n            case AsusACPI.PerformanceSilent:\n                switch (device)\n                {\n                    case AsusFan.GPU:\n                        return StringToBytes(\"1E-31-3B-42-47-50-5A-64-00-00-04-11-1B-23-28-2D\");\n                    default:\n                        return StringToBytes(\"1E-31-3B-42-47-50-5A-64-00-00-03-0C-14-1C-22-29\");\n                }\n            default:\n                switch (device)\n                {\n                    case AsusFan.GPU:\n                        return StringToBytes(\"3A-3D-40-44-48-4D-51-62-0C-16-1D-1F-26-2D-34-4A\");\n                    default:\n                        return StringToBytes(\"3A-3D-40-44-48-4D-51-62-08-11-16-1A-22-29-30-45\");\n                }\n        }\n\n    }\n\n    public static string GetModeString(string name)\n    {\n        return GetString(name + \"_\" + Modes.GetCurrent());\n    }\n\n    public static int GetMode(string name, int empty = -1)\n    {\n        return Get(name + \"_\" + Modes.GetCurrent(), empty);\n    }\n\n    public static bool IsMode(string name)\n    {\n        return Get(name + \"_\" + Modes.GetCurrent()) == 1;\n    }\n\n    public static void SetMode(string name, int value)\n    {\n        Set(name + \"_\" + Modes.GetCurrent(), value);\n    }\n\n    public static void SetMode(string name, string value)\n    {\n        Set(name + \"_\" + Modes.GetCurrent(), value);\n    }\n\n    public static bool IsAlly()\n    {\n        return ContainsModel(\"RC7\");\n    }\n\n    public static bool NoMKeys()\n    {\n        return (ContainsModel(\"Z13\") && !IsARCNM()) ||\n               ContainsModel(\"FX706\") ||\n               ContainsModel(\"FA706\") ||\n               ContainsModel(\"FA506\") ||\n               ContainsModel(\"FX506\") ||\n               ContainsModel(\"Duo\") ||\n               ContainsModel(\"FX505\");\n    }\n\n    public static bool IsARCNM()\n    {\n        return ContainsModel(\"GZ301VIC\");\n    }\n\n    public static bool IsTUF()\n    {\n        return ContainsModel(\"TUF\") || ContainsModel(\"TX Gaming\") || ContainsModel(\"TX Air\");\n    }\n\n    public static bool IsProArt()\n    {\n        return ContainsModel(\"ProArt\");\n    }\n\n    public static bool IsVivoZenbook()\n    {\n        return ContainsModel(\"Vivobook\") || ContainsModel(\"Zenbook\") || ContainsModel(\"EXPERTBOOK\") || ContainsModel(\" V16\");\n    }\n\n    public static bool IsVivoZenPro()\n    {\n        return ContainsModel(\"Vivobook\") || ContainsModel(\"Zenbook\") || ContainsModel(\"ProArt\") || ContainsModel(\"EXPERTBOOK\") || ContainsModel(\" V16\");\n    }\n\n    public static bool IsHardwareFnLock()\n    {\n        return IsVivoZenPro() || ContainsModel(\"GZ302EA\");\n    }\n\n    // Devices with bugged bios command to change brightness\n    public static bool SwappedBrightness()\n    {\n        return ContainsModel(\"FA506IEB\") || ContainsModel(\"FA506IH\") || ContainsModel(\"FA506IC\") || ContainsModel(\"FA506II\") || ContainsModel(\"FX506LU\") || ContainsModel(\"FX506IC\") || ContainsModel(\"FX506LH\") || ContainsModel(\"FA506IV\") || ContainsModel(\"FA706IC\") || ContainsModel(\"FA706IH\");\n    }\n\n\n    public static bool IsDUO()\n    {\n        return ContainsModel(\"Duo\") || ContainsModel(\"GX550\") || ContainsModel(\"GX551\") || ContainsModel(\"GX650\") || ContainsModel(\"UX840\") || ContainsModel(\"UX482\");\n    }\n\n    public static bool IsM4Button()\n    {\n        return IsDUO() || ContainsModel(\"GZ302EA\");\n    }\n\n    // G14 2020 has no aura, but media keys instead\n    public static bool NoAura()\n    {\n        return (ContainsModel(\"GA401I\") && !ContainsModel(\"GA401IHR\")) || ContainsModel(\"GA502IU\") || ContainsModel(\"HN7306\") || ContainsModel(\"M6500X\");\n    }\n\n    public static bool MediaKeys()\n    {\n        return (ContainsModel(\"GA401I\") && !ContainsModel(\"GA401IHR\")) || ContainsModel(\"G712L\") || ContainsModel(\"GX502L\");\n    }\n\n    public static bool IsSingleColor()\n    {\n        return ContainsModel(\"GA401\") || ContainsModel(\"FX517Z\") || ContainsModel(\"FX516P\") || ContainsModel(\"X13\") || IsARCNM() || ContainsModel(\"FA617N\") || ContainsModel(\"FA617X\") || NoAura() || Is(\"no_rgb\");\n    }\n\n    public static bool IsSleepBacklight()\n    {\n        return ContainsModel(\"FA617\") || ContainsModel(\"FX507\");\n    }\n\n    public static bool IsAnimeMatrix()\n    {\n        return ContainsModel(\"GA401\") || ContainsModel(\"GA402\") || ContainsModel(\"GU604V\") || ContainsModel(\"GU604V\") || ContainsModel(\"G835\") || ContainsModel(\"G815\") || ContainsModel(\"G635\") || ContainsModel(\"G615\");\n    }\n    \n    public static bool IsSlash()\n    {\n        return ContainsModel(\"GA403\") || ContainsModel(\"GU605\") || ContainsModel(\"GA605\");\n    }\n\n    public static bool IsSlashAura()\n    {\n        return ContainsModel(\"GA605\") || ContainsModel(\"GU605C\") || ContainsModel(\"GA403W\") || ContainsModel(\"GA403UM\") || ContainsModel(\"GA403UP\") || ContainsModel(\"GA403UH\");\n    }\n\n    public static bool IsInputBacklight()\n    {\n        return ContainsModel(\"GA503\") || IsSlash() || IsVivoZenPro();\n    }\n\n    public static bool IsInvertedFNLock()\n    {\n        return ContainsModel(\"M140\") || ContainsModel(\"S550\") || ContainsModel(\"P540\") || IsTUF();\n    }\n\n    public static bool IsOLED()\n    {\n        return ContainsModel(\"OLED\") || IsSlash() || ContainsModel(\"M7600\") || ContainsModel(\"UX64\") || ContainsModel(\"UX34\") || ContainsModel(\"UX53\") || ContainsModel(\"K360\") || ContainsModel(\"X150\") || ContainsModel(\"M340\") || ContainsModel(\"M350\") || ContainsModel(\"K650\") || ContainsModel(\"UM53\") || ContainsModel(\"K660\") || ContainsModel(\"UX84\") || ContainsModel(\"M650\") || ContainsModel(\"M550\") || ContainsModel(\"M540\") || ContainsModel(\"K340\") || ContainsModel(\"K350\") || ContainsModel(\"M140\") || ContainsModel(\"S540\") || ContainsModel(\"S550\") || ContainsModel(\"M7400\") || ContainsModel(\"N650\") || ContainsModel(\"HN7306\") || ContainsModel(\"H760\") || ContainsModel(\"UX5406\") || ContainsModel(\"M5606\") || ContainsModel(\"X513\") || ContainsModel(\"N7400\") || ContainsModel(\"UX760\");\n    }\n\n    public static bool IsNoOverdrive()\n    {\n        return Is(\"no_overdrive\");\n    }\n\n    public static bool IsNoSleepEvent()\n    {\n        return ContainsModel(\"FX505\");\n    }\n\n    public static bool IsStrix()\n    {\n        return ContainsModel(\"Strix\") || ContainsModel(\"Scar\") || ContainsModel(\"G703G\");\n    }\n\n    public static bool IsAdvancedRGB()\n    {\n        return IsStrix() || ContainsModel(\"GX650\");\n    }\n\n    public static bool IsBacklightZones()\n    {\n        return IsStrix() || IsZ13();\n    }\n\n    public static bool IsStrixLimitedRGB()\n    {\n        return ContainsModel(\"G614PM\") || ContainsModel(\"G614PP\") || ContainsModel(\"G614PR\") || ContainsModel(\"G512LI\") || ContainsModel(\"G513R\") || ContainsModel(\"G713QM\") || ContainsModel(\"G713PV\") || ContainsModel(\"G513IE\") || ContainsModel(\"G713RC\") || ContainsModel(\"G713IC\") || ContainsModel(\"G713PU\") || ContainsModel(\"G513QM\") || ContainsModel(\"G513QC\") || ContainsModel(\"G531G\") || ContainsModel(\"G615JMR\") || ContainsModel(\"G615LM\") || ContainsModel(\"G815LR\");\n    }\n\n    public static bool IsPossible4ZoneRGB()\n    {\n        return ContainsModel(\"G614JI_\") || ContainsModel(\"G614JV_\") || ContainsModel(\"G614JZ\") || ContainsModel(\"G614JU\") || IsStrixLimitedRGB();\n    }\n\n    public static bool Is4ZoneRGB()\n    {\n        return IsPossible4ZoneRGB() && !Is(\"per_key_rgb\");\n    }\n\n    public static bool IsHardwareHotkeys()\n    {\n        return ContainsModel(\"FX506\");\n    }\n\n    public static bool NoWMI()\n    {\n        return ContainsModel(\"GL704G\") || ContainsModel(\"GM501G\") || ContainsModel(\"GX501G\");\n    }\n\n    public static bool IsNoDirectRGB()\n    {\n        return ContainsModel(\"GA503\") || ContainsModel(\"G533Q\") || ContainsModel(\"GU502\") || ContainsModel(\"GU603\") || IsSlash() || IsAlly();\n    }\n\n    public static bool IsStrixNumpad()\n    {\n        return ContainsModel(\"G713R\");\n    }\n\n    public static bool IsZ1325()\n    {\n        return ContainsModel(\"GZ302E\");\n    }\n\n    public static bool IsZ13()\n    {\n        return ContainsModel(\"Z13\");\n    }\n\n    public static bool IsPZ13()\n    {\n        return ContainsModel(\"PZ13\");\n    }\n\n    public static bool IsS17()\n    {\n        return ContainsModel(\"S17\");\n    }\n\n    public static bool HasTabletMode()\n    {\n        return ContainsModel(\"X16\") || ContainsModel(\"X13\") || ContainsModel(\"Z13\");\n    }\n\n    public static bool IsX13()\n    {\n        return ContainsModel(\"X13\");\n    }\n\n    public static bool IsG14AMD()\n    {\n        return ContainsModel(\"GA402R\");\n    }\n\n    public static bool DynamicBoost5()\n    {\n        return ContainsModel(\"GZ301ZE\");\n    }\n\n    public static bool DynamicBoost15()\n    {\n        return ContainsModel(\"FX507ZC4\") || ContainsModel(\"GA403UM\") || ContainsModel(\"GU605CP\") || ContainsModel(\"FX608J\") || ContainsModel(\"FX608L\") || ContainsModel(\"FA608U\") || ContainsModel(\"FA608P\") || ContainsModel(\"FA608W\") ||\n               ContainsModel(\"FA401K\") || ContainsModel(\"FA401UM\") || ContainsModel(\"FA401UH\");\n    }\n\n    public static bool DynamicBoost20()\n    {\n        return ContainsModel(\"GU605\") || ContainsModel(\"GA605\");\n    }\n\n    public static bool IsAdvantageEdition()\n    {\n        return ContainsModel(\"13QY\");\n    }\n\n    public static bool NoAutoUltimate()\n    {\n        return ContainsModel(\"G614\") || ContainsModel(\"GU604\") || ContainsModel(\"FX507\") || ContainsModel(\"G513\") || ContainsModel(\"FA617\") || ContainsModel(\"G834\") || ContainsModel(\"GA403\") || ContainsModel(\"GU605\") || ContainsModel(\"GA605\") || ContainsModel(\"GU603VV\");\n    }\n\n    public static bool IsAlwaysUltimate()\n    {\n        return ContainsModel(\"FA507NUR\") || ContainsModel(\"FA506NCR\") || ContainsModel(\"FA507NVR\");\n    }\n\n    public static bool IsManualModeRequired()\n    {\n        if (!IsMode(\"auto_apply_power\")) return false;\n        return Is(\"manual_mode\") || ContainsModel(\"G733\");\n    }\n\n    public static bool IsResetRequired()\n    {\n        return ContainsModel(\"GA403\") || ContainsModel(\"FA507XV\");\n    }\n\n    public static bool IsFanRequired()\n    {\n        return ContainsModel(\"GA402X\") || ContainsModel(\"GU604\") || ContainsModel(\"G513\") || ContainsModel(\"G713R\") || ContainsModel(\"G713P\") || ContainsModel(\"GU605\") || ContainsModel(\"GA605\") || ContainsModel(\"G634J\") || ContainsModel(\"G834J\") || ContainsModel(\"G614J\") || ContainsModel(\"G814J\") || ContainsModel(\"FX507V\") || ContainsModel(\"FX507ZV\") || ContainsModel(\"FX608\") || ContainsModel(\"FA608P\") || ContainsModel(\"G614F\") || ContainsModel(\"G614R\") || ContainsModel(\"G733\") || ContainsModel(\"H7606\");\n    }\n\n    public static bool IsAMDLight()\n    {\n        return ContainsModel(\"GA402X\") || ContainsModel(\"GA605\") || ContainsModel(\"GA403\") || ContainsModel(\"FA507N\") || ContainsModel(\"FA507X\") || ContainsModel(\"FA707N\") || ContainsModel(\"FA707X\") || ContainsModel(\"GZ302\");\n    }\n\n    public static bool IsPowerRequired()\n    {\n        return ContainsModel(\"FX507\") || ContainsModel(\"FX517\") || ContainsModel(\"FX707\");\n    }\n\n    public static bool IsModeReapplyRequired()\n    {\n        return Is(\"mode_reapply\") || ContainsModel(\"FA401\");\n    }\n\n    public static bool IsGPUFix()\n    {\n        return Is(\"gpu_fix\") || (ContainsModel(\"GA402X\") && IsNotFalse(\"gpu_fix\"));\n    }\n\n    public static bool IsShutdownReset()\n    {\n        return Is(\"shutdown_reset\") || ContainsModel(\"FX507Z\");\n    }\n\n    public static bool IsNVPlatform()\n    {\n        return Is(\"nv_platform\");\n    }\n\n    public static bool IsForceSetGPUMode()\n    {\n        return Is(\"gpu_mode_force_set\") || (ContainsModel(\"503\") && IsNotFalse(\"gpu_mode_force_set\"));\n    }\n\n    public static bool IsAMDiGPU()\n    {\n        return ContainsModel(\"GV301RA\") || ContainsModel(\"GV302XA\") || ContainsModel(\"GZ302\") || IsFA401EA() || IsAlly();\n    }\n\n    public static bool NoGpu()\n    {\n        return Is(\"no_gpu\") || ContainsModel(\"UX540\") || ContainsModel(\"M560\") || ContainsModel(\"GZ302\") || IsFA401EA();\n    }\n\n    public static bool IsFA401EA()\n    {\n        return ContainsModel(\"FA401EA\");\n    }\n\n    public static bool IsHardwareTouchpadToggle()\n    {\n        return ContainsModel(\"FA507\");\n    }\n\n    public static bool IsIntelHX()\n    {\n        return ContainsModel(\"G814\") || ContainsModel(\"G614\") || ContainsModel(\"G834\") || ContainsModel(\"G634\") || ContainsModel(\"G835\") || ContainsModel(\"G635\") || ContainsModel(\"G815\") || ContainsModel(\"G615\");\n    }\n\n    public static bool Is8Ecores()\n    {\n        return ContainsModel(\"FX507Z\") || ContainsModel(\"GU603ZV\");\n    }\n\n    public static bool IsNoFNV()\n    {\n        return ContainsModel(\"FX507\") || ContainsModel(\"FX707\");\n    }\n\n    public static bool IsROG()\n    {\n        return ContainsModel(\"ROG\");\n    }\n    public static bool IsASUS()\n    {\n        return ContainsModel(\"ROG\") || ContainsModel(\"TUF\") || ContainsModel(\"Vivobook\") || ContainsModel(\"Zenbook\");\n    }\n\n    public static bool IsBWIcon()\n    {\n        return Is(\"bw_icon\");\n    }\n\n    public static bool IsStopAC()\n    {\n        return IsAlly() || Is(\"stop_ac\");\n    }\n\n    public static bool IsChargeLimit6080()\n    {\n        return ContainsModel(\"H760\") || ContainsModel(\"GA403\") || ContainsModel(\"GU605\") || ContainsModel(\"GA605\") || ContainsModel(\"GA503R\") || (IsTUF() && !(ContainsModel(\"FX507Z\") || ContainsModel(\"FA617\") || ContainsModel(\"FA607\")));\n\n    }\n\n    // 2024 Models support Dynamic Lighting\n    public static bool IsDynamicLighting()\n    {\n        return IsSlash() || IsIntelHX() || IsTUF() || IsZ13();\n    }\n\n    public static bool IsDynamicLightingOnly()\n    {\n        return ContainsModel(\"S560\") || ContainsModel(\"M540\") || ContainsModel(\"UX760\");\n    }\n\n    public static bool IsDynamicLightingInit()\n    {\n        return ContainsModel(\"FA608\") || Is(\"lighting_init\");\n    }\n\n    public static bool IsForceMiniled()\n    {\n        return ContainsModel(\"G834JYR\") || ContainsModel(\"G834JZR\") || ContainsModel(\"G634JZR\") || ContainsModel(\"G835LW\") || ContainsModel(\"G835LX\") || ContainsModel(\"G635LW\") || ContainsModel(\"G635LX\") || Is(\"force_miniled\");\n    }\n    public static bool SaveDimming()\n    {\n        return Is(\"save_dimming\");\n    }\n\n    public static bool IsAutoStatusLed()\n    {\n        return Is(\"auto_status_led\");\n    }\n\n    public static bool IsClampFanDots()\n    {\n        return Is(\"fan_clamp\") || (IsTUF() && IsNotFalse(\"fan_clamp\"));\n    }\n\n\n}\n"
  },
  {
    "path": "app/AsusACPI.cs",
    "content": "﻿using GHelper;\nusing GHelper.USB;\nusing System.Management;\nusing System.Runtime.InteropServices;\n\npublic enum AsusFan\n{\n    CPU = 0,\n    GPU = 1,\n    Mid = 2,\n    XGM = 3\n}\n\npublic enum AsusMode\n{\n    Balanced = 0,\n    Turbo = 1,\n    Silent = 2\n}\n\npublic enum AsusGPU\n{\n    Eco = 0,\n    Standard = 1,\n    Ultimate = 2\n}\n\npublic class AsusACPI\n{\n\n    const string FILE_NAME = @\"\\\\.\\\\ATKACPI\";\n    const uint CONTROL_CODE = 0x0022240C;\n\n    const uint DSTS = 0x53545344;\n    const uint DEVS = 0x53564544;\n    const uint INIT = 0x54494E49;\n    const uint WDOG = 0x474F4457;\n\n    public const uint UniversalControl = 0x00100021;\n\n    public const int Airplane = 0x88;\n    public const int KB_Light_Up = 0xc4;\n    public const int KB_Light_Down = 0xc5;\n    public const int Brightness_Down = 0x10;\n    public const int Brightness_Up = 0x20;\n    public const int KB_Sleep = 0x6c;\n\n    public const int KB_TouchpadToggle = 0x6b;\n    public const int KB_MuteToggle = 0x7c;\n    public const int KB_FNlockToggle = 0x4e;\n\n    public const int KB_DUO_PgUpDn = 0x4B;\n    public const int KB_DUO_SecondDisplay = 0x6A;\n\n    public const int Touchpad_Toggle = 0x6B;\n\n    public const int ChargerMode = 0x0012006C;\n\n    public const int ChargerUSB = 2;\n    public const int ChargerBarrel = 1;\n\n    public const uint CPU_Fan = 0x00110013;\n    public const uint GPU_Fan = 0x00110014;\n    public const uint Mid_Fan = 0x00110031;\n\n    public const uint BatteryDischarge = 0x0012005A;\n\n    public const uint StatusMode = 0x00090031;\n    public const uint PerformanceMode = 0x00120075; // Performance modes\n    public const uint VivoBookMode = 0x00110019; // Vivobook performance modes\n\n    public const uint GPUEcoROG = 0x00090020;\n    public const uint GPUEcoVivo = 0x00090120;\n\n    public const uint GPUXGConnected = 0x00090018;\n    public const uint GPUXG = 0x00090019;\n\n    public const uint GPUMuxROG = 0x00090016;\n    public const uint GPUMuxVivo = 0x00090026;\n\n    public const uint BatteryLimit = 0x00120057;\n\n    public const uint ScreenOverdrive = 0x00050019;\n    public const uint ScreenMiniled1 = 0x0005001E;\n    public const uint ScreenMiniled2 = 0x0005002E;\n    public const uint ScreenFHD = 0x0005001C;\n    public const uint ScreenHDRControl = 0x00050071;\n\n    public const uint ScreenOptimalBrightness = 0x0005002A;\n    public const uint ScreenInit = 0x00050011; // ?\n\n    public const uint DevsCPUFan = 0x00110022;\n    public const uint DevsGPUFan = 0x00110023;\n\n    public const uint DevsCPUFanCurve = 0x00110024;\n    public const uint DevsGPUFanCurve = 0x00110025;\n    public const uint DevsMidFanCurve = 0x00110032;\n\n    public const int Temp_CPU = 0x00120094;\n    public const int Temp_GPU = 0x00120097;\n\n    public const int PPT_APUA0 = 0x001200A0;  // sPPT (slow boost limit) / PL2\n    public const int PPT_EDCA1 = 0x001200A1;  // CPU EDC\n    public const int PPT_TDCA2 = 0x001200A2;  // CPU TDC\n    public const int PPT_APUA3 = 0x001200A3;  // SPL (sustained limit) / PL1\n\n    public const int PPT_CPUB0 = 0x001200B0;  // CPU PPT on 2022 (PPT_LIMIT_APU)\n    public const int PPT_CPUB1 = 0x001200B1;  // Total PPT on 2022 (PPT_LIMIT_SLOW)\n\n    public const int PPT_GPUC0 = 0x001200C0;  // NVIDIA GPU Boost\n    public const int PPT_APUC1 = 0x001200C1;  // fPPT (fast boost limit)\n    public const int PPT_GPUC2 = 0x001200C2;  // NVIDIA GPU Temp Target (75.. 87 C) \n\n    public const uint CORES_CPU = 0x001200D2; // Intel E-core and P-core configuration in a format 0x0[E]0[P]\n    public const uint CORES_MAX = 0x001200D3; // Maximum Intel E-core and P-core availability\n\n    public const uint GPU_BASE  = 0x00120099;  // Base part GPU TGP\n    public const uint GPU_POWER = 0x00120098;  // Additonal part of GPU TGP\n\n    public const int APU_MEM = 0x000600C1;\n\n    public const int TUF_KB_BRIGHTNESS = 0x00050021;\n    public const int KBD_BACKLIGHT_OOBE = 0x0005002F;\n\n    public const int TUF_KB = 0x00100056;\n    public const int TUF_KB2 = 0x0010005a;\n\n    public const int TUF_KB_STATE = 0x00100057;\n\n    public const int MicMuteLed = 0x00040017;\n    public const int SoundMuteLed = 0x0004001C;\n\n    public const int SlateMode = 0x00120063;\n    public const int TabletState = 0x00060077;\n    public const int TentState = 0x00060062;\n    public const int FnLock = 0x00100023;\n\n    public const int ScreenPadToggle = 0x00050031;\n    public const int ScreenPadBrightness = 0x00050032;\n\n    public const int CameraShutter = 0x00060078;\n    public const int CameraLed = 0x00060079;\n    public const int StatusLed = 0x000600C2;\n\n    public const int BootSound = 0x00130022;\n\n    public const int Tablet_Notebook = 0;\n    public const int Tablet_Tablet = 1;\n    public const int Tablet_Tent = 2;\n    public const int Tablet_Rotated = 3;\n\n    public const int PerformanceBalanced = 0;\n    public const int PerformanceTurbo = 1;\n    public const int PerformanceSilent = 2;\n    public const int PerformanceManual = 4;\n\n    public const int GPUModeEco = 0;\n    public const int GPUModeStandard = 1;\n    public const int GPUModeUltimate = 2;\n\n    public const int MinTotal = 5;\n\n    public static int MaxTotal = 150;\n    public static int DefaultTotal = 80;\n\n    public const int MinCPU = 5;\n    public static int MaxCPU = 100;\n    public const int DefaultCPU = 80;\n\n    public const int MinGPUBoost = 5;\n    public static int MaxGPUBoost = 25;\n\n    public static int MinGPUPower = 0;\n    public static int MaxGPUPower = 70;\n\n    public const int MinGPUTemp = 75;\n    public const int MaxGPUTemp = 87;\n\n    public const int PCoreMin = 4;\n    public const int ECoreMin = 0;\n\n    public const int PCoreMax = 16;\n    public const int ECoreMax = 16;\n\n    private bool? _allAMD = null;\n    private bool? _overdrive = null;\n\n    public static uint GPUEco => AppConfig.IsVivoZenPro() ? GPUEcoVivo : GPUEcoROG;\n    public static uint GPUMux => AppConfig.IsVivoZenPro() ? GPUMuxVivo : GPUMuxROG;\n\n    [DllImport(\"kernel32.dll\", SetLastError = true, CharSet = CharSet.Unicode)]\n    private static extern IntPtr CreateFile(\n        string lpFileName,\n        uint dwDesiredAccess,\n        uint dwShareMode,\n        IntPtr lpSecurityAttributes,\n        uint dwCreationDisposition,\n        uint dwFlagsAndAttributes,\n        IntPtr hTemplateFile\n    );\n\n    [DllImport(\"kernel32.dll\", SetLastError = true)]\n    private static extern bool DeviceIoControl(\n        IntPtr hDevice,\n        uint dwIoControlCode,\n        byte[] lpInBuffer,\n        uint nInBufferSize,\n        byte[] lpOutBuffer,\n        uint nOutBufferSize,\n        ref uint lpBytesReturned,\n        IntPtr lpOverlapped\n    );\n\n    [DllImport(\"kernel32.dll\", SetLastError = true)]\n    private static extern bool CloseHandle(IntPtr hObject);\n\n    private const uint GENERIC_READ = 0x80000000;\n    private const uint GENERIC_WRITE = 0x40000000;\n    private const uint OPEN_EXISTING = 3;\n    private const uint FILE_ATTRIBUTE_NORMAL = 0x80;\n    private const uint FILE_SHARE_READ = 1;\n    private const uint FILE_SHARE_WRITE = 2;\n\n    private IntPtr handle;\n\n    // Event handling attempt\n\n    [DllImport(\"kernel32.dll\", SetLastError = true)]\n    private static extern IntPtr CreateEvent(IntPtr lpEventAttributes, bool bManualReset, bool bInitialState, string lpName);\n\n    [DllImport(\"kernel32.dll\", SetLastError = true)]\n    private static extern bool WaitForSingleObject(IntPtr hHandle, int dwMilliseconds);\n\n    private IntPtr eventHandle;\n    private bool _connected = false;\n\n    // still works only with asus optimization service on , if someone knows how to get ACPI events from asus without that - let me know\n    public void RunListener()\n    {\n\n        eventHandle = CreateEvent(IntPtr.Zero, false, false, \"ATK4001\");\n\n        byte[] outBuffer = new byte[16];\n        byte[] data = new byte[8];\n        bool result;\n\n        data[0] = BitConverter.GetBytes(eventHandle.ToInt32())[0];\n        data[1] = BitConverter.GetBytes(eventHandle.ToInt32())[1];\n\n        Control(0x222400, data, outBuffer);\n        Logger.WriteLine(\"ACPI :\" + BitConverter.ToString(data) + \"|\" + BitConverter.ToString(outBuffer));\n\n        while (true)\n        {\n            WaitForSingleObject(eventHandle, Timeout.Infinite);\n            Control(0x222408, new byte[0], outBuffer);\n            int code = BitConverter.ToInt32(outBuffer);\n            Logger.WriteLine(\"ACPI Code: \" + code);\n        }\n    }\n\n    public bool IsConnected()\n    {\n        return _connected;\n    }\n\n    public AsusACPI()\n    {\n        try\n        {\n            handle = CreateFile(\n                FILE_NAME,\n                GENERIC_READ | GENERIC_WRITE,\n                FILE_SHARE_READ | FILE_SHARE_WRITE,\n                IntPtr.Zero,\n                OPEN_EXISTING,\n                FILE_ATTRIBUTE_NORMAL,\n                IntPtr.Zero\n            );\n\n            //handle = new IntPtr(-1);\n            //throw new Exception(\"ERROR\");\n            _connected = true;\n\n        }\n        catch (Exception ex)\n        {\n            Logger.WriteLine($\"Can't connect to ACPI: {ex.Message}\");\n        }\n\n        if (AppConfig.IsAdvantageEdition())\n        {\n            MaxTotal = 250;\n        }\n\n        if (AppConfig.IsG14AMD())\n        {\n            DefaultTotal = 125;\n        }\n\n        if (AppConfig.IsX13())\n        {\n            MaxTotal = 75;\n            DefaultTotal = 50;\n        }\n\n        if (AppConfig.IsAlly())\n        {\n            MaxTotal = 50;\n            DefaultTotal = 30;\n        }\n\n        if (AppConfig.IsIntelHX())\n        {\n            MaxTotal = 175;\n        }\n\n        if (AppConfig.DynamicBoost5())\n        {\n            MaxGPUBoost = 5;\n        }\n\n        if (AppConfig.DynamicBoost15())\n        {\n            MaxGPUBoost = 15;\n        }\n\n        if (AppConfig.DynamicBoost20())\n        {\n            MaxGPUBoost = 20;\n        }\n\n        if (AppConfig.IsAMDLight())\n        {\n            MaxTotal = 90;\n        }\n\n        if (AppConfig.IsZ1325())\n        {\n            MaxTotal = 93;\n        }\n\n        if (AppConfig.IsFA401EA())\n        {\n            MaxTotal = 115;\n            MaxCPU = 115;\n        }\n\n    }\n\n    public void Control(uint dwIoControlCode, byte[] lpInBuffer, byte[] lpOutBuffer)\n    {\n\n        uint lpBytesReturned = 0;\n        DeviceIoControl(\n            handle,\n            dwIoControlCode,\n            lpInBuffer,\n            (uint)lpInBuffer.Length,\n            lpOutBuffer,\n            (uint)lpOutBuffer.Length,\n            ref lpBytesReturned,\n            IntPtr.Zero\n        );\n    }\n\n    public void Close()\n    {\n        CloseHandle(handle);\n    }\n\n\n    protected byte[] CallMethod(uint MethodID, byte[] args)\n    {\n        byte[] acpiBuf = new byte[8 + args.Length];\n        byte[] outBuffer = new byte[16];\n\n        BitConverter.GetBytes((uint)MethodID).CopyTo(acpiBuf, 0);\n        BitConverter.GetBytes((uint)args.Length).CopyTo(acpiBuf, 4);\n        Array.Copy(args, 0, acpiBuf, 8, args.Length);\n\n        // if (MethodID == DEVS)  Debug.WriteLine(BitConverter.ToString(acpiBuf, 0, acpiBuf.Length));\n\n        Control(CONTROL_CODE, acpiBuf, outBuffer);\n\n        return outBuffer;\n\n    }\n\n    public byte[] DeviceInit()\n    {\n        byte[] args = new byte[8];\n        return CallMethod(INIT, args);\n\n    }\n\n    public byte[] DeviceWatchDog()\n    {\n        byte[] args = new byte[8];\n        return CallMethod(WDOG, args);\n\n    }\n\n    public int DeviceSet(uint DeviceID, int Status, string? logName)\n    {\n        byte[] args = new byte[8];\n        BitConverter.GetBytes((uint)DeviceID).CopyTo(args, 0);\n        BitConverter.GetBytes((uint)Status).CopyTo(args, 4);\n\n        byte[] status = CallMethod(DEVS, args);\n        int result = BitConverter.ToInt32(status, 0);\n\n        if (logName is not null)\n            Logger.WriteLine(logName + \" = \" + Status + \" : \" + (result == 1 ? \"OK\" : result));\n\n        return result;\n    }\n\n\n    public int DeviceSet(uint DeviceID, byte[] Params, string? logName)\n    {\n        byte[] args = new byte[4 + Params.Length];\n        BitConverter.GetBytes((uint)DeviceID).CopyTo(args, 0);\n        Params.CopyTo(args, 4);\n\n        byte[] status = CallMethod(DEVS, args);\n        int result = BitConverter.ToInt32(status, 0);\n\n        if (logName is not null)\n            Logger.WriteLine(logName + \" = \" + BitConverter.ToString(Params) + \" : \" + (result == 1 ? \"OK\" : result));\n\n        return BitConverter.ToInt32(status, 0);\n    }\n\n\n    public int DeviceGet(uint DeviceID)\n    {\n        byte[] args = new byte[8];\n        BitConverter.GetBytes((uint)DeviceID).CopyTo(args, 0);\n        byte[] status = CallMethod(DSTS, args);\n\n        return BitConverter.ToInt32(status, 0) - 65536;\n\n    }\n\n    public byte[] DeviceGetBuffer(uint DeviceID, uint Status = 0)\n    {\n        byte[] args = new byte[8];\n        BitConverter.GetBytes((uint)DeviceID).CopyTo(args, 0);\n        BitConverter.GetBytes((uint)Status).CopyTo(args, 4);\n\n        return CallMethod(DSTS, args);\n    }\n\n\n    public decimal? GetBatteryDischarge()\n    {\n        var buffer = DeviceGetBuffer(BatteryDischarge);\n\n        if (buffer[2] > 0)\n        {\n            buffer[2] = 0;\n            return (decimal)BitConverter.ToInt16(buffer, 0) / 100;\n        }\n        else\n        {\n            return null;\n        }\n    }\n\n\n    public int SetVivoMode(int mode)\n    {\n        if (mode == 1) mode = 2;\n        else if (mode == 2) mode = 1;\n        return Program.acpi.DeviceSet(VivoBookMode, mode, \"VivoMode\");\n    }\n\n    public int SetGPUEco(int eco)\n    {\n        uint ecoEndpoint = GPUEco;\n\n        int ecoFlag = DeviceGet(ecoEndpoint);\n        if (ecoFlag < 0) return -1;\n\n        if (ecoFlag == 1 && eco == 0)\n            return DeviceSet(ecoEndpoint, eco, \"GPUEco\");\n\n        if (ecoFlag == 0 && eco == 1)\n            return DeviceSet(ecoEndpoint, eco, \"GPUEco\");\n\n        return -1;\n    }\n\n    public int GetFan(AsusFan device)\n    {\n        int fan = -1;\n\n        switch (device)\n        {\n            case AsusFan.GPU:\n                fan = Program.acpi.DeviceGet(GPU_Fan);\n                break;\n            case AsusFan.Mid:\n                fan = Program.acpi.DeviceGet(Mid_Fan);\n                break;\n            default:\n                fan = Program.acpi.DeviceGet(CPU_Fan);\n                break;\n        }\n\n        if (fan < 0)\n        {\n            fan += 65536;\n            if (fan <= 0 || fan > 100) fan = -1;\n        }\n\n        return fan;\n    }\n\n\n    public int SetFanRange(AsusFan device, byte[] curve)\n    {\n\n        if (curve.Length != 16) return -1;\n        if (curve.All(singleByte => singleByte == 0)) return -1;\n\n        byte min = (byte)(curve[8] * 255 / 100);\n        byte max = (byte)(curve[15] * 255 / 100);\n        byte[] range = { min, max };\n\n        int result;\n        switch (device)\n        {\n            case AsusFan.GPU:\n                result = DeviceSet(DevsGPUFan, range, \"FanRangeGPU\");\n                break;\n            default:\n                result = DeviceSet(DevsCPUFan, range, \"FanRangeCPU\");\n                break;\n        }\n\n        return result;\n    }\n\n\n    public int SetFanCurve(AsusFan device, byte[] curve)\n    {\n\n        if (curve.Length != 16) return -1;\n        if (curve.All(singleByte => singleByte == 0)) return -1;\n\n        int result;\n\n        int fanScale = AppConfig.Get(\"fan_scale\", 100);\n\n        if (fanScale != 100 && device == AsusFan.CPU) Logger.WriteLine(\"Custom fan scale: \" + fanScale);\n\n        for (int i = 8; i < curve.Length; i++) curve[i] = (byte)(Math.Max((byte)0, Math.Min((byte)100, curve[i])) * fanScale / 100);\n\n        switch (device)\n        {\n            case AsusFan.GPU:\n                result = DeviceSet(DevsGPUFanCurve, curve, \"FanGPU\");\n                break;\n            case AsusFan.Mid:\n                result = DeviceSet(DevsMidFanCurve, curve, \"FanMid\");\n                break;\n            default:\n                result = DeviceSet(DevsCPUFanCurve, curve, \"FanCPU\");\n                break;\n        }\n\n        return result;\n    }\n\n    public byte[] GetFanCurve(AsusFan device, int mode = 0)\n    {\n        uint fan_mode;\n\n        // because it's asus, and modes are swapped here\n        switch (mode)\n        {\n            case 1: fan_mode = 2; break;\n            case 2: fan_mode = 1; break;\n            default: fan_mode = 0; break;\n        }\n\n        byte[] result;\n\n        switch (device)\n        {\n            case AsusFan.GPU:\n                result = DeviceGetBuffer(DevsGPUFanCurve, fan_mode);\n                break;\n            case AsusFan.Mid:\n                result = DeviceGetBuffer(DevsMidFanCurve, fan_mode);\n                break;\n            default:\n                result = DeviceGetBuffer(DevsCPUFanCurve, fan_mode);\n                break;\n        }\n\n        //Logger.WriteLine($\"GetFan {device} :\" + BitConverter.ToString(result));\n\n        return result;\n\n    }\n\n    public static bool IsInvalidCurve(byte[] curve)\n    {\n        return curve.Length != 16 || IsEmptyCurve(curve);\n    }\n\n    public static bool IsEmptyCurve(byte[] curve)\n    {\n        return curve.All(singleByte => singleByte == 0);\n    }\n\n    public static byte[] FixFanCurve(byte[] curve)\n    {\n        if (curve.Length != 16) throw new Exception(\"Incorrect curve\");\n\n        var points = new Dictionary<byte, byte>();\n        byte old = 0;\n\n        for (int i = 0; i < 8; i++)\n        {\n            if (curve[i] <= old) curve[i] = (byte)Math.Min(100, old + 6); // preventing 2 points in same spot from default asus profiles\n            points[curve[i]] = curve[i + 8];\n            old = curve[i];\n        }\n\n        var pointsFixed = new Dictionary<byte, byte>();\n        bool fix = false;\n\n        int count = 0;\n        foreach (var pair in points.OrderBy(x => x.Key))\n        {\n            if (count == 0 && pair.Key >= 40)\n            {\n                fix = true;\n                pointsFixed.Add(30, 0);\n            }\n\n            if (count != 3 || !fix)\n                pointsFixed.Add(pair.Key, pair.Value);\n            count++;\n        }\n\n        count = 0;\n        foreach (var pair in pointsFixed.OrderBy(x => x.Key))\n        {\n            int x = pair.Key;\n\n            if (AppConfig.IsClampFanDots())\n            {\n                int minX = 30 + (count * 10);\n                int maxX = minX + 10;\n                x = Math.Max(minX, Math.Min(maxX, x));\n            }\n\n            curve[count] = (byte)x;\n            curve[count + 8] = pair.Value;\n            count++;\n        }\n\n        return curve;\n\n    }\n\n    public bool IsXGConnected()\n    {\n        return DeviceGet(GPUXGConnected) == 1;\n    }\n\n    public bool IsAllAmdPPT()\n    {\n        if (_allAMD is null) _allAMD = DeviceGet(PPT_CPUB0) >= 0 && DeviceGet(PPT_GPUC0) < 0 && !AppConfig.IsAMDiGPU();\n        return (bool)_allAMD;\n    }\n\n    public bool IsOverdriveSupported()\n    {\n        if (_overdrive is null) _overdrive = DeviceGet(ScreenOverdrive) >= 0;\n        return (bool)_overdrive;\n    }\n\n    public bool IsNVidiaGPU()\n    {\n        return (!IsAllAmdPPT() && Program.acpi.DeviceGet(GPUEco) >= 0 && !AppConfig.IsAlly());\n    }\n\n    public void SetAPUMem(int memory = 4)\n    {\n        if (memory < 0 || memory > 8) return;\n\n        int mem = 0;\n\n        switch (memory)\n        {\n            case 0:\n                mem = 0;\n                break;\n            case 1:\n                mem = 258;\n                break;\n            case 2:\n                mem = 259;\n                break;\n            case 3:\n                mem = 260;\n                break;\n            case 4:\n                mem = 261;\n                break;\n            case 5:\n                mem = 263;\n                break;\n            case 6:\n                mem = 264;\n                break;\n            case 7:\n                mem = 265;\n                break;\n            case 8:\n                mem = 262;\n                break;\n        }\n\n        Program.acpi.DeviceSet(APU_MEM, mem, \"APU Mem\");\n    }\n\n    public int GetAPUMem()\n    {\n        int memory = Program.acpi.DeviceGet(APU_MEM);\n        if (memory < 0) return -1;\n\n        switch (memory)\n        {\n            case 256:\n                return 0;\n            case 258:\n                return 1;\n            case 259:\n                return 2;\n            case 260:\n                return 3;\n            case 261:\n                return 4;\n            case 262:\n                return 8;\n            case 263:\n                return 5;\n            case 264:\n                return 6;\n            case 265:\n                return 7;\n            default:\n                return 4;\n        }\n    }\n\n    public (int, int) GetCores(bool max = false)\n    {\n        int value = Program.acpi.DeviceGet(max ? CORES_MAX : CORES_CPU);\n        //value = max ? 0x406 : 0x605;\n\n        if (value < 0) return (-1, -1);\n        Logger.WriteLine(\"Cores\" + (max ? \"Max\" : \"\") + \": 0x\" + value.ToString(\"X4\"));\n\n        return ((value >> 8) & 0xFF, (value) & 0xFF);\n    }\n\n    public void SetCores(int eCores, int pCores)\n    {\n        if (eCores < ECoreMin || eCores > ECoreMax || pCores < PCoreMin || pCores > PCoreMax)\n        {\n            Logger.WriteLine($\"Incorrect Core config ({eCores}, {pCores})\");\n            return;\n        };\n\n        int value = (eCores << 8) | pCores;\n        Program.acpi.DeviceSet(CORES_CPU, value, \"Cores (0x\" + value.ToString(\"X4\") + \")\");\n    }\n\n    public string ScanRange()\n    {\n        int value;\n        string appPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + \"\\\\GHelper\";\n        string logFile = appPath + \"\\\\scan.txt\";\n        using (StreamWriter w = File.AppendText(logFile))\n        {\n            w.WriteLine($\"Scan started {DateTime.Now}\");\n            for (uint i = 0x00000000; i <= 0x00160000; i += 0x10000)\n            {\n                for (uint j = 0x00; j <= 0xFF; j++)\n                {\n                    uint id = i + j;\n                    value = DeviceGet(id);\n                    if (value >= 0)\n                    {\n                        w.WriteLine(id.ToString(\"X8\") + \": \" + value.ToString(\"X4\") + \" (\" + value + \")\");\n                    }\n                }\n            }\n            w.WriteLine($\"---------------------\");\n            w.Close();\n        }\n\n        return logFile;\n\n    }\n\n    public void TUFKeyboardBrightness(int brightness, string log = \"TUF Backlight\")\n    {\n        int param = 0x80 | (brightness & 0x7F);\n        DeviceSet(TUF_KB_BRIGHTNESS, param, log);\n\n    }\n\n    public void TUFKeyboardRGB(AuraMode mode, Color color, int speed, string? log = \"TUF RGB\")\n    {\n\n        byte[] setting = new byte[6];\n\n        setting[0] = (byte)0xb4;\n        setting[1] = (byte)mode;\n        setting[2] = color.R;\n        setting[3] = color.G;\n        setting[4] = color.B;\n        setting[5] = (byte)speed;\n\n        int result = DeviceSet(TUF_KB, setting, log);\n        if (result != 1)\n        {\n            setting[0] = (byte)0xb3;\n            DeviceSet(TUF_KB2, setting, log);\n            setting[0] = (byte)0xb4;\n            DeviceSet(TUF_KB2, setting, log);\n        }\n\n    }\n\n    const int ASUS_WMI_KEYBOARD_POWER_BOOT = 0x03 << 16;\n    const int ASUS_WMI_KEYBOARD_POWER_AWAKE = 0x0C << 16;\n    const int ASUS_WMI_KEYBOARD_POWER_SLEEP = 0x30 << 16;\n    const int ASUS_WMI_KEYBOARD_POWER_SHUTDOWN = 0xC0 << 16;\n    public void TUFKeyboardPower(bool awake = true, bool boot = false, bool sleep = false, bool shutdown = false)\n    {\n        int state = 0xbd;\n\n        if (boot) state = state | ASUS_WMI_KEYBOARD_POWER_BOOT;\n        if (awake) state = state | ASUS_WMI_KEYBOARD_POWER_AWAKE;\n        if (sleep) state = state | ASUS_WMI_KEYBOARD_POWER_SLEEP;\n        if (shutdown) state = state | ASUS_WMI_KEYBOARD_POWER_SHUTDOWN;\n\n        state = state | 0x01 << 8;\n\n        DeviceSet(TUF_KB_STATE, state, \"TUF_KB\");\n        if (AppConfig.IsVivoZenPro() && DeviceGet(KBD_BACKLIGHT_OOBE) >= 0) DeviceSet(KBD_BACKLIGHT_OOBE, 1, \"VIVO OOBE\");\n    }\n\n    public void SubscribeToEvents(Action<object, EventArrivedEventArgs> EventHandler)\n    {\n        try\n        {\n            ManagementEventWatcher watcher = new ManagementEventWatcher();\n            watcher.EventArrived += new EventArrivedEventHandler(EventHandler);\n            watcher.Scope = new ManagementScope(\"root\\\\wmi\");\n            watcher.Query = new WqlEventQuery(\"SELECT * FROM AsusAtkWmiEvent\");\n            watcher.Start();\n        }\n        catch\n        {\n            Logger.WriteLine(\"Can't connect to ASUS WMI events\");\n        }\n    }\n\n\n}\n"
  },
  {
    "path": "app/AsusMouseSettings.Designer.cs",
    "content": "﻿namespace GHelper\n{\n    partial class AsusMouseSettings\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            panelProfiles = new Panel();\n            comboProfile = new GHelper.UI.RComboBox();\n            labelProfile = new Label();\n            panelPerformance = new Panel();\n            panelPerformanceOther = new Panel();\n            panelDeceleration = new Panel();\n            labelDeceleration = new Label();\n            sliderDeceleration = new GHelper.UI.Slider();\n            labelDecelerationValue = new Label();\n            panelAcceleration = new Panel();\n            labelAcceleration = new Label();\n            sliderAcceleration = new GHelper.UI.Slider();\n            labelAccelerationValue = new Label();\n            panelLiftOffDistance = new Panel();\n            labelLiftOffDistance = new Label();\n            comboBoxLiftOffDistance = new GHelper.UI.RComboBox();\n            panelDebounce = new Panel();\n            labelButtonDebounce = new Label();\n            sliderButtonDebounce = new GHelper.UI.Slider();\n            labelButtonDebounceValue = new Label();\n            panelAngleSnapping = new Panel();\n            panelMotionSync = new Panel();\n            checkBoxMotionSync = new CheckBox();\n            panelZoneMode = new Panel();\n            checkBoxZoneMode = new CheckBox();\n            comboBoxZoneModePollingRate = new GHelper.UI.RComboBox();\n            sliderZoneModeDPI = new GHelper.UI.Slider();\n            numericUpDownZoneModeDPI = new NumericUpDown();\n            sliderAngleAdjustment = new GHelper.UI.Slider();\n            checkBoxAngleSnapping = new CheckBox();\n            labelAngleAdjustmentValue = new Label();\n            panelPollingRate = new Panel();\n            labelPollingRate = new Label();\n            comboBoxPollingRate = new GHelper.UI.RComboBox();\n            panelDPISettings = new Panel();\n            sliderDPI = new GHelper.UI.Slider();\n            tableLayoutPanel1 = new TableLayoutPanel();\n            labelMinDPI = new Label();\n            labelMaxDPI = new Label();\n            numericUpDownCurrentDPI = new NumericUpDown();\n            panelDPITile = new Panel();\n            pictureDPIColor = new PictureBox();\n            buttonDPIColor = new GHelper.UI.RButton();\n            labelDPI = new Label();\n            tableDPI = new TableLayoutPanel();\n            buttonDPI2 = new GHelper.UI.RButton();\n            buttonDPI1 = new GHelper.UI.RButton();\n            buttonDPI3 = new GHelper.UI.RButton();\n            buttonDPI4 = new GHelper.UI.RButton();\n            panelPerformanceHeader = new Panel();\n            pictureKeyboard = new PictureBox();\n            labelPerformance = new Label();\n            panelLighting = new Panel();\n            panelLightingContent = new Panel();\n            tableLayoutLightingZones = new TableLayoutPanel();\n            buttonLightingZoneScroll = new GHelper.UI.RButton();\n            buttonLightingZoneLogo = new GHelper.UI.RButton();\n            buttonLightingZoneAll = new GHelper.UI.RButton();\n            buttonLightingZoneUnderglow = new GHelper.UI.RButton();\n            buttonLightingZoneDock = new GHelper.UI.RButton();\n            comboBoxAnimationDirection = new GHelper.UI.RComboBox();\n            labelAnimationDirection = new Label();\n            checkBoxRandomColor = new CheckBox();\n            comboBoxAnimationSpeed = new GHelper.UI.RComboBox();\n            labelAnimationSpeed = new Label();\n            pictureBoxLightingColor = new PictureBox();\n            buttonLightingColor = new GHelper.UI.RButton();\n            comboBoxLightingMode = new GHelper.UI.RComboBox();\n            labelLightingMode = new Label();\n            panelLightingHeader = new Panel();\n            sliderBrightness = new GHelper.UI.Slider();\n            pictureBoxLighting = new PictureBox();\n            labelLighting = new Label();\n            panelEnergy = new Panel();\n            labelLowBatteryWarningValue = new Label();\n            comboBoxAutoPowerOff = new GHelper.UI.RComboBox();\n            sliderLowBatteryWarning = new GHelper.UI.Slider();\n            labelLowBatteryWarning = new Label();\n            labelAutoPowerOff = new Label();\n            panelEnergyHeader = new Panel();\n            pictureBoxEnergy = new PictureBox();\n            labelEnergy = new Label();\n            tableLayoutProfiles = new TableLayoutPanel();\n            panelBatteryState = new Panel();\n            labelChargingState = new Label();\n            labelBatteryState = new Label();\n            pictureBoxBatteryState = new PictureBox();\n            buttonSync = new GHelper.UI.RButton();\n            panelBottomButtons = new Panel();\n            buttonImport = new GHelper.UI.RButton();\n            buttonExport = new GHelper.UI.RButton();\n            tableLayoutPanel2 = new TableLayoutPanel();\n            rButton1 = new GHelper.UI.RButton();\n            rButton2 = new GHelper.UI.RButton();\n            panelProfiles.SuspendLayout();\n            panelPerformance.SuspendLayout();\n            panelPerformanceOther.SuspendLayout();\n            panelDeceleration.SuspendLayout();\n            panelAcceleration.SuspendLayout();\n            panelLiftOffDistance.SuspendLayout();\n            panelDebounce.SuspendLayout();\n            panelAngleSnapping.SuspendLayout();\n            panelMotionSync.SuspendLayout();\n            panelZoneMode.SuspendLayout();\n            panelPollingRate.SuspendLayout();\n            panelDPISettings.SuspendLayout();\n            tableLayoutPanel1.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)numericUpDownCurrentDPI).BeginInit();\n            panelDPITile.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureDPIColor).BeginInit();\n            tableDPI.SuspendLayout();\n            panelPerformanceHeader.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureKeyboard).BeginInit();\n            panelLighting.SuspendLayout();\n            panelLightingContent.SuspendLayout();\n            tableLayoutLightingZones.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureBoxLightingColor).BeginInit();\n            panelLightingHeader.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureBoxLighting).BeginInit();\n            panelEnergy.SuspendLayout();\n            panelEnergyHeader.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureBoxEnergy).BeginInit();\n            tableLayoutProfiles.SuspendLayout();\n            panelBatteryState.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureBoxBatteryState).BeginInit();\n            panelBottomButtons.SuspendLayout();\n            tableLayoutPanel2.SuspendLayout();\n            SuspendLayout();\n            // \n            // panelProfiles\n            // \n            panelProfiles.Controls.Add(comboProfile);\n            panelProfiles.Controls.Add(labelProfile);\n            panelProfiles.Location = new Point(444, 4);\n            panelProfiles.Margin = new Padding(4);\n            panelProfiles.MinimumSize = new Size(454, 0);\n            panelProfiles.Name = \"panelProfiles\";\n            panelProfiles.Size = new Size(454, 68);\n            panelProfiles.TabIndex = 0;\n            // \n            // comboProfile\n            // \n            comboProfile.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right;\n            comboProfile.BorderColor = Color.White;\n            comboProfile.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboProfile.DropDownStyle = ComboBoxStyle.DropDownList;\n            comboProfile.FlatStyle = FlatStyle.Flat;\n            comboProfile.FormattingEnabled = true;\n            comboProfile.Location = new Point(130, 14);\n            comboProfile.Margin = new Padding(0);\n            comboProfile.Name = \"comboProfile\";\n            comboProfile.Size = new Size(302, 40);\n            comboProfile.TabIndex = 43;\n            // \n            // labelProfile\n            // \n            labelProfile.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left;\n            labelProfile.AutoSize = true;\n            labelProfile.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelProfile.Location = new Point(4, 18);\n            labelProfile.Margin = new Padding(4, 0, 4, 0);\n            labelProfile.Name = \"labelProfile\";\n            labelProfile.Size = new Size(90, 32);\n            labelProfile.TabIndex = 41;\n            labelProfile.Text = \"Profile\";\n            // \n            // panelPerformance\n            // \n            panelPerformance.AutoSize = true;\n            panelPerformance.Controls.Add(panelPerformanceOther);\n            panelPerformance.Controls.Add(panelDPISettings);\n            panelPerformance.Controls.Add(tableDPI);\n            panelPerformance.Controls.Add(panelPerformanceHeader);\n            panelPerformance.Dock = DockStyle.Top;\n            panelPerformance.Location = new Point(14, 90);\n            panelPerformance.Margin = new Padding(4);\n            panelPerformance.Name = \"panelPerformance\";\n            panelPerformance.Padding = new Padding(0, 14, 0, 34);\n            panelPerformance.Size = new Size(881, 733);\n            panelPerformance.TabIndex = 1;\n            // \n            // panelPerformanceOther\n            // \n            panelPerformanceOther.AutoSize = true;\n            panelPerformanceOther.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelPerformanceOther.Controls.Add(panelDeceleration);\n            panelPerformanceOther.Controls.Add(panelAcceleration);\n            panelPerformanceOther.Controls.Add(panelLiftOffDistance);\n            panelPerformanceOther.Controls.Add(panelDebounce);\n            panelPerformanceOther.Controls.Add(panelZoneMode);\n            panelPerformanceOther.Controls.Add(panelMotionSync);\n            panelPerformanceOther.Controls.Add(panelAngleSnapping);\n            panelPerformanceOther.Controls.Add(panelPollingRate);\n            panelPerformanceOther.Dock = DockStyle.Top;\n            panelPerformanceOther.Location = new Point(0, 319);\n            panelPerformanceOther.Margin = new Padding(4);\n            panelPerformanceOther.Name = \"panelPerformanceOther\";\n            panelPerformanceOther.Padding = new Padding(0, 14, 0, 14);\n            panelPerformanceOther.Size = new Size(881, 380);\n            panelPerformanceOther.TabIndex = 49;\n            // \n            // panelDeceleration\n            // \n            panelDeceleration.AutoSize = true;\n            panelDeceleration.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelDeceleration.Controls.Add(labelDeceleration);\n            panelDeceleration.Controls.Add(sliderDeceleration);\n            panelDeceleration.Controls.Add(labelDecelerationValue);\n            panelDeceleration.Dock = DockStyle.Top;\n            panelDeceleration.Location = new Point(0, 304);\n            panelDeceleration.Margin = new Padding(4);\n            panelDeceleration.Name = \"panelDeceleration\";\n            panelDeceleration.Padding = new Padding(6);\n            panelDeceleration.Size = new Size(881, 62);\n            panelDeceleration.TabIndex = 58;\n            // \n            // labelDeceleration\n            // \n            labelDeceleration.Location = new Point(8, 10);\n            labelDeceleration.Margin = new Padding(8, 0, 8, 0);\n            labelDeceleration.Name = \"labelDeceleration\";\n            labelDeceleration.Size = new Size(464, 44);\n            labelDeceleration.TabIndex = 52;\n            labelDeceleration.Text = \"Deceleration\";\n            // \n            // sliderDeceleration\n            // \n            sliderDeceleration.AccessibleName = \"DPI Slider\";\n            sliderDeceleration.Location = new Point(490, 12);\n            sliderDeceleration.Margin = new Padding(4);\n            sliderDeceleration.Max = 9;\n            sliderDeceleration.Min = 0;\n            sliderDeceleration.Name = \"sliderDeceleration\";\n            sliderDeceleration.Size = new Size(284, 40);\n            sliderDeceleration.Step = 1;\n            sliderDeceleration.TabIndex = 50;\n            sliderDeceleration.TabStop = false;\n            sliderDeceleration.Text = \"sliderBattery\";\n            sliderDeceleration.Value = 0;\n            // \n            // labelDecelerationValue\n            // \n            labelDecelerationValue.Location = new Point(786, 12);\n            labelDecelerationValue.Margin = new Padding(8, 0, 8, 0);\n            labelDecelerationValue.Name = \"labelDecelerationValue\";\n            labelDecelerationValue.Size = new Size(80, 40);\n            labelDecelerationValue.TabIndex = 51;\n            labelDecelerationValue.Text = \"0\";\n            labelDecelerationValue.TextAlign = ContentAlignment.MiddleRight;\n            // \n            // panelAcceleration\n            // \n            panelAcceleration.AutoSize = true;\n            panelAcceleration.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelAcceleration.Controls.Add(labelAcceleration);\n            panelAcceleration.Controls.Add(sliderAcceleration);\n            panelAcceleration.Controls.Add(labelAccelerationValue);\n            panelAcceleration.Dock = DockStyle.Top;\n            panelAcceleration.Location = new Point(0, 242);\n            panelAcceleration.Margin = new Padding(4);\n            panelAcceleration.Name = \"panelAcceleration\";\n            panelAcceleration.Padding = new Padding(6);\n            panelAcceleration.Size = new Size(881, 62);\n            panelAcceleration.TabIndex = 57;\n            // \n            // labelAcceleration\n            // \n            labelAcceleration.Location = new Point(8, 10);\n            labelAcceleration.Margin = new Padding(8, 0, 8, 0);\n            labelAcceleration.Name = \"labelAcceleration\";\n            labelAcceleration.Size = new Size(464, 44);\n            labelAcceleration.TabIndex = 52;\n            labelAcceleration.Text = \"Acceleration\";\n            // \n            // sliderAcceleration\n            // \n            sliderAcceleration.AccessibleName = \"DPI Slider\";\n            sliderAcceleration.Location = new Point(490, 12);\n            sliderAcceleration.Margin = new Padding(4);\n            sliderAcceleration.Max = 9;\n            sliderAcceleration.Min = 0;\n            sliderAcceleration.Name = \"sliderAcceleration\";\n            sliderAcceleration.Size = new Size(284, 40);\n            sliderAcceleration.Step = 1;\n            sliderAcceleration.TabIndex = 50;\n            sliderAcceleration.TabStop = false;\n            sliderAcceleration.Text = \"sliderBattery\";\n            sliderAcceleration.Value = 0;\n            // \n            // labelAccelerationValue\n            // \n            labelAccelerationValue.Location = new Point(786, 12);\n            labelAccelerationValue.Margin = new Padding(8, 0, 8, 0);\n            labelAccelerationValue.Name = \"labelAccelerationValue\";\n            labelAccelerationValue.Size = new Size(80, 40);\n            labelAccelerationValue.TabIndex = 51;\n            labelAccelerationValue.Text = \"0\";\n            labelAccelerationValue.TextAlign = ContentAlignment.MiddleRight;\n            // \n            // panelLiftOffDistance\n            // \n            panelLiftOffDistance.AutoSize = true;\n            panelLiftOffDistance.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelLiftOffDistance.Controls.Add(labelLiftOffDistance);\n            panelLiftOffDistance.Controls.Add(comboBoxLiftOffDistance);\n            panelLiftOffDistance.Dock = DockStyle.Top;\n            panelLiftOffDistance.Location = new Point(0, 186);\n            panelLiftOffDistance.Margin = new Padding(4);\n            panelLiftOffDistance.Name = \"panelLiftOffDistance\";\n            panelLiftOffDistance.Padding = new Padding(6);\n            panelLiftOffDistance.Size = new Size(881, 56);\n            panelLiftOffDistance.TabIndex = 56;\n            // \n            // labelLiftOffDistance\n            // \n            labelLiftOffDistance.Location = new Point(6, 6);\n            labelLiftOffDistance.Margin = new Padding(8, 0, 8, 0);\n            labelLiftOffDistance.Name = \"labelLiftOffDistance\";\n            labelLiftOffDistance.Size = new Size(464, 44);\n            labelLiftOffDistance.TabIndex = 48;\n            labelLiftOffDistance.Text = \"Lift Off Distance\";\n            // \n            // comboBoxLiftOffDistance\n            // \n            comboBoxLiftOffDistance.BorderColor = Color.White;\n            comboBoxLiftOffDistance.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboBoxLiftOffDistance.DropDownStyle = ComboBoxStyle.DropDownList;\n            comboBoxLiftOffDistance.FlatStyle = FlatStyle.Flat;\n            comboBoxLiftOffDistance.FormattingEnabled = true;\n            comboBoxLiftOffDistance.Location = new Point(490, 6);\n            comboBoxLiftOffDistance.Margin = new Padding(22, 0, 22, 0);\n            comboBoxLiftOffDistance.Name = \"comboBoxLiftOffDistance\";\n            comboBoxLiftOffDistance.Size = new Size(374, 40);\n            comboBoxLiftOffDistance.TabIndex = 49;\n            // \n            // panelDebounce\n            // \n            panelDebounce.AutoSize = true;\n            panelDebounce.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelDebounce.Controls.Add(labelButtonDebounce);\n            panelDebounce.Controls.Add(sliderButtonDebounce);\n            panelDebounce.Controls.Add(labelButtonDebounceValue);\n            panelDebounce.Dock = DockStyle.Top;\n            panelDebounce.Location = new Point(0, 124);\n            panelDebounce.Margin = new Padding(4);\n            panelDebounce.Name = \"panelDebounce\";\n            panelDebounce.Padding = new Padding(6);\n            panelDebounce.Size = new Size(881, 62);\n            panelDebounce.TabIndex = 55;\n            // \n            // labelButtonDebounce\n            // \n            labelButtonDebounce.Location = new Point(8, 10);\n            labelButtonDebounce.Margin = new Padding(8, 0, 8, 0);\n            labelButtonDebounce.Name = \"labelButtonDebounce\";\n            labelButtonDebounce.Size = new Size(464, 44);\n            labelButtonDebounce.TabIndex = 52;\n            labelButtonDebounce.Text = \"Button Response\";\n            // \n            // sliderButtonDebounce\n            // \n            sliderButtonDebounce.AccessibleName = \"DPI Slider\";\n            sliderButtonDebounce.Location = new Point(490, 12);\n            sliderButtonDebounce.Margin = new Padding(4);\n            sliderButtonDebounce.Max = 7;\n            sliderButtonDebounce.Min = 2;\n            sliderButtonDebounce.Name = \"sliderButtonDebounce\";\n            sliderButtonDebounce.Size = new Size(284, 40);\n            sliderButtonDebounce.Step = 1;\n            sliderButtonDebounce.TabIndex = 50;\n            sliderButtonDebounce.TabStop = false;\n            sliderButtonDebounce.Text = \"sliderBattery\";\n            sliderButtonDebounce.Value = 2;\n            // \n            // labelButtonDebounceValue\n            // \n            labelButtonDebounceValue.Location = new Point(786, 12);\n            labelButtonDebounceValue.Margin = new Padding(8, 0, 8, 0);\n            labelButtonDebounceValue.Name = \"labelButtonDebounceValue\";\n            labelButtonDebounceValue.Size = new Size(80, 40);\n            labelButtonDebounceValue.TabIndex = 51;\n            labelButtonDebounceValue.Text = \"12ms\";\n            labelButtonDebounceValue.TextAlign = ContentAlignment.MiddleRight;\n            // \n            // panelAngleSnapping\n            // \n            panelAngleSnapping.AutoSize = true;\n            panelAngleSnapping.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelAngleSnapping.Controls.Add(sliderAngleAdjustment);\n            panelAngleSnapping.Controls.Add(checkBoxAngleSnapping);\n            panelAngleSnapping.Controls.Add(labelAngleAdjustmentValue);\n            panelAngleSnapping.Dock = DockStyle.Top;\n            panelAngleSnapping.Location = new Point(0, 66);\n            panelAngleSnapping.Margin = new Padding(4);\n            panelAngleSnapping.Name = \"panelAngleSnapping\";\n            panelAngleSnapping.Padding = new Padding(6);\n            panelAngleSnapping.Size = new Size(881, 58);\n            panelAngleSnapping.TabIndex = 54;\n            // \n            // panelMotionSync\n            // \n            panelMotionSync.AutoSize = true;\n            panelMotionSync.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelMotionSync.Controls.Add(checkBoxMotionSync);\n            panelMotionSync.Dock = DockStyle.Top;\n            panelMotionSync.Location = new Point(0, 124);\n            panelMotionSync.Margin = new Padding(4);\n            panelMotionSync.Name = \"panelMotionSync\";\n            panelMotionSync.Padding = new Padding(6);\n            panelMotionSync.Size = new Size(881, 58);\n            panelMotionSync.TabIndex = 59;\n            // \n            // checkBoxMotionSync\n            // \n            checkBoxMotionSync.CheckAlign = ContentAlignment.MiddleRight;\n            checkBoxMotionSync.Location = new Point(6, 8);\n            checkBoxMotionSync.Margin = new Padding(8, 0, 8, 0);\n            checkBoxMotionSync.Name = \"checkBoxMotionSync\";\n            checkBoxMotionSync.Size = new Size(512, 40);\n            checkBoxMotionSync.TabIndex = 45;\n            checkBoxMotionSync.Text = \"Motion Sync\";\n            checkBoxMotionSync.TextAlign = ContentAlignment.TopLeft;\n            checkBoxMotionSync.UseVisualStyleBackColor = true;\n            // \n            // panelZoneMode\n            // \n            panelZoneMode.AutoSize = true;\n            panelZoneMode.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelZoneMode.Controls.Add(numericUpDownZoneModeDPI);\n            panelZoneMode.Controls.Add(sliderZoneModeDPI);\n            panelZoneMode.Controls.Add(comboBoxZoneModePollingRate);\n            panelZoneMode.Controls.Add(checkBoxZoneMode);\n            panelZoneMode.Dock = DockStyle.Top;\n            panelZoneMode.Location = new Point(0, 182);\n            panelZoneMode.Margin = new Padding(4);\n            panelZoneMode.Name = \"panelZoneMode\";\n            panelZoneMode.Padding = new Padding(6);\n            panelZoneMode.Size = new Size(881, 116);\n            panelZoneMode.TabIndex = 60;\n            // \n            // checkBoxZoneMode\n            // \n            checkBoxZoneMode.CheckAlign = ContentAlignment.MiddleRight;\n            checkBoxZoneMode.Location = new Point(6, 8);\n            checkBoxZoneMode.Margin = new Padding(8, 0, 8, 0);\n            checkBoxZoneMode.Name = \"checkBoxZoneMode\";\n            checkBoxZoneMode.Size = new Size(512, 40);\n            checkBoxZoneMode.TabIndex = 45;\n            checkBoxZoneMode.Text = \"Zone Mode\";\n            checkBoxZoneMode.TextAlign = ContentAlignment.TopLeft;\n            checkBoxZoneMode.UseVisualStyleBackColor = true;\n            // \n            // comboBoxZoneModePollingRate\n            // \n            comboBoxZoneModePollingRate.BorderColor = Color.White;\n            comboBoxZoneModePollingRate.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboBoxZoneModePollingRate.DropDownStyle = ComboBoxStyle.DropDownList;\n            comboBoxZoneModePollingRate.FlatStyle = FlatStyle.Flat;\n            comboBoxZoneModePollingRate.FormattingEnabled = true;\n            comboBoxZoneModePollingRate.Location = new Point(544, 8);\n            comboBoxZoneModePollingRate.Margin = new Padding(22, 0, 22, 0);\n            comboBoxZoneModePollingRate.Name = \"comboBoxZoneModePollingRate\";\n            comboBoxZoneModePollingRate.Size = new Size(176, 40);\n            comboBoxZoneModePollingRate.TabIndex = 46;\n            // \n            // sliderZoneModeDPI\n            // \n            sliderZoneModeDPI.AccessibleName = \"Zone Mode DPI Slider\";\n            sliderZoneModeDPI.Location = new Point(0, 56);\n            sliderZoneModeDPI.Margin = new Padding(4);\n            sliderZoneModeDPI.Max = 42000;\n            sliderZoneModeDPI.Min = 400;\n            sliderZoneModeDPI.Name = \"sliderZoneModeDPI\";\n            sliderZoneModeDPI.Size = new Size(881, 40);\n            sliderZoneModeDPI.Step = 50;\n            sliderZoneModeDPI.TabIndex = 47;\n            sliderZoneModeDPI.TabStop = false;\n            sliderZoneModeDPI.Text = \"sliderZoneModeDPI\";\n            sliderZoneModeDPI.Value = 1600;\n            // \n            // numericUpDownZoneModeDPI\n            // \n            numericUpDownZoneModeDPI.Location = new Point(744, 8);\n            numericUpDownZoneModeDPI.Margin = new Padding(8, 0, 8, 0);\n            numericUpDownZoneModeDPI.Maximum = new decimal(new int[] { 42000, 0, 0, 0 });\n            numericUpDownZoneModeDPI.Minimum = new decimal(new int[] { 400, 0, 0, 0 });\n            numericUpDownZoneModeDPI.Name = \"numericUpDownZoneModeDPI\";\n            numericUpDownZoneModeDPI.Size = new Size(120, 40);\n            numericUpDownZoneModeDPI.TabIndex = 48;\n            numericUpDownZoneModeDPI.TextAlign = HorizontalAlignment.Right;\n            numericUpDownZoneModeDPI.Value = new decimal(new int[] { 1600, 0, 0, 0 });\n            numericUpDownZoneModeDPI.Increment = 50;\n            // \n            // sliderAngleAdjustment\n            // \n            sliderAngleAdjustment.AccessibleName = \"DPI Slider\";\n            sliderAngleAdjustment.Location = new Point(528, 8);\n            sliderAngleAdjustment.Margin = new Padding(4);\n            sliderAngleAdjustment.Max = 20;\n            sliderAngleAdjustment.Min = -20;\n            sliderAngleAdjustment.Name = \"sliderAngleAdjustment\";\n            sliderAngleAdjustment.Size = new Size(278, 40);\n            sliderAngleAdjustment.Step = 5;\n            sliderAngleAdjustment.TabIndex = 46;\n            sliderAngleAdjustment.TabStop = false;\n            sliderAngleAdjustment.Text = \"sliderBattery\";\n            sliderAngleAdjustment.Value = 0;\n            // \n            // checkBoxAngleSnapping\n            // \n            checkBoxAngleSnapping.CheckAlign = ContentAlignment.MiddleRight;\n            checkBoxAngleSnapping.Location = new Point(6, 8);\n            checkBoxAngleSnapping.Margin = new Padding(8, 0, 8, 0);\n            checkBoxAngleSnapping.Name = \"checkBoxAngleSnapping\";\n            checkBoxAngleSnapping.Size = new Size(512, 40);\n            checkBoxAngleSnapping.TabIndex = 45;\n            checkBoxAngleSnapping.Text = \"Angle Snapping\";\n            checkBoxAngleSnapping.TextAlign = ContentAlignment.TopLeft;\n            checkBoxAngleSnapping.UseVisualStyleBackColor = true;\n            // \n            // labelAngleAdjustmentValue\n            // \n            labelAngleAdjustmentValue.Location = new Point(796, 8);\n            labelAngleAdjustmentValue.Margin = new Padding(8, 0, 8, 0);\n            labelAngleAdjustmentValue.Name = \"labelAngleAdjustmentValue\";\n            labelAngleAdjustmentValue.Size = new Size(64, 40);\n            labelAngleAdjustmentValue.TabIndex = 47;\n            labelAngleAdjustmentValue.Text = \"0°\";\n            labelAngleAdjustmentValue.TextAlign = ContentAlignment.MiddleRight;\n            // \n            // panelPollingRate\n            // \n            panelPollingRate.AutoSize = true;\n            panelPollingRate.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelPollingRate.Controls.Add(labelPollingRate);\n            panelPollingRate.Controls.Add(comboBoxPollingRate);\n            panelPollingRate.Dock = DockStyle.Top;\n            panelPollingRate.Location = new Point(0, 14);\n            panelPollingRate.Margin = new Padding(4);\n            panelPollingRate.Name = \"panelPollingRate\";\n            panelPollingRate.Padding = new Padding(6);\n            panelPollingRate.Size = new Size(881, 52);\n            panelPollingRate.TabIndex = 53;\n            // \n            // labelPollingRate\n            // \n            labelPollingRate.Location = new Point(8, 6);\n            labelPollingRate.Margin = new Padding(8, 0, 8, 0);\n            labelPollingRate.Name = \"labelPollingRate\";\n            labelPollingRate.Size = new Size(464, 40);\n            labelPollingRate.TabIndex = 45;\n            labelPollingRate.Text = \"Polling Rate\";\n            // \n            // comboBoxPollingRate\n            // \n            comboBoxPollingRate.BorderColor = Color.White;\n            comboBoxPollingRate.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboBoxPollingRate.DropDownStyle = ComboBoxStyle.DropDownList;\n            comboBoxPollingRate.FlatStyle = FlatStyle.Flat;\n            comboBoxPollingRate.FormattingEnabled = true;\n            comboBoxPollingRate.Location = new Point(490, 2);\n            comboBoxPollingRate.Margin = new Padding(22, 0, 22, 0);\n            comboBoxPollingRate.Name = \"comboBoxPollingRate\";\n            comboBoxPollingRate.Size = new Size(374, 40);\n            comboBoxPollingRate.TabIndex = 44;\n            // \n            // panelDPISettings\n            // \n            panelDPISettings.AutoSize = true;\n            panelDPISettings.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelDPISettings.Controls.Add(sliderDPI);\n            panelDPISettings.Controls.Add(tableLayoutPanel1);\n            panelDPISettings.Controls.Add(panelDPITile);\n            panelDPISettings.Dock = DockStyle.Top;\n            panelDPISettings.Location = new Point(0, 182);\n            panelDPISettings.Margin = new Padding(4);\n            panelDPISettings.Name = \"panelDPISettings\";\n            panelDPISettings.Size = new Size(881, 137);\n            panelDPISettings.TabIndex = 44;\n            // \n            // sliderDPI\n            // \n            sliderDPI.AccessibleName = \"DPI Slider\";\n            sliderDPI.Dock = DockStyle.Top;\n            sliderDPI.Location = new Point(0, 97);\n            sliderDPI.Margin = new Padding(4);\n            sliderDPI.Max = 35000;\n            sliderDPI.Min = 100;\n            sliderDPI.Name = \"sliderDPI\";\n            sliderDPI.Size = new Size(881, 40);\n            sliderDPI.Step = 50;\n            sliderDPI.TabIndex = 43;\n            sliderDPI.TabStop = false;\n            sliderDPI.Text = \"sliderBattery\";\n            sliderDPI.Value = 2000;\n            // \n            // tableLayoutPanel1\n            // \n            tableLayoutPanel1.AutoSize = true;\n            tableLayoutPanel1.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            tableLayoutPanel1.ColumnCount = 3;\n            tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 38F));\n            tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 24F));\n            tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 38F));\n            tableLayoutPanel1.Controls.Add(labelMinDPI, 0, 0);\n            tableLayoutPanel1.Controls.Add(labelMaxDPI, 2, 0);\n            tableLayoutPanel1.Controls.Add(numericUpDownCurrentDPI, 1, 0);\n            tableLayoutPanel1.Dock = DockStyle.Top;\n            tableLayoutPanel1.GrowStyle = TableLayoutPanelGrowStyle.FixedSize;\n            tableLayoutPanel1.Location = new Point(0, 54);\n            tableLayoutPanel1.Margin = new Padding(4);\n            tableLayoutPanel1.Name = \"tableLayoutPanel1\";\n            tableLayoutPanel1.RowCount = 1;\n            tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));\n            tableLayoutPanel1.Size = new Size(881, 43);\n            tableLayoutPanel1.TabIndex = 47;\n            // \n            // labelMinDPI\n            // \n            labelMinDPI.Dock = DockStyle.Top;\n            labelMinDPI.ForeColor = SystemColors.GrayText;\n            labelMinDPI.Location = new Point(8, 0);\n            labelMinDPI.Margin = new Padding(8, 0, 8, 0);\n            labelMinDPI.Name = \"labelMinDPI\";\n            labelMinDPI.Size = new Size(318, 40);\n            labelMinDPI.TabIndex = 45;\n            labelMinDPI.Text = \"100\";\n            // \n            // labelMaxDPI\n            // \n            labelMaxDPI.Dock = DockStyle.Top;\n            labelMaxDPI.ForeColor = SystemColors.GrayText;\n            labelMaxDPI.Location = new Point(553, 0);\n            labelMaxDPI.Margin = new Padding(8, 0, 8, 0);\n            labelMaxDPI.Name = \"labelMaxDPI\";\n            labelMaxDPI.Size = new Size(320, 40);\n            labelMaxDPI.TabIndex = 46;\n            labelMaxDPI.Text = \" 35000\";\n            labelMaxDPI.TextAlign = ContentAlignment.TopRight;\n            // \n            // numericUpDownCurrentDPI\n            // \n            numericUpDownCurrentDPI.BorderStyle = BorderStyle.None;\n            numericUpDownCurrentDPI.Dock = DockStyle.Top;\n            numericUpDownCurrentDPI.Increment = new decimal(new int[] { 50, 0, 0, 0 });\n            numericUpDownCurrentDPI.Location = new Point(338, 4);\n            numericUpDownCurrentDPI.Margin = new Padding(4);\n            numericUpDownCurrentDPI.Maximum = new decimal(new int[] { 35000, 0, 0, 0 });\n            numericUpDownCurrentDPI.Minimum = new decimal(new int[] { 100, 0, 0, 0 });\n            numericUpDownCurrentDPI.Name = \"numericUpDownCurrentDPI\";\n            numericUpDownCurrentDPI.Size = new Size(203, 35);\n            numericUpDownCurrentDPI.TabIndex = 47;\n            numericUpDownCurrentDPI.TextAlign = HorizontalAlignment.Center;\n            numericUpDownCurrentDPI.Value = new decimal(new int[] { 2000, 0, 0, 0 });\n            // \n            // panelDPITile\n            // \n            panelDPITile.Controls.Add(pictureDPIColor);\n            panelDPITile.Controls.Add(buttonDPIColor);\n            panelDPITile.Controls.Add(labelDPI);\n            panelDPITile.Dock = DockStyle.Top;\n            panelDPITile.Location = new Point(0, 0);\n            panelDPITile.Margin = new Padding(4);\n            panelDPITile.Name = \"panelDPITile\";\n            panelDPITile.Padding = new Padding(0, 6, 0, 6);\n            panelDPITile.Size = new Size(881, 54);\n            panelDPITile.TabIndex = 48;\n            // \n            // pictureDPIColor\n            // \n            pictureDPIColor.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            pictureDPIColor.Location = new Point(831, 14);\n            pictureDPIColor.Margin = new Padding(8);\n            pictureDPIColor.Name = \"pictureDPIColor\";\n            pictureDPIColor.Size = new Size(20, 20);\n            pictureDPIColor.TabIndex = 46;\n            pictureDPIColor.TabStop = false;\n            // \n            // buttonDPIColor\n            // \n            buttonDPIColor.AccessibleName = \"Keyboard Color\";\n            buttonDPIColor.Activated = false;\n            buttonDPIColor.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right;\n            buttonDPIColor.AutoSize = true;\n            buttonDPIColor.BackColor = SystemColors.ButtonHighlight;\n            buttonDPIColor.BorderColor = Color.Transparent;\n            buttonDPIColor.BorderRadius = 2;\n            buttonDPIColor.FlatStyle = FlatStyle.Flat;\n            buttonDPIColor.ForeColor = SystemColors.ControlText;\n            buttonDPIColor.Location = new Point(623, 2);\n            buttonDPIColor.Margin = new Padding(4, 8, 4, 8);\n            buttonDPIColor.Name = \"buttonDPIColor\";\n            buttonDPIColor.Secondary = false;\n            buttonDPIColor.Size = new Size(254, 44);\n            buttonDPIColor.TabIndex = 45;\n            buttonDPIColor.Text = Properties.Strings.Color;\n            buttonDPIColor.UseVisualStyleBackColor = false;\n            // \n            // labelDPI\n            // \n            labelDPI.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left;\n            labelDPI.AutoSize = true;\n            labelDPI.Font = new Font(\"Segoe UI\", 9F);\n            labelDPI.Location = new Point(8, 6);\n            labelDPI.Margin = new Padding(8, 0, 8, 0);\n            labelDPI.Name = \"labelDPI\";\n            labelDPI.Size = new Size(50, 32);\n            labelDPI.TabIndex = 34;\n            labelDPI.Text = \"DPI\";\n            // \n            // tableDPI\n            // \n            tableDPI.AutoSize = true;\n            tableDPI.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            tableDPI.ColumnCount = 4;\n            tableDPI.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableDPI.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableDPI.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableDPI.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableDPI.Controls.Add(buttonDPI2, 0, 0);\n            tableDPI.Controls.Add(buttonDPI1, 0, 0);\n            tableDPI.Controls.Add(buttonDPI3, 1, 0);\n            tableDPI.Controls.Add(buttonDPI4, 2, 0);\n            tableDPI.Dock = DockStyle.Top;\n            tableDPI.Location = new Point(0, 54);\n            tableDPI.Margin = new Padding(8, 4, 8, 4);\n            tableDPI.Name = \"tableDPI\";\n            tableDPI.RowCount = 1;\n            tableDPI.RowStyles.Add(new RowStyle(SizeType.Absolute, 128F));\n            tableDPI.RowStyles.Add(new RowStyle(SizeType.Absolute, 128F));\n            tableDPI.Size = new Size(881, 128);\n            tableDPI.TabIndex = 42;\n            // \n            // buttonDPI2\n            // \n            buttonDPI2.AccessibleName = \"DPI Setting 2\";\n            buttonDPI2.Activated = false;\n            buttonDPI2.BackColor = SystemColors.ControlLightLight;\n            buttonDPI2.BorderColor = Color.Transparent;\n            buttonDPI2.BorderRadius = 5;\n            buttonDPI2.Dock = DockStyle.Top;\n            buttonDPI2.FlatAppearance.BorderSize = 0;\n            buttonDPI2.FlatStyle = FlatStyle.Flat;\n            buttonDPI2.ForeColor = SystemColors.ControlText;\n            buttonDPI2.Image = Properties.Resources.lighting_dot_32;\n            buttonDPI2.ImageAlign = ContentAlignment.BottomCenter;\n            buttonDPI2.Location = new Point(224, 4);\n            buttonDPI2.Margin = new Padding(4);\n            buttonDPI2.Name = \"buttonDPI2\";\n            buttonDPI2.Secondary = false;\n            buttonDPI2.Size = new Size(212, 120);\n            buttonDPI2.TabIndex = 4;\n            buttonDPI2.Text = \"DPI 2\\r\\n1000\";\n            buttonDPI2.TextImageRelation = TextImageRelation.ImageAboveText;\n            buttonDPI2.UseVisualStyleBackColor = false;\n            // \n            // buttonDPI1\n            // \n            buttonDPI1.AccessibleName = \"DPI Setting 1\";\n            buttonDPI1.Activated = false;\n            buttonDPI1.BackColor = SystemColors.ControlLightLight;\n            buttonDPI1.BorderColor = Color.Transparent;\n            buttonDPI1.BorderRadius = 5;\n            buttonDPI1.CausesValidation = false;\n            buttonDPI1.Dock = DockStyle.Top;\n            buttonDPI1.FlatAppearance.BorderSize = 0;\n            buttonDPI1.FlatStyle = FlatStyle.Flat;\n            buttonDPI1.ForeColor = SystemColors.ControlText;\n            buttonDPI1.Image = Properties.Resources.lighting_dot_32;\n            buttonDPI1.ImageAlign = ContentAlignment.BottomCenter;\n            buttonDPI1.Location = new Point(4, 4);\n            buttonDPI1.Margin = new Padding(4);\n            buttonDPI1.Name = \"buttonDPI1\";\n            buttonDPI1.Secondary = false;\n            buttonDPI1.Size = new Size(212, 120);\n            buttonDPI1.TabIndex = 4;\n            buttonDPI1.Text = \"DPI 1\\r\\n800\";\n            buttonDPI1.TextImageRelation = TextImageRelation.ImageAboveText;\n            buttonDPI1.UseVisualStyleBackColor = false;\n            // \n            // buttonDPI3\n            // \n            buttonDPI3.AccessibleName = \"DPI Setting 3\";\n            buttonDPI3.Activated = false;\n            buttonDPI3.BackColor = SystemColors.ControlLightLight;\n            buttonDPI3.BorderColor = Color.Transparent;\n            buttonDPI3.BorderRadius = 5;\n            buttonDPI3.Dock = DockStyle.Top;\n            buttonDPI3.FlatAppearance.BorderSize = 0;\n            buttonDPI3.FlatStyle = FlatStyle.Flat;\n            buttonDPI3.ForeColor = SystemColors.ControlText;\n            buttonDPI3.Image = Properties.Resources.lighting_dot_32;\n            buttonDPI3.ImageAlign = ContentAlignment.BottomCenter;\n            buttonDPI3.Location = new Point(444, 4);\n            buttonDPI3.Margin = new Padding(4);\n            buttonDPI3.Name = \"buttonDPI3\";\n            buttonDPI3.Secondary = false;\n            buttonDPI3.Size = new Size(212, 120);\n            buttonDPI3.TabIndex = 5;\n            buttonDPI3.Text = \"DPI 3\\r\\n1200\";\n            buttonDPI3.TextImageRelation = TextImageRelation.ImageAboveText;\n            buttonDPI3.UseVisualStyleBackColor = false;\n            // \n            // buttonDPI4\n            // \n            buttonDPI4.AccessibleName = \"DPI Setting 4\";\n            buttonDPI4.Activated = false;\n            buttonDPI4.BackColor = SystemColors.ControlLightLight;\n            buttonDPI4.BorderColor = Color.Transparent;\n            buttonDPI4.BorderRadius = 5;\n            buttonDPI4.Dock = DockStyle.Top;\n            buttonDPI4.FlatAppearance.BorderSize = 0;\n            buttonDPI4.FlatStyle = FlatStyle.Flat;\n            buttonDPI4.ForeColor = SystemColors.ControlText;\n            buttonDPI4.Image = Properties.Resources.lighting_dot_32;\n            buttonDPI4.ImageAlign = ContentAlignment.BottomCenter;\n            buttonDPI4.Location = new Point(664, 4);\n            buttonDPI4.Margin = new Padding(4);\n            buttonDPI4.Name = \"buttonDPI4\";\n            buttonDPI4.Secondary = false;\n            buttonDPI4.Size = new Size(213, 120);\n            buttonDPI4.TabIndex = 6;\n            buttonDPI4.Text = \"DPI 4\\r\\n1400\";\n            buttonDPI4.TextImageRelation = TextImageRelation.ImageAboveText;\n            buttonDPI4.UseVisualStyleBackColor = false;\n            // \n            // panelPerformanceHeader\n            // \n            panelPerformanceHeader.BackColor = SystemColors.ControlLight;\n            panelPerformanceHeader.Controls.Add(pictureKeyboard);\n            panelPerformanceHeader.Controls.Add(labelPerformance);\n            panelPerformanceHeader.Dock = DockStyle.Top;\n            panelPerformanceHeader.Location = new Point(0, 14);\n            panelPerformanceHeader.Margin = new Padding(4);\n            panelPerformanceHeader.Name = \"panelPerformanceHeader\";\n            panelPerformanceHeader.Size = new Size(881, 40);\n            panelPerformanceHeader.TabIndex = 41;\n            // \n            // pictureKeyboard\n            // \n            pictureKeyboard.BackgroundImage = Properties.Resources.icons8_mauszeiger_50;\n            pictureKeyboard.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureKeyboard.Location = new Point(6, 0);\n            pictureKeyboard.Margin = new Padding(4);\n            pictureKeyboard.Name = \"pictureKeyboard\";\n            pictureKeyboard.Size = new Size(32, 32);\n            pictureKeyboard.TabIndex = 35;\n            pictureKeyboard.TabStop = false;\n            // \n            // labelPerformance\n            // \n            labelPerformance.AutoSize = true;\n            labelPerformance.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelPerformance.Location = new Point(44, 0);\n            labelPerformance.Margin = new Padding(8, 0, 8, 0);\n            labelPerformance.Name = \"labelPerformance\";\n            labelPerformance.Size = new Size(161, 32);\n            labelPerformance.TabIndex = 34;\n            labelPerformance.Text = \"Performance\";\n            // \n            // panelLighting\n            // \n            panelLighting.AutoSize = true;\n            panelLighting.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelLighting.Controls.Add(panelLightingContent);\n            panelLighting.Controls.Add(panelLightingHeader);\n            panelLighting.Dock = DockStyle.Top;\n            panelLighting.Location = new Point(14, 823);\n            panelLighting.Margin = new Padding(4);\n            panelLighting.Name = \"panelLighting\";\n            panelLighting.Padding = new Padding(0, 0, 0, 34);\n            panelLighting.Size = new Size(881, 388);\n            panelLighting.TabIndex = 42;\n            // \n            // panelLightingContent\n            // \n            panelLightingContent.AutoSize = true;\n            panelLightingContent.Controls.Add(tableLayoutLightingZones);\n            panelLightingContent.Controls.Add(comboBoxAnimationDirection);\n            panelLightingContent.Controls.Add(labelAnimationDirection);\n            panelLightingContent.Controls.Add(checkBoxRandomColor);\n            panelLightingContent.Controls.Add(comboBoxAnimationSpeed);\n            panelLightingContent.Controls.Add(labelAnimationSpeed);\n            panelLightingContent.Controls.Add(pictureBoxLightingColor);\n            panelLightingContent.Controls.Add(buttonLightingColor);\n            panelLightingContent.Controls.Add(comboBoxLightingMode);\n            panelLightingContent.Controls.Add(labelLightingMode);\n            panelLightingContent.Dock = DockStyle.Top;\n            panelLightingContent.Location = new Point(0, 40);\n            panelLightingContent.Margin = new Padding(4);\n            panelLightingContent.Name = \"panelLightingContent\";\n            panelLightingContent.Padding = new Padding(0, 0, 0, 14);\n            panelLightingContent.Size = new Size(881, 314);\n            panelLightingContent.TabIndex = 42;\n            // \n            // tableLayoutLightingZones\n            // \n            tableLayoutLightingZones.AutoSize = true;\n            tableLayoutLightingZones.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            tableLayoutLightingZones.ColumnCount = 5;\n            tableLayoutLightingZones.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));\n            tableLayoutLightingZones.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));\n            tableLayoutLightingZones.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));\n            tableLayoutLightingZones.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));\n            tableLayoutLightingZones.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));\n            tableLayoutLightingZones.Controls.Add(buttonLightingZoneScroll, 0, 0);\n            tableLayoutLightingZones.Controls.Add(buttonLightingZoneLogo, 0, 0);\n            tableLayoutLightingZones.Controls.Add(buttonLightingZoneAll, 0, 0);\n            tableLayoutLightingZones.Controls.Add(buttonLightingZoneUnderglow, 1, 0);\n            tableLayoutLightingZones.Controls.Add(buttonLightingZoneDock, 2, 0);\n            tableLayoutLightingZones.Dock = DockStyle.Top;\n            tableLayoutLightingZones.Location = new Point(0, 0);\n            tableLayoutLightingZones.Margin = new Padding(8, 4, 8, 4);\n            tableLayoutLightingZones.Name = \"tableLayoutLightingZones\";\n            tableLayoutLightingZones.RowCount = 1;\n            tableLayoutLightingZones.RowStyles.Add(new RowStyle(SizeType.Absolute, 80F));\n            tableLayoutLightingZones.Size = new Size(881, 80);\n            tableLayoutLightingZones.TabIndex = 56;\n            // \n            // buttonLightingZoneScroll\n            // \n            buttonLightingZoneScroll.AccessibleName = \"DPI Setting 4\";\n            buttonLightingZoneScroll.Activated = false;\n            buttonLightingZoneScroll.AutoSize = true;\n            buttonLightingZoneScroll.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            buttonLightingZoneScroll.BackColor = SystemColors.ControlLightLight;\n            buttonLightingZoneScroll.BorderColor = Color.LightGreen;\n            buttonLightingZoneScroll.BorderRadius = 5;\n            buttonLightingZoneScroll.Dock = DockStyle.Fill;\n            buttonLightingZoneScroll.FlatAppearance.BorderSize = 0;\n            buttonLightingZoneScroll.FlatStyle = FlatStyle.Flat;\n            buttonLightingZoneScroll.ForeColor = SystemColors.ControlText;\n            buttonLightingZoneScroll.ImageAlign = ContentAlignment.BottomCenter;\n            buttonLightingZoneScroll.Location = new Point(356, 4);\n            buttonLightingZoneScroll.Margin = new Padding(4);\n            buttonLightingZoneScroll.Name = \"buttonLightingZoneScroll\";\n            buttonLightingZoneScroll.Secondary = false;\n            buttonLightingZoneScroll.Size = new Size(168, 72);\n            buttonLightingZoneScroll.TabIndex = 7;\n            buttonLightingZoneScroll.Text = \"Scrollwheel\";\n            buttonLightingZoneScroll.TextImageRelation = TextImageRelation.ImageAboveText;\n            buttonLightingZoneScroll.UseVisualStyleBackColor = false;\n            // \n            // buttonLightingZoneLogo\n            // \n            buttonLightingZoneLogo.AccessibleName = \"DPI Setting 2\";\n            buttonLightingZoneLogo.Activated = false;\n            buttonLightingZoneLogo.AutoSize = true;\n            buttonLightingZoneLogo.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            buttonLightingZoneLogo.BackColor = SystemColors.ControlLightLight;\n            buttonLightingZoneLogo.BorderColor = Color.LightGreen;\n            buttonLightingZoneLogo.BorderRadius = 5;\n            buttonLightingZoneLogo.Dock = DockStyle.Fill;\n            buttonLightingZoneLogo.FlatAppearance.BorderSize = 0;\n            buttonLightingZoneLogo.FlatStyle = FlatStyle.Flat;\n            buttonLightingZoneLogo.ForeColor = SystemColors.ControlText;\n            buttonLightingZoneLogo.ImageAlign = ContentAlignment.BottomCenter;\n            buttonLightingZoneLogo.Location = new Point(180, 4);\n            buttonLightingZoneLogo.Margin = new Padding(4);\n            buttonLightingZoneLogo.Name = \"buttonLightingZoneLogo\";\n            buttonLightingZoneLogo.Secondary = false;\n            buttonLightingZoneLogo.Size = new Size(168, 72);\n            buttonLightingZoneLogo.TabIndex = 4;\n            buttonLightingZoneLogo.Text = \"Logo\";\n            buttonLightingZoneLogo.TextImageRelation = TextImageRelation.ImageAboveText;\n            buttonLightingZoneLogo.UseVisualStyleBackColor = false;\n            // \n            // buttonLightingZoneAll\n            // \n            buttonLightingZoneAll.AccessibleName = \"DPI Setting 1\";\n            buttonLightingZoneAll.Activated = false;\n            buttonLightingZoneAll.AutoSize = true;\n            buttonLightingZoneAll.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            buttonLightingZoneAll.BackColor = SystemColors.ControlLightLight;\n            buttonLightingZoneAll.BorderColor = Color.LightGreen;\n            buttonLightingZoneAll.BorderRadius = 5;\n            buttonLightingZoneAll.CausesValidation = false;\n            buttonLightingZoneAll.Dock = DockStyle.Fill;\n            buttonLightingZoneAll.FlatAppearance.BorderSize = 0;\n            buttonLightingZoneAll.FlatStyle = FlatStyle.Flat;\n            buttonLightingZoneAll.ForeColor = SystemColors.ControlText;\n            buttonLightingZoneAll.Location = new Point(4, 4);\n            buttonLightingZoneAll.Margin = new Padding(4);\n            buttonLightingZoneAll.Name = \"buttonLightingZoneAll\";\n            buttonLightingZoneAll.Secondary = false;\n            buttonLightingZoneAll.Size = new Size(168, 72);\n            buttonLightingZoneAll.TabIndex = 4;\n            buttonLightingZoneAll.Text = \"All\";\n            buttonLightingZoneAll.TextImageRelation = TextImageRelation.ImageAboveText;\n            buttonLightingZoneAll.UseVisualStyleBackColor = false;\n            // \n            // buttonLightingZoneUnderglow\n            // \n            buttonLightingZoneUnderglow.AccessibleName = \"DPI Setting 3\";\n            buttonLightingZoneUnderglow.Activated = false;\n            buttonLightingZoneUnderglow.AutoSize = true;\n            buttonLightingZoneUnderglow.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            buttonLightingZoneUnderglow.BackColor = SystemColors.ControlLightLight;\n            buttonLightingZoneUnderglow.BorderColor = Color.LightGreen;\n            buttonLightingZoneUnderglow.BorderRadius = 5;\n            buttonLightingZoneUnderglow.Dock = DockStyle.Fill;\n            buttonLightingZoneUnderglow.FlatAppearance.BorderSize = 0;\n            buttonLightingZoneUnderglow.FlatStyle = FlatStyle.Flat;\n            buttonLightingZoneUnderglow.ForeColor = SystemColors.ControlText;\n            buttonLightingZoneUnderglow.ImageAlign = ContentAlignment.BottomCenter;\n            buttonLightingZoneUnderglow.Location = new Point(532, 4);\n            buttonLightingZoneUnderglow.Margin = new Padding(4);\n            buttonLightingZoneUnderglow.Name = \"buttonLightingZoneUnderglow\";\n            buttonLightingZoneUnderglow.Secondary = false;\n            buttonLightingZoneUnderglow.Size = new Size(168, 72);\n            buttonLightingZoneUnderglow.TabIndex = 5;\n            buttonLightingZoneUnderglow.Text = \"Underglow\";\n            buttonLightingZoneUnderglow.TextImageRelation = TextImageRelation.ImageAboveText;\n            buttonLightingZoneUnderglow.UseVisualStyleBackColor = false;\n            // \n            // buttonLightingZoneDock\n            // \n            buttonLightingZoneDock.AccessibleName = \"DPI Setting 4\";\n            buttonLightingZoneDock.Activated = false;\n            buttonLightingZoneDock.AutoSize = true;\n            buttonLightingZoneDock.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            buttonLightingZoneDock.BackColor = SystemColors.ControlLightLight;\n            buttonLightingZoneDock.BorderColor = Color.LightGreen;\n            buttonLightingZoneDock.BorderRadius = 5;\n            buttonLightingZoneDock.Dock = DockStyle.Fill;\n            buttonLightingZoneDock.FlatAppearance.BorderSize = 0;\n            buttonLightingZoneDock.FlatStyle = FlatStyle.Flat;\n            buttonLightingZoneDock.ForeColor = SystemColors.ControlText;\n            buttonLightingZoneDock.ImageAlign = ContentAlignment.BottomCenter;\n            buttonLightingZoneDock.Location = new Point(708, 4);\n            buttonLightingZoneDock.Margin = new Padding(4);\n            buttonLightingZoneDock.Name = \"buttonLightingZoneDock\";\n            buttonLightingZoneDock.Secondary = false;\n            buttonLightingZoneDock.Size = new Size(169, 72);\n            buttonLightingZoneDock.TabIndex = 6;\n            buttonLightingZoneDock.Text = \"Dock\";\n            buttonLightingZoneDock.TextImageRelation = TextImageRelation.ImageAboveText;\n            buttonLightingZoneDock.UseVisualStyleBackColor = false;\n            // \n            // comboBoxAnimationDirection\n            // \n            comboBoxAnimationDirection.BorderColor = Color.White;\n            comboBoxAnimationDirection.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboBoxAnimationDirection.DropDownStyle = ComboBoxStyle.DropDownList;\n            comboBoxAnimationDirection.FlatStyle = FlatStyle.Flat;\n            comboBoxAnimationDirection.FormattingEnabled = true;\n            comboBoxAnimationDirection.Location = new Point(490, 260);\n            comboBoxAnimationDirection.Margin = new Padding(22, 0, 22, 0);\n            comboBoxAnimationDirection.Name = \"comboBoxAnimationDirection\";\n            comboBoxAnimationDirection.Size = new Size(376, 40);\n            comboBoxAnimationDirection.TabIndex = 54;\n            // \n            // labelAnimationDirection\n            // \n            labelAnimationDirection.Location = new Point(10, 256);\n            labelAnimationDirection.Margin = new Padding(8, 0, 8, 0);\n            labelAnimationDirection.Name = \"labelAnimationDirection\";\n            labelAnimationDirection.Size = new Size(422, 44);\n            labelAnimationDirection.TabIndex = 55;\n            labelAnimationDirection.Text = \"Animation Direction\";\n            // \n            // checkBoxRandomColor\n            // \n            checkBoxRandomColor.Location = new Point(698, 144);\n            checkBoxRandomColor.Margin = new Padding(8, 0, 8, 0);\n            checkBoxRandomColor.Name = \"checkBoxRandomColor\";\n            checkBoxRandomColor.Size = new Size(170, 50);\n            checkBoxRandomColor.TabIndex = 53;\n            checkBoxRandomColor.Text = \"Random\";\n            checkBoxRandomColor.UseVisualStyleBackColor = true;\n            // \n            // comboBoxAnimationSpeed\n            // \n            comboBoxAnimationSpeed.BorderColor = Color.White;\n            comboBoxAnimationSpeed.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboBoxAnimationSpeed.DropDownStyle = ComboBoxStyle.DropDownList;\n            comboBoxAnimationSpeed.FlatStyle = FlatStyle.Flat;\n            comboBoxAnimationSpeed.FormattingEnabled = true;\n            comboBoxAnimationSpeed.Location = new Point(490, 208);\n            comboBoxAnimationSpeed.Margin = new Padding(22, 0, 22, 0);\n            comboBoxAnimationSpeed.Name = \"comboBoxAnimationSpeed\";\n            comboBoxAnimationSpeed.Size = new Size(376, 40);\n            comboBoxAnimationSpeed.TabIndex = 51;\n            // \n            // labelAnimationSpeed\n            // \n            labelAnimationSpeed.Location = new Point(10, 212);\n            labelAnimationSpeed.Margin = new Padding(8, 0, 8, 0);\n            labelAnimationSpeed.Name = \"labelAnimationSpeed\";\n            labelAnimationSpeed.Size = new Size(422, 44);\n            labelAnimationSpeed.TabIndex = 52;\n            labelAnimationSpeed.Text = \"Animation Speed\";\n            // \n            // pictureBoxLightingColor\n            // \n            pictureBoxLightingColor.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            pictureBoxLightingColor.Location = new Point(623, 158);\n            pictureBoxLightingColor.Margin = new Padding(8);\n            pictureBoxLightingColor.Name = \"pictureBoxLightingColor\";\n            pictureBoxLightingColor.Size = new Size(26, 26);\n            pictureBoxLightingColor.TabIndex = 50;\n            pictureBoxLightingColor.TabStop = false;\n            // \n            // buttonLightingColor\n            // \n            buttonLightingColor.AccessibleName = \"Keyboard Color\";\n            buttonLightingColor.Activated = false;\n            buttonLightingColor.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            buttonLightingColor.BackColor = SystemColors.ButtonHighlight;\n            buttonLightingColor.BorderColor = Color.Transparent;\n            buttonLightingColor.BorderRadius = 2;\n            buttonLightingColor.FlatStyle = FlatStyle.Flat;\n            buttonLightingColor.ForeColor = SystemColors.ControlText;\n            buttonLightingColor.Location = new Point(488, 145);\n            buttonLightingColor.Margin = new Padding(0);\n            buttonLightingColor.Name = \"buttonLightingColor\";\n            buttonLightingColor.Secondary = false;\n            buttonLightingColor.Size = new Size(180, 50);\n            buttonLightingColor.TabIndex = 49;\n            buttonLightingColor.Text = Properties.Strings.Color;\n            buttonLightingColor.TextAlign = ContentAlignment.MiddleLeft;\n            buttonLightingColor.UseVisualStyleBackColor = false;\n            // \n            // comboBoxLightingMode\n            // \n            comboBoxLightingMode.BorderColor = Color.White;\n            comboBoxLightingMode.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboBoxLightingMode.DropDownStyle = ComboBoxStyle.DropDownList;\n            comboBoxLightingMode.FlatStyle = FlatStyle.Flat;\n            comboBoxLightingMode.FormattingEnabled = true;\n            comboBoxLightingMode.Location = new Point(490, 96);\n            comboBoxLightingMode.Margin = new Padding(22, 0, 22, 0);\n            comboBoxLightingMode.Name = \"comboBoxLightingMode\";\n            comboBoxLightingMode.Size = new Size(378, 40);\n            comboBoxLightingMode.TabIndex = 46;\n            // \n            // labelLightingMode\n            // \n            labelLightingMode.Location = new Point(10, 96);\n            labelLightingMode.Margin = new Padding(8, 0, 8, 0);\n            labelLightingMode.Name = \"labelLightingMode\";\n            labelLightingMode.Size = new Size(422, 44);\n            labelLightingMode.TabIndex = 47;\n            labelLightingMode.Text = \"Lighting Mode\";\n            // \n            // panelLightingHeader\n            // \n            panelLightingHeader.BackColor = SystemColors.ControlLight;\n            panelLightingHeader.Controls.Add(sliderBrightness);\n            panelLightingHeader.Controls.Add(pictureBoxLighting);\n            panelLightingHeader.Controls.Add(labelLighting);\n            panelLightingHeader.Dock = DockStyle.Top;\n            panelLightingHeader.Location = new Point(0, 0);\n            panelLightingHeader.Margin = new Padding(4);\n            panelLightingHeader.Name = \"panelLightingHeader\";\n            panelLightingHeader.Size = new Size(881, 40);\n            panelLightingHeader.TabIndex = 41;\n            // \n            // sliderBrightness\n            // \n            sliderBrightness.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right;\n            sliderBrightness.Location = new Point(497, 2);\n            sliderBrightness.Margin = new Padding(2);\n            sliderBrightness.Max = 100;\n            sliderBrightness.Min = 0;\n            sliderBrightness.Name = \"sliderBrightness\";\n            sliderBrightness.Size = new Size(378, 36);\n            sliderBrightness.Step = 1;\n            sliderBrightness.TabIndex = 51;\n            sliderBrightness.Text = \"sliderBrightness\";\n            sliderBrightness.Value = 25;\n            // \n            // pictureBoxLighting\n            // \n            pictureBoxLighting.BackgroundImage = Properties.Resources.backlight;\n            pictureBoxLighting.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureBoxLighting.Location = new Point(6, 0);\n            pictureBoxLighting.Margin = new Padding(4);\n            pictureBoxLighting.Name = \"pictureBoxLighting\";\n            pictureBoxLighting.Size = new Size(32, 32);\n            pictureBoxLighting.TabIndex = 35;\n            pictureBoxLighting.TabStop = false;\n            // \n            // labelLighting\n            // \n            labelLighting.AutoSize = true;\n            labelLighting.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelLighting.Location = new Point(44, 0);\n            labelLighting.Margin = new Padding(8, 0, 8, 0);\n            labelLighting.Name = \"labelLighting\";\n            labelLighting.Size = new Size(108, 32);\n            labelLighting.TabIndex = 34;\n            labelLighting.Text = \"Lighting\";\n            // \n            // panelEnergy\n            // \n            panelEnergy.AutoSize = true;\n            panelEnergy.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelEnergy.Controls.Add(labelLowBatteryWarningValue);\n            panelEnergy.Controls.Add(comboBoxAutoPowerOff);\n            panelEnergy.Controls.Add(sliderLowBatteryWarning);\n            panelEnergy.Controls.Add(labelLowBatteryWarning);\n            panelEnergy.Controls.Add(labelAutoPowerOff);\n            panelEnergy.Controls.Add(panelEnergyHeader);\n            panelEnergy.Dock = DockStyle.Top;\n            panelEnergy.Location = new Point(14, 1211);\n            panelEnergy.Margin = new Padding(4);\n            panelEnergy.Name = \"panelEnergy\";\n            panelEnergy.Padding = new Padding(0, 0, 0, 34);\n            panelEnergy.Size = new Size(881, 192);\n            panelEnergy.TabIndex = 43;\n            // \n            // labelLowBatteryWarningValue\n            // \n            labelLowBatteryWarningValue.Location = new Point(802, 114);\n            labelLowBatteryWarningValue.Margin = new Padding(8, 0, 8, 0);\n            labelLowBatteryWarningValue.Name = \"labelLowBatteryWarningValue\";\n            labelLowBatteryWarningValue.Size = new Size(64, 40);\n            labelLowBatteryWarningValue.TabIndex = 51;\n            labelLowBatteryWarningValue.Text = \"20%\";\n            labelLowBatteryWarningValue.TextAlign = ContentAlignment.MiddleRight;\n            // \n            // comboBoxAutoPowerOff\n            // \n            comboBoxAutoPowerOff.BorderColor = Color.White;\n            comboBoxAutoPowerOff.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboBoxAutoPowerOff.DropDownStyle = ComboBoxStyle.DropDownList;\n            comboBoxAutoPowerOff.FlatStyle = FlatStyle.Flat;\n            comboBoxAutoPowerOff.FormattingEnabled = true;\n            comboBoxAutoPowerOff.Location = new Point(490, 58);\n            comboBoxAutoPowerOff.Margin = new Padding(22, 0, 22, 0);\n            comboBoxAutoPowerOff.Name = \"comboBoxAutoPowerOff\";\n            comboBoxAutoPowerOff.Size = new Size(378, 40);\n            comboBoxAutoPowerOff.TabIndex = 56;\n            // \n            // sliderLowBatteryWarning\n            // \n            sliderLowBatteryWarning.AccessibleName = \"DPI Slider\";\n            sliderLowBatteryWarning.Location = new Point(482, 114);\n            sliderLowBatteryWarning.Margin = new Padding(4);\n            sliderLowBatteryWarning.Max = 50;\n            sliderLowBatteryWarning.Min = 0;\n            sliderLowBatteryWarning.Name = \"sliderLowBatteryWarning\";\n            sliderLowBatteryWarning.Size = new Size(324, 40);\n            sliderLowBatteryWarning.Step = 10;\n            sliderLowBatteryWarning.TabIndex = 50;\n            sliderLowBatteryWarning.TabStop = false;\n            sliderLowBatteryWarning.Text = \"sliderBattery\";\n            sliderLowBatteryWarning.Value = 0;\n            // \n            // labelLowBatteryWarning\n            // \n            labelLowBatteryWarning.Location = new Point(10, 110);\n            labelLowBatteryWarning.Margin = new Padding(8, 0, 8, 0);\n            labelLowBatteryWarning.Name = \"labelLowBatteryWarning\";\n            labelLowBatteryWarning.Size = new Size(422, 44);\n            labelLowBatteryWarning.TabIndex = 57;\n            labelLowBatteryWarning.Text = \"Low Battery Warning\";\n            // \n            // labelAutoPowerOff\n            // \n            labelAutoPowerOff.Location = new Point(10, 58);\n            labelAutoPowerOff.Margin = new Padding(8, 0, 8, 0);\n            labelAutoPowerOff.Name = \"labelAutoPowerOff\";\n            labelAutoPowerOff.Size = new Size(422, 44);\n            labelAutoPowerOff.TabIndex = 56;\n            labelAutoPowerOff.Text = \"Auto Power Off\";\n            // \n            // panelEnergyHeader\n            // \n            panelEnergyHeader.BackColor = SystemColors.ControlLight;\n            panelEnergyHeader.Controls.Add(pictureBoxEnergy);\n            panelEnergyHeader.Controls.Add(labelEnergy);\n            panelEnergyHeader.Dock = DockStyle.Top;\n            panelEnergyHeader.Location = new Point(0, 0);\n            panelEnergyHeader.Margin = new Padding(4);\n            panelEnergyHeader.Name = \"panelEnergyHeader\";\n            panelEnergyHeader.Size = new Size(881, 40);\n            panelEnergyHeader.TabIndex = 41;\n            // \n            // pictureBoxEnergy\n            // \n            pictureBoxEnergy.BackgroundImage = Properties.Resources.icons8_charging_battery_32;\n            pictureBoxEnergy.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureBoxEnergy.Location = new Point(6, 0);\n            pictureBoxEnergy.Margin = new Padding(4);\n            pictureBoxEnergy.Name = \"pictureBoxEnergy\";\n            pictureBoxEnergy.Size = new Size(32, 32);\n            pictureBoxEnergy.TabIndex = 35;\n            pictureBoxEnergy.TabStop = false;\n            // \n            // labelEnergy\n            // \n            labelEnergy.AutoSize = true;\n            labelEnergy.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelEnergy.Location = new Point(44, 0);\n            labelEnergy.Margin = new Padding(8, 0, 8, 0);\n            labelEnergy.Name = \"labelEnergy\";\n            labelEnergy.Size = new Size(93, 32);\n            labelEnergy.TabIndex = 34;\n            labelEnergy.Text = \"Energy\";\n            // \n            // tableLayoutProfiles\n            // \n            tableLayoutProfiles.AutoSize = true;\n            tableLayoutProfiles.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            tableLayoutProfiles.ColumnCount = 2;\n            tableLayoutProfiles.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));\n            tableLayoutProfiles.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));\n            tableLayoutProfiles.Controls.Add(panelProfiles, 1, 0);\n            tableLayoutProfiles.Controls.Add(panelBatteryState, 0, 0);\n            tableLayoutProfiles.Dock = DockStyle.Top;\n            tableLayoutProfiles.Location = new Point(14, 14);\n            tableLayoutProfiles.Margin = new Padding(4);\n            tableLayoutProfiles.Name = \"tableLayoutProfiles\";\n            tableLayoutProfiles.RowCount = 1;\n            tableLayoutProfiles.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));\n            tableLayoutProfiles.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));\n            tableLayoutProfiles.Size = new Size(881, 76);\n            tableLayoutProfiles.TabIndex = 44;\n            // \n            // panelBatteryState\n            // \n            panelBatteryState.Controls.Add(labelChargingState);\n            panelBatteryState.Controls.Add(labelBatteryState);\n            panelBatteryState.Controls.Add(pictureBoxBatteryState);\n            panelBatteryState.Location = new Point(4, 4);\n            panelBatteryState.Margin = new Padding(4);\n            panelBatteryState.Name = \"panelBatteryState\";\n            panelBatteryState.Size = new Size(400, 66);\n            panelBatteryState.TabIndex = 1;\n            // \n            // labelChargingState\n            // \n            labelChargingState.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left;\n            labelChargingState.AutoSize = true;\n            labelChargingState.Font = new Font(\"Segoe UI\", 10F, FontStyle.Bold);\n            labelChargingState.Location = new Point(154, 14);\n            labelChargingState.Margin = new Padding(4, 0, 4, 0);\n            labelChargingState.Name = \"labelChargingState\";\n            labelChargingState.Size = new Size(134, 37);\n            labelChargingState.TabIndex = 38;\n            labelChargingState.Text = \"Charging\";\n            labelChargingState.TextAlign = ContentAlignment.MiddleLeft;\n            // \n            // labelBatteryState\n            // \n            labelBatteryState.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right;\n            labelBatteryState.AutoSize = true;\n            labelBatteryState.Font = new Font(\"Segoe UI\", 10F, FontStyle.Bold);\n            labelBatteryState.Location = new Point(60, 14);\n            labelBatteryState.Margin = new Padding(4, 0, 4, 0);\n            labelBatteryState.Name = \"labelBatteryState\";\n            labelBatteryState.Size = new Size(88, 37);\n            labelBatteryState.TabIndex = 37;\n            labelBatteryState.Text = \"100%\";\n            labelBatteryState.TextAlign = ContentAlignment.MiddleRight;\n            // \n            // pictureBoxBatteryState\n            // \n            pictureBoxBatteryState.BackgroundImage = Properties.Resources.icons8_ladende_batterie_48;\n            pictureBoxBatteryState.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureBoxBatteryState.Dock = DockStyle.Left;\n            pictureBoxBatteryState.Location = new Point(0, 0);\n            pictureBoxBatteryState.Margin = new Padding(4);\n            pictureBoxBatteryState.Name = \"pictureBoxBatteryState\";\n            pictureBoxBatteryState.Size = new Size(52, 66);\n            pictureBoxBatteryState.TabIndex = 36;\n            pictureBoxBatteryState.TabStop = false;\n            // \n            // buttonSync\n            // \n            buttonSync.AccessibleName = \"Keyboard Color\";\n            buttonSync.Activated = false;\n            buttonSync.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            buttonSync.BackColor = SystemColors.ButtonHighlight;\n            buttonSync.BorderColor = Color.Transparent;\n            buttonSync.BorderRadius = 2;\n            buttonSync.FlatStyle = FlatStyle.Flat;\n            buttonSync.ForeColor = SystemColors.ControlText;\n            buttonSync.Location = new Point(8, 74);\n            buttonSync.Margin = new Padding(4, 8, 4, 8);\n            buttonSync.Name = \"buttonSync\";\n            buttonSync.Secondary = false;\n            buttonSync.Size = new Size(852, 50);\n            buttonSync.TabIndex = 46;\n            buttonSync.Text = \"Synchronize with Mouse\";\n            buttonSync.UseVisualStyleBackColor = false;\n            buttonSync.Click += ButtonSync_Click;\n            // \n            // panelBottomButtons\n            // \n            panelBottomButtons.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelBottomButtons.Controls.Add(buttonImport);\n            panelBottomButtons.Controls.Add(buttonExport);\n            panelBottomButtons.Controls.Add(buttonSync);\n            panelBottomButtons.Dock = DockStyle.Top;\n            panelBottomButtons.Location = new Point(14, 1403);\n            panelBottomButtons.Margin = new Padding(4);\n            panelBottomButtons.Name = \"panelBottomButtons\";\n            panelBottomButtons.Size = new Size(881, 132);\n            panelBottomButtons.TabIndex = 47;\n            // \n            // buttonImport\n            // \n            buttonImport.AccessibleName = \"Keyboard Color\";\n            buttonImport.Activated = false;\n            buttonImport.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            buttonImport.BackColor = SystemColors.ButtonHighlight;\n            buttonImport.BorderColor = Color.Transparent;\n            buttonImport.BorderRadius = 2;\n            buttonImport.FlatStyle = FlatStyle.Flat;\n            buttonImport.ForeColor = SystemColors.ControlText;\n            buttonImport.Location = new Point(440, 12);\n            buttonImport.Margin = new Padding(4, 8, 4, 8);\n            buttonImport.Name = \"buttonImport\";\n            buttonImport.Secondary = false;\n            buttonImport.Size = new Size(420, 50);\n            buttonImport.TabIndex = 48;\n            buttonImport.Text = \"Import Profile\";\n            buttonImport.UseVisualStyleBackColor = false;\n            buttonImport.Click += buttonImport_Click;\n            // \n            // buttonExport\n            // \n            buttonExport.AccessibleName = \"Keyboard Color\";\n            buttonExport.Activated = false;\n            buttonExport.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            buttonExport.BackColor = SystemColors.ButtonHighlight;\n            buttonExport.BorderColor = Color.Transparent;\n            buttonExport.BorderRadius = 2;\n            buttonExport.FlatStyle = FlatStyle.Flat;\n            buttonExport.ForeColor = SystemColors.ControlText;\n            buttonExport.Location = new Point(8, 12);\n            buttonExport.Margin = new Padding(4, 8, 4, 8);\n            buttonExport.Name = \"buttonExport\";\n            buttonExport.Secondary = false;\n            buttonExport.Size = new Size(420, 50);\n            buttonExport.TabIndex = 47;\n            buttonExport.Text = \"Export Profile\";\n            buttonExport.UseVisualStyleBackColor = false;\n            buttonExport.Click += buttonExport_Click;\n            // \n            // tableLayoutPanel2\n            // \n            tableLayoutPanel2.AutoSize = true;\n            tableLayoutPanel2.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            tableLayoutPanel2.ColumnCount = 4;\n            tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableLayoutPanel2.Controls.Add(rButton1, 0, 0);\n            tableLayoutPanel2.Location = new Point(0, 0);\n            tableLayoutPanel2.Name = \"tableLayoutPanel2\";\n            tableLayoutPanel2.RowCount = 1;\n            tableLayoutPanel2.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F));\n            tableLayoutPanel2.Size = new Size(200, 100);\n            tableLayoutPanel2.TabIndex = 0;\n            // \n            // rButton1\n            // \n            rButton1.AccessibleName = \"DPI Setting 2\";\n            rButton1.Activated = false;\n            rButton1.BackColor = SystemColors.ControlLightLight;\n            rButton1.BorderColor = Color.Transparent;\n            rButton1.BorderRadius = 5;\n            rButton1.Dock = DockStyle.Top;\n            rButton1.FlatAppearance.BorderSize = 0;\n            rButton1.FlatStyle = FlatStyle.Flat;\n            rButton1.ForeColor = SystemColors.ControlText;\n            rButton1.Image = Properties.Resources.lighting_dot_32;\n            rButton1.ImageAlign = ContentAlignment.BottomCenter;\n            rButton1.Location = new Point(3, 3);\n            rButton1.Name = \"rButton1\";\n            rButton1.Secondary = false;\n            rButton1.Size = new Size(44, 90);\n            rButton1.TabIndex = 4;\n            rButton1.Text = \"DPI 2\\r\\n1000\";\n            rButton1.TextImageRelation = TextImageRelation.ImageAboveText;\n            rButton1.UseVisualStyleBackColor = false;\n            // \n            // rButton2\n            // \n            rButton2.AccessibleName = \"DPI Setting 1\";\n            rButton2.Activated = false;\n            rButton2.BackColor = SystemColors.ControlLightLight;\n            rButton2.BorderColor = Color.Transparent;\n            rButton2.BorderRadius = 5;\n            rButton2.CausesValidation = false;\n            rButton2.Dock = DockStyle.Top;\n            rButton2.FlatAppearance.BorderSize = 0;\n            rButton2.FlatStyle = FlatStyle.Flat;\n            rButton2.ForeColor = SystemColors.ControlText;\n            rButton2.Image = Properties.Resources.lighting_dot_32;\n            rButton2.Location = new Point(3, 3);\n            rButton2.Name = \"rButton2\";\n            rButton2.Secondary = false;\n            rButton2.Size = new Size(44, 90);\n            rButton2.TabIndex = 4;\n            rButton2.Text = \"DPI 1\\r\\n800\";\n            rButton2.TextImageRelation = TextImageRelation.ImageAboveText;\n            rButton2.UseVisualStyleBackColor = false;\n            // \n            // AsusMouseSettings\n            // \n            AutoScaleDimensions = new SizeF(192F, 192F);\n            AutoScaleMode = AutoScaleMode.Dpi;\n            AutoScroll = true;\n            AutoSize = true;\n            AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            ClientSize = new Size(909, 1558);\n            Controls.Add(panelBottomButtons);\n            Controls.Add(panelEnergy);\n            Controls.Add(panelLighting);\n            Controls.Add(panelPerformance);\n            Controls.Add(tableLayoutProfiles);\n            Margin = new Padding(4);\n            MaximizeBox = false;\n            MdiChildrenMinimizedAnchorBottom = false;\n            MinimizeBox = false;\n            MinimumSize = new Size(935, 760);\n            Name = \"AsusMouseSettings\";\n            Padding = new Padding(14);\n            ShowIcon = false;\n            ShowInTaskbar = false;\n            Text = \"Mouse Settings\";\n            panelProfiles.ResumeLayout(false);\n            panelProfiles.PerformLayout();\n            panelPerformance.ResumeLayout(false);\n            panelPerformance.PerformLayout();\n            panelPerformanceOther.ResumeLayout(false);\n            panelPerformanceOther.PerformLayout();\n            panelDeceleration.ResumeLayout(false);\n            panelAcceleration.ResumeLayout(false);\n            panelLiftOffDistance.ResumeLayout(false);\n            panelDebounce.ResumeLayout(false);\n            panelAngleSnapping.ResumeLayout(false);\n            panelMotionSync.ResumeLayout(false);\n            panelZoneMode.ResumeLayout(false);\n            panelPollingRate.ResumeLayout(false);\n            panelDPISettings.ResumeLayout(false);\n            panelDPISettings.PerformLayout();\n            tableLayoutPanel1.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)numericUpDownCurrentDPI).EndInit();\n            panelDPITile.ResumeLayout(false);\n            panelDPITile.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureDPIColor).EndInit();\n            tableDPI.ResumeLayout(false);\n            panelPerformanceHeader.ResumeLayout(false);\n            panelPerformanceHeader.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureKeyboard).EndInit();\n            panelLighting.ResumeLayout(false);\n            panelLighting.PerformLayout();\n            panelLightingContent.ResumeLayout(false);\n            panelLightingContent.PerformLayout();\n            tableLayoutLightingZones.ResumeLayout(false);\n            tableLayoutLightingZones.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureBoxLightingColor).EndInit();\n            panelLightingHeader.ResumeLayout(false);\n            panelLightingHeader.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureBoxLighting).EndInit();\n            panelEnergy.ResumeLayout(false);\n            panelEnergyHeader.ResumeLayout(false);\n            panelEnergyHeader.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureBoxEnergy).EndInit();\n            tableLayoutProfiles.ResumeLayout(false);\n            panelBatteryState.ResumeLayout(false);\n            panelBatteryState.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureBoxBatteryState).EndInit();\n            panelBottomButtons.ResumeLayout(false);\n            tableLayoutPanel2.ResumeLayout(false);\n            ResumeLayout(false);\n            PerformLayout();\n        }\n\n        #endregion\n\n        private Panel panelProfiles;\n        private Label labelProfile;\n        private UI.RComboBox comboProfile;\n        private Panel panelPerformance;\n        private Panel panelPerformanceHeader;\n        private PictureBox pictureKeyboard;\n        private Label labelPerformance;\n        private Panel panelLighting;\n        private Panel panelLightingHeader;\n        private PictureBox pictureBoxLighting;\n        private Label labelLighting;\n        private Panel panelEnergy;\n        private Panel panelEnergyHeader;\n        private PictureBox pictureBoxEnergy;\n        private Label labelEnergy;\n        private TableLayoutPanel tableDPI;\n        private UI.RButton buttonDPI2;\n        private UI.RButton buttonDPI1;\n        private UI.RButton buttonDPI3;\n        private UI.RButton buttonDPI4;\n        private UI.Slider sliderDPI;\n        private Panel panelDPISettings;\n        private TableLayoutPanel tableLayoutPanel1;\n        private Label labelMinDPI;\n        private Panel panelDPITile;\n        private Label labelDPI;\n        private TableLayoutPanel tableLayoutPollingRate;\n        private UI.RComboBox comboBoxPollingRate;\n        private UI.Slider sliderAngleAdjustment;\n        private CheckBox checkBoxAngleSnapping;\n        private Panel panelPerformanceOther;\n        private TableLayoutPanel tableLayoutProfiles;\n        private UI.RButton buttonDPIColor;\n        private PictureBox pictureDPIColor;\n        private UI.Slider sliderBrightness;\n        private Label labelPollingRate;\n        private Label labelAngleAdjustmentValue;\n        private Panel panelLightingContent;\n        private UI.RComboBox comboBoxLightingMode;\n        private Label labelLightingMode;\n        private PictureBox pictureBoxLightingColor;\n        private UI.RButton buttonLightingColor;\n        private CheckBox checkBoxRandomColor;\n        private UI.RComboBox comboBoxAnimationSpeed;\n        private Label labelAnimationSpeed;\n        private UI.RComboBox comboBoxAnimationDirection;\n        private Label labelAnimationDirection;\n        private UI.RComboBox comboBoxLiftOffDistance;\n        private Label labelLiftOffDistance;\n        private Label labelLowBatteryWarningValue;\n        private UI.RComboBox comboBoxAutoPowerOff;\n        private UI.Slider sliderLowBatteryWarning;\n        private Label labelLowBatteryWarning;\n        private Label labelAutoPowerOff;\n        private Panel panelBatteryState;\n        private Label labelChargingState;\n        private Label labelBatteryState;\n        private PictureBox pictureBoxBatteryState;\n        private UI.RButton buttonSync;\n        private Panel panelBottomButtons;\n        private TableLayoutPanel tableLayoutLightingZones;\n        private UI.RButton buttonLightingZoneScroll;\n        private UI.RButton buttonLightingZoneLogo;\n        private UI.RButton buttonLightingZoneAll;\n        private UI.RButton buttonLightingZoneUnderglow;\n        private UI.RButton buttonLightingZoneDock;\n        private TableLayoutPanel tableLayoutPanel2;\n        private UI.RButton rButton1;\n        private UI.RButton rButton2;\n        private Label labelButtonDebounce;\n        private Label labelButtonDebounceValue;\n        private UI.Slider sliderButtonDebounce;\n        private Panel panelPollingRate;\n        private Panel panelAngleSnapping;\n        private Panel panelMotionSync;\n        private CheckBox checkBoxMotionSync;\n        private Panel panelZoneMode;\n        private CheckBox checkBoxZoneMode;\n        private UI.RComboBox comboBoxZoneModePollingRate;\n        private UI.Slider sliderZoneModeDPI;\n        private NumericUpDown numericUpDownZoneModeDPI;\n        private Panel panelLiftOffDistance;\n        private Panel panelDebounce;\n        private Panel panelDeceleration;\n        private Label labelDeceleration;\n        private UI.Slider sliderDeceleration;\n        private Label labelDecelerationValue;\n        private Panel panelAcceleration;\n        private Label labelAcceleration;\n        private UI.Slider sliderAcceleration;\n        private Label labelAccelerationValue;\n        private UI.RButton buttonImport;\n        private UI.RButton buttonExport;\n        private NumericUpDown numericUpDownCurrentDPI;\n        private Label labelMaxDPI;\n    }\n}"
  },
  {
    "path": "app/AsusMouseSettings.cs",
    "content": "﻿using GHelper.Peripherals.Mouse;\nusing GHelper.UI;\n\nnamespace GHelper\n{\n    public partial class AsusMouseSettings : RForm\n    {\n        private static Dictionary<LightingMode, string> lightingModeNames = new Dictionary<LightingMode, string>()\n        {\n            { LightingMode.Static,Properties.Strings.AuraStatic},\n            { LightingMode.Breathing, Properties.Strings.AuraBreathe},\n            { LightingMode.ColorCycle, Properties.Strings.AuraColorCycle},\n            { LightingMode.Rainbow, Properties.Strings.AuraRainbow},\n            { LightingMode.React, Properties.Strings.AuraReact},\n            { LightingMode.Comet, Properties.Strings.AuraComet},\n            { LightingMode.BatteryState, Properties.Strings.AuraBatteryState},\n            { LightingMode.Off, Properties.Strings.MatrixOff},\n        };\n        private List<LightingMode> supportedLightingModes = new List<LightingMode>();\n\n        private readonly AsusMouse mouse;\n        private readonly RButton[] dpiButtons;\n        private LightingZone visibleZone = LightingZone.All;\n\n        private bool updateMouseDPI = true;\n\n        public AsusMouseSettings(AsusMouse mouse)\n        {\n            this.mouse = mouse;\n            InitializeComponent();\n\n            dpiButtons = new RButton[] { buttonDPI1, buttonDPI2, buttonDPI3, buttonDPI4 };\n\n\n            labelPollingRate.Text = Properties.Strings.PollingRate;\n            labelLighting.Text = Properties.Strings.Lighting;\n            labelLightingMode.Text = Properties.Strings.AuraLightingMode;\n            labelEnergy.Text = Properties.Strings.EnergySettings;\n            labelPerformance.Text = Properties.Strings.MousePerformance;\n            checkBoxRandomColor.Text = Properties.Strings.AuraRandomColor;\n            labelLowBatteryWarning.Text = Properties.Strings.MouseLowBatteryWarning;\n            labelAutoPowerOff.Text = Properties.Strings.MouseAutoPowerOff;\n            buttonSync.Text = Properties.Strings.MouseSynchronize;\n            checkBoxAngleSnapping.Text = Properties.Strings.MouseAngleSnapping;\n            labelLiftOffDistance.Text = Properties.Strings.MouseLiftOffDistance;\n            labelChargingState.Text = \"(\" + Properties.Strings.Charging + \")\";\n            labelProfile.Text = Properties.Strings.Profile;\n            labelButtonDebounce.Text = Properties.Strings.MouseButtonResponse;\n            labelAcceleration.Text = Properties.Strings.Acceleration;\n            labelDeceleration.Text = Properties.Strings.Deceleration;\n            checkBoxMotionSync.Text = Properties.Strings.MouseMotionSync;\n            checkBoxZoneMode.Text = Properties.Strings.MouseZoneMode;\n\n            buttonLightingZoneLogo.Text = Properties.Strings.AuraZoneLogo;\n            buttonLightingZoneScroll.Text = Properties.Strings.AuraZoneScroll;\n            buttonLightingZoneUnderglow.Text = Properties.Strings.AuraZoneUnderglow;\n            buttonLightingZoneAll.Text = Properties.Strings.AuraZoneAll;\n            buttonLightingZoneDock.Text = Properties.Strings.AuraZoneDock;\n\n            buttonExport.Text = Properties.Strings.Export;\n            buttonImport.Text = Properties.Strings.Import;\n\n            InitTheme(true);\n\n            this.Text = mouse.GetDisplayName();\n\n            Shown += AsusMouseSettings_Shown;\n            FormClosing += AsusMouseSettings_FormClosing;\n\n            comboProfile.DropDownClosed += ComboProfile_DropDownClosed;\n\n            sliderDPI.ValueChanged += SliderDPI_ValueChanged;\n            numericUpDownCurrentDPI.ValueChanged += NumericUpDownCurrentDPI_ValueChanged;\n            sliderDPI.MouseUp += SliderDPI_MouseUp;\n            sliderDPI.MouseDown += SliderDPI_MouseDown;\n            buttonDPIColor.Click += ButtonDPIColor_Click;\n            buttonDPI1.Click += ButtonDPI_Click;\n            buttonDPI2.Click += ButtonDPI_Click;\n            buttonDPI3.Click += ButtonDPI_Click;\n            buttonDPI4.Click += ButtonDPI_Click;\n\n            // Subscribe to Paint and MouseMove for Delete logic\n            foreach (var btn in dpiButtons)\n            {\n                btn.Paint += DpiButton_Paint;\n                btn.MouseMove += DpiButton_MouseMove;\n                btn.MouseLeave += (s, e) => { (s as Control)?.Invalidate(); }; \n            }\n\n            comboBoxPollingRate.DropDownClosed += ComboBoxPollingRate_DropDownClosed;\n            checkBoxAngleSnapping.CheckedChanged += CheckAngleSnapping_CheckedChanged;\n            sliderAngleAdjustment.ValueChanged += SliderAngleAdjustment_ValueChanged;\n            sliderAngleAdjustment.MouseUp += SliderAngleAdjustment_MouseUp;\n            comboBoxLiftOffDistance.DropDownClosed += ComboBoxLiftOffDistance_DropDownClosed;\n            sliderButtonDebounce.ValueChanged += SliderButtonDebounce_ValueChanged;\n            sliderButtonDebounce.MouseUp += SliderButtonDebounce_MouseUp;\n\n            checkBoxMotionSync.CheckedChanged += CheckBoxMotionSync_CheckedChanged;\n            checkBoxZoneMode.CheckedChanged += CheckBoxZoneMode_CheckedChanged;\n            sliderZoneModeDPI.ValueChanged += SliderZoneModeDPI_ValueChanged;\n            sliderZoneModeDPI.MouseUp += SliderZoneModeDPI_MouseUp;\n            numericUpDownZoneModeDPI.ValueChanged += NumericUpDownZoneModeDPI_ValueChanged;\n            comboBoxZoneModePollingRate.DropDownClosed += ComboBoxZoneModePollingRate_DropDownClosed;\n\n            sliderAcceleration.MouseUp += SliderAcceleration_MouseUp;\n            sliderAcceleration.ValueChanged += SliderAcceleration_ValueChanged;\n\n            sliderDeceleration.MouseUp += SliderDeceleration_MouseUp;\n            sliderDeceleration.ValueChanged += SliderDeceleration_ValueChanged;\n\n            buttonLightingColor.Click += ButtonLightingColor_Click;\n            comboBoxLightingMode.DropDownClosed += ComboBoxLightingMode_DropDownClosed;\n            sliderBrightness.MouseUp += SliderBrightness_MouseUp;\n            comboBoxAnimationSpeed.DropDownClosed += ComboBoxAnimationSpeed_DropDownClosed;\n            comboBoxAnimationDirection.DropDownClosed += ComboBoxAnimationDirection_DropDownClosed;\n            checkBoxRandomColor.CheckedChanged += CheckBoxRandomColor_CheckedChanged;\n\n            sliderLowBatteryWarning.ValueChanged += SliderLowBatteryWarning_ValueChanged;\n            sliderLowBatteryWarning.MouseUp += SliderLowBatteryWarning_MouseUp;\n            comboBoxAutoPowerOff.DropDownClosed += ComboBoxAutoPowerOff_DropDownClosed;\n\n\n            buttonLightingZoneAll.Click += ButtonLightingZoneAll_Click;\n            buttonLightingZoneDock.Click += ButtonLightingZoneDock_Click;\n            buttonLightingZoneLogo.Click += ButtonLightingZoneLogo_Click;\n            buttonLightingZoneUnderglow.Click += ButtonLightingZoneUnderglow_Click;\n            buttonLightingZoneScroll.Click += ButtonLightingZoneScroll_Click;\n\n            InitMouseCapabilities();\n            Logger.WriteLine(mouse.GetDisplayName() + \" (GUI): Initialized capabilities. Synchronizing mouse data\");\n            RefreshMouseData();\n        }\n\n        private void SliderAcceleration_MouseUp(object? sender, MouseEventArgs e)\n        {\n            mouse.SetAcceleration(sliderAcceleration.Value);\n        }\n\n        private void SliderAcceleration_ValueChanged(object? sender, EventArgs e)\n        {\n            labelAccelerationValue.Text = sliderAcceleration.Value.ToString();\n        }\n\n        private void SliderDeceleration_MouseUp(object? sender, MouseEventArgs e)\n        {\n            mouse.SetDeceleration(sliderDeceleration.Value);\n        }\n\n        private void SliderDeceleration_ValueChanged(object? sender, EventArgs e)\n        {\n            labelDecelerationValue.Text = sliderDeceleration.Value.ToString();\n        }\n\n        private void SliderButtonDebounce_MouseUp(object? sender, MouseEventArgs e)\n        {\n            DebounceTime dbt = (DebounceTime)sliderButtonDebounce.Value;\n            mouse.SetDebounce(dbt);\n        }\n\n        private void SliderButtonDebounce_ValueChanged(object? sender, EventArgs e)\n        {\n            DebounceTime dbt = (DebounceTime)sliderButtonDebounce.Value;\n            int time = mouse.DebounceTimeInMS(dbt);\n\n            labelButtonDebounceValue.Text = time + \"ms\";\n        }\n\n        private void SwitchLightingZone(LightingZone zone)\n        {\n            if (!mouse.HasRGB())\n            {\n                return;\n            }\n            visibleZone = zone;\n            InitLightingModes();\n            VisusalizeLightingSettings();\n        }\n\n        private void ButtonLightingZoneScroll_Click(object? sender, EventArgs e)\n        {\n            SwitchLightingZone(LightingZone.Scrollwheel);\n        }\n\n        private void ButtonLightingZoneUnderglow_Click(object? sender, EventArgs e)\n        {\n            SwitchLightingZone(LightingZone.Underglow);\n        }\n\n        private void ButtonLightingZoneLogo_Click(object? sender, EventArgs e)\n        {\n            SwitchLightingZone(LightingZone.Logo);\n        }\n\n        private void ButtonLightingZoneDock_Click(object? sender, EventArgs e)\n        {\n            SwitchLightingZone(LightingZone.Dock);\n        }\n\n        private void ButtonLightingZoneAll_Click(object? sender, EventArgs e)\n        {\n            SwitchLightingZone(LightingZone.All);\n        }\n\n        private void AsusMouseSettings_FormClosing(object? sender, FormClosingEventArgs e)\n        {\n            mouse.BatteryUpdated -= Mouse_BatteryUpdated;\n            mouse.Disconnect -= Mouse_Disconnect;\n            mouse.MouseReadyChanged -= Mouse_MouseReadyChanged;\n        }\n\n        private void Mouse_MouseReadyChanged(object? sender, EventArgs e)\n        {\n            if (Disposing || IsDisposed)\n            {\n                return;\n            }\n            if (!mouse.IsDeviceReady)\n            {\n                this.Invoke(delegate\n                {\n                    Close();\n                });\n            }\n        }\n\n        private void Mouse_BatteryUpdated(object? sender, EventArgs e)\n        {\n            if (Disposing || IsDisposed)\n            {\n                return;\n            }\n            this.Invoke(delegate\n            {\n                VisualizeBatteryState();\n            });\n\n        }\n\n        private void ComboProfile_DropDownClosed(object? sender, EventArgs e)\n        {\n            if (mouse.Profile == comboProfile.SelectedIndex)\n            {\n                return;\n            }\n\n            mouse.SetProfile(comboProfile.SelectedIndex);\n            RefreshMouseData();\n        }\n\n        private void ComboBoxPollingRate_DropDownClosed(object? sender, EventArgs e)\n        {\n            mouse.SetPollingRate(mouse.SupportedPollingrates()[comboBoxPollingRate.SelectedIndex]);\n            UpdateMotionSyncState();\n        }\n\n        private void ButtonDPIColor_Click(object? sender, EventArgs e)\n        {\n            ColorDialog colorDlg = new ColorDialog\n            {\n                AllowFullOpen = true,\n                Color = pictureDPIColor.BackColor\n            };\n\n            if (colorDlg.ShowDialog() == DialogResult.OK)\n            {\n                AsusMouseDPI dpi = mouse.DpiSettings[mouse.DpiProfile - 1];\n                dpi.Color = colorDlg.Color;\n\n                mouse.SetDPIForProfile(dpi, mouse.DpiProfile);\n\n                VisualizeDPIButtons();\n                VisualizeCurrentDPIProfile();\n            }\n        }\n\n        // Logic for Delete Area\n        bool IsOverDeleteArea(Control btn, Point p)\n        {\n             // Top Right corner\n             float size = 16 * ControlHelper.Scale;\n             if (p.X > btn.Width - size - 5 && p.Y < size + 5) return true;\n             return false;\n        }\n\n        private void DpiButton_MouseMove(object? sender, MouseEventArgs e)\n        {\n            if (sender is RButton btn)\n            {\n                // Trigger repaint to show/hide X\n                btn.Invalidate();\n            }\n        }\n\n        private void DpiButton_Paint(object? sender, PaintEventArgs e)\n        {\n            if (sender is not RButton btn) return;\n            \n            int index = Array.IndexOf(dpiButtons, btn);\n            if (index == -1 || index >= mouse.CurrentDPIProfileCount) return;\n            if (!mouse.CanChangeDPICount()) return;\n            if (mouse.CurrentDPIProfileCount <= 2) return;\n\n            // Check if mouse is within client area to draw hover effect\n            Point clientPoint = btn.PointToClient(Cursor.Position);\n            if (!btn.ClientRectangle.Contains(clientPoint)) return;\n\n            // Draw X in top right (gray-white color)\n            Image img = ControlHelper.ResizeImage(\n                ControlHelper.TintImage(Properties.Resources.cross_23, Color.FromArgb(170, 170, 170)),\n                ControlHelper.Scale);\n            e.Graphics.DrawImage(img, new Point(btn.Width - img.Width - 5, 5));\n        }\n\n        private void ButtonDPI_Click(object? sender, EventArgs e)\n        {\n            int index = -1;\n\n            for (int i = 0; i < dpiButtons.Length; ++i)\n            {\n                if (sender == dpiButtons[i])\n                {\n                    index = i;\n                    break;\n                }\n            }\n\n            if (index == -1) return;\n            \n            // Check for Delete Click\n            if (mouse.CanChangeDPICount() && index < mouse.CurrentDPIProfileCount && mouse.CurrentDPIProfileCount > 2)\n            {\n                Point p = dpiButtons[index].PointToClient(Cursor.Position);\n                if (IsOverDeleteArea(dpiButtons[index], p))\n                {\n                    mouse.DeleteDPIProfile(index);\n                    VisualizeDPIButtons();\n                    VisualizeCurrentDPIProfile();\n                    return;\n                }\n            }\n\n            // Logic:\n            // If index < CurrentCount -> Switch Profile\n            // If index == CurrentCount -> Add Profile\n\n            if (index < mouse.CurrentDPIProfileCount)\n            {\n                mouse.SetDPIProfile(index + 1);\n            }\n            else if (index == mouse.CurrentDPIProfileCount)\n            {\n                mouse.AddDPIProfile();\n                // Ensure UI re-renders to show new profile\n                VisualizeDPIButtons();\n                VisualizeCurrentDPIProfile();\n                return;\n            }\n\n            VisualizeDPIButtons();\n            VisualizeCurrentDPIProfile();\n        }\n\n        private void UpdateLightingSettings(LightingSetting settings, LightingZone zone)\n        {\n            mouse.SetLightingSetting(settings, visibleZone);\n            VisusalizeLightingSettings();\n        }\n\n        private void CheckBoxRandomColor_CheckedChanged(object? sender, EventArgs e)\n        {\n            LightingSetting? ls = mouse.LightingSettingForZone(visibleZone);\n            ls.RandomColor = checkBoxRandomColor.Checked;\n\n            UpdateLightingSettings(ls, visibleZone);\n        }\n\n        private void ComboBoxAnimationDirection_DropDownClosed(object? sender, EventArgs e)\n        {\n            LightingSetting? ls = mouse.LightingSettingForZone(visibleZone);\n            ls.AnimationDirection = (AnimationDirection)comboBoxAnimationDirection.SelectedIndex;\n\n            UpdateLightingSettings(ls, visibleZone);\n        }\n\n        private void ComboBoxAnimationSpeed_DropDownClosed(object? sender, EventArgs e)\n        {\n            LightingSetting? ls = mouse.LightingSettingForZone(visibleZone);\n            // 0 => 0x9\n            // 1 => 0x7\n            // 2 => 0x5\n            ls.AnimationSpeed = (AnimationSpeed)(0x9 - (comboBoxAnimationSpeed.SelectedIndex * 0x2));\n            UpdateLightingSettings(ls, visibleZone);\n        }\n\n        private void SliderBrightness_MouseUp(object? sender, MouseEventArgs e)\n        {\n            LightingSetting? ls = mouse.LightingSettingForZone(visibleZone);\n            ls.Brightness = sliderBrightness.Value;\n\n            UpdateLightingSettings(ls, visibleZone);\n        }\n\n        private void ComboBoxLightingMode_DropDownClosed(object? sender, EventArgs e)\n        {\n            if (!mouse.HasRGB())\n            {\n                return;\n            }\n\n            var index = comboBoxLightingMode.SelectedIndex;\n            LightingMode lm = supportedLightingModes[(index >= 0 && index < supportedLightingModes.Count) ? index : 0];\n\n            LightingSetting? ls = mouse.LightingSettingForZone(visibleZone);\n            if (ls.LightingMode == lm)\n            {\n                //Nothing to do here.\n                return;\n            }\n\n            ls.LightingMode = lm;\n\n            UpdateLightingSettings(ls, visibleZone);\n        }\n\n        private void ButtonLightingColor_Click(object? sender, EventArgs e)\n        {\n            ColorDialog colorDlg = new ColorDialog\n            {\n                AllowFullOpen = true,\n                Color = pictureBoxLightingColor.BackColor\n            };\n\n            if (colorDlg.ShowDialog() == DialogResult.OK)\n            {\n                LightingSetting? ls = mouse.LightingSettingForZone(visibleZone);\n                ls.RGBColor = colorDlg.Color;\n\n                UpdateLightingSettings(ls, visibleZone);\n            }\n        }\n\n        private void SliderLowBatteryWarning_ValueChanged(object? sender, EventArgs e)\n        {\n            labelLowBatteryWarningValue.Text = sliderLowBatteryWarning.Value.ToString() + \"%\";\n        }\n\n        private void SliderLowBatteryWarning_MouseUp(object? sender, MouseEventArgs e)\n        {\n            mouse.SetEnergySettings(sliderLowBatteryWarning.Value, mouse.PowerOffSetting);\n        }\n\n\n        private void ComboBoxAutoPowerOff_DropDownClosed(object? sender, EventArgs e)\n        {\n            object? obj = Enum.GetValues(typeof(PowerOffSetting)).GetValue(comboBoxAutoPowerOff.SelectedIndex);\n            if (obj is null)\n            {\n                return;\n            }\n            PowerOffSetting pos = (PowerOffSetting)obj;\n\n\n            mouse.SetEnergySettings(mouse.LowBatteryWarning, pos);\n        }\n\n        private void SliderAngleAdjustment_ValueChanged(object? sender, EventArgs e)\n        {\n            labelAngleAdjustmentValue.Text = sliderAngleAdjustment.Value.ToString() + \"°\";\n        }\n\n        private void SliderAngleAdjustment_MouseUp(object? sender, MouseEventArgs e)\n        {\n            mouse.SetAngleAdjustment((short)sliderAngleAdjustment.Value);\n        }\n\n        private void ComboBoxLiftOffDistance_DropDownClosed(object? sender, EventArgs e)\n        {\n            mouse.SetLiftOffDistance((LiftOffDistance)comboBoxLiftOffDistance.SelectedIndex);\n        }\n\n        private void CheckAngleSnapping_CheckedChanged(object? sender, EventArgs e)\n        {\n            mouse.SetAngleSnapping(checkBoxAngleSnapping.Checked);\n            mouse.SetAngleAdjustment((short)sliderAngleAdjustment.Value);\n        }\n\n        private void CheckBoxMotionSync_CheckedChanged(object? sender, EventArgs e)\n        {\n            mouse.SetMotionSync(checkBoxMotionSync.Checked);\n        }\n\n        private void CheckBoxZoneMode_CheckedChanged(object? sender, EventArgs e)\n        {\n            mouse.SetZoneMode(checkBoxZoneMode.Checked);\n            UpdateZoneModeUIState();\n        }\n\n        private void SliderZoneModeDPI_ValueChanged(object? sender, EventArgs e)\n        {\n            numericUpDownZoneModeDPI.Value = sliderZoneModeDPI.Value;\n        }\n\n        private void SliderZoneModeDPI_MouseUp(object? sender, MouseEventArgs e)\n        {\n            mouse.ZoneModeDPI = sliderZoneModeDPI.Value;\n            if (mouse.ZoneMode)\n            {\n                mouse.UpdateZoneModeDPI(sliderZoneModeDPI.Value);\n            }\n        }\n\n        private void NumericUpDownZoneModeDPI_ValueChanged(object? sender, EventArgs e)\n        {\n            sliderZoneModeDPI.Value = (int)numericUpDownZoneModeDPI.Value;\n            if (mouse.ZoneMode && mouse.ZoneModeDPI != sliderZoneModeDPI.Value)\n            {\n                mouse.ZoneModeDPI = sliderZoneModeDPI.Value;\n                mouse.UpdateZoneModeDPI(sliderZoneModeDPI.Value);\n            }\n        }\n\n        private void ComboBoxZoneModePollingRate_DropDownClosed(object? sender, EventArgs e)\n        {\n            PollingRate[] zoneModePollingRates = { PollingRate.PR1000Hz, PollingRate.PR2000Hz, PollingRate.PR4000Hz, PollingRate.PR8000Hz };\n            if (comboBoxZoneModePollingRate.SelectedIndex >= 0 && comboBoxZoneModePollingRate.SelectedIndex < zoneModePollingRates.Length)\n            {\n                mouse.ZoneModePollingRate = zoneModePollingRates[comboBoxZoneModePollingRate.SelectedIndex];\n                if (mouse.ZoneMode)\n                {\n                    mouse.UpdateZoneModePollingRate(mouse.ZoneModePollingRate);\n                }\n            }\n        }\n\n        private void SliderDPI_ValueChanged(object? sender, EventArgs e)\n        {\n            numericUpDownCurrentDPI.Value = sliderDPI.Value;\n            UpdateMouseDPISettings();\n        }\n\n        private void NumericUpDownCurrentDPI_ValueChanged(object? sender, EventArgs e)\n        {\n            sliderDPI.Value = (int)numericUpDownCurrentDPI.Value;\n        }\n\n        private void SliderDPI_MouseDown(object? sender, MouseEventArgs e)\n        {\n            updateMouseDPI = false;\n        }\n\n        private void SliderDPI_MouseUp(object? sender, MouseEventArgs e)\n        {\n            updateMouseDPI = true;\n            UpdateMouseDPISettings();\n        }\n\n        private void UpdateMouseDPISettings()\n        {\n            if (!updateMouseDPI)\n            {\n                return;\n            }\n            AsusMouseDPI dpi = mouse.DpiSettings[mouse.DpiProfile - 1];\n            dpi.DPI = (uint)sliderDPI.Value;\n\n            mouse.SetDPIForProfile(dpi, mouse.DpiProfile);\n\n            VisualizeDPIButtons();\n            VisualizeCurrentDPIProfile();\n        }\n\n        private void Mouse_Disconnect(object? sender, EventArgs e)\n        {\n            if (Disposing || IsDisposed)\n            {\n                return;\n            }\n            //Mouse disconnected. Bye bye.\n            this.Invoke(delegate\n            {\n                this.Close();\n            });\n\n        }\n\n        private void RefreshMouseData()\n        {\n            mouse.SynchronizeDevice();\n\n            Logger.WriteLine(mouse.GetDisplayName() + \" (GUI): Mouse data synchronized\");\n            if (!mouse.IsDeviceReady)\n            {\n                Logger.WriteLine(mouse.GetDisplayName() + \" (GUI): Mouse is not ready. Closing view.\");\n                Mouse_Disconnect(this, EventArgs.Empty);\n                return;\n            }\n\n            if (Disposing || IsDisposed)\n            {\n                return;\n            }\n\n            VisualizeMouseSettings();\n            VisualizeBatteryState();\n        }\n\n        private void InitMouseCapabilities()\n        {\n            for (int i = 0; i < mouse.ProfileCount(); ++i)\n            {\n                String prf = Properties.Strings.Profile + \" \" + (i + 1);\n                comboProfile.Items.Add(prf);\n            }\n\n            labelMinDPI.Text = mouse.MinDPI().ToString();\n            labelMaxDPI.Text = mouse.MaxDPI().ToString();\n\n            sliderDPI.Max = mouse.MaxDPI();\n            sliderDPI.Min = mouse.MinDPI();\n            sliderDPI.Step = mouse.DPIIncrements();\n\n            numericUpDownCurrentDPI.Minimum = mouse.MinDPI();\n            numericUpDownCurrentDPI.Maximum = mouse.MaxDPI();\n            numericUpDownCurrentDPI.Increment = mouse.DPIIncrements();\n\n            if (!mouse.HasDebounceSetting())\n            {\n                panelDebounce.Visible = false;\n            }\n\n\n            if (!mouse.HasDPIColors())\n            {\n                buttonDPIColor.Visible = false;\n                pictureDPIColor.Visible = false;\n                buttonDPI1.Image = ControlHelper.ResizeImage(ControlHelper.TintImage(Properties.Resources.lighting_dot_32, Color.Red), ControlHelper.Scale);\n                buttonDPI2.Image = ControlHelper.ResizeImage(ControlHelper.TintImage(Properties.Resources.lighting_dot_32, Color.Purple), ControlHelper.Scale);\n                buttonDPI3.Image = ControlHelper.ResizeImage(ControlHelper.TintImage(Properties.Resources.lighting_dot_32, Color.Blue), ControlHelper.Scale);\n                buttonDPI4.Image = ControlHelper.ResizeImage(ControlHelper.TintImage(Properties.Resources.lighting_dot_32, Color.Green), ControlHelper.Scale);\n\n                buttonDPI1.BorderColor = Color.Red;\n                buttonDPI2.BorderColor = Color.Purple;\n                buttonDPI3.BorderColor = Color.Blue;\n                buttonDPI4.BorderColor = Color.Green;\n            }\n\n            if (mouse.CanSetPollingRate())\n            {\n                foreach (PollingRate pr in mouse.SupportedPollingrates())\n                {\n                    comboBoxPollingRate.Items.Add(mouse.PollingRateDisplayString(pr));\n                }\n\n            }\n            else\n            {\n                panelPollingRate.Visible = false;\n            }\n\n            if (!mouse.HasAngleSnapping())\n            {\n                checkBoxAngleSnapping.Visible = false;\n            }\n\n            if (!mouse.HasAngleTuning())\n            {\n                labelAngleAdjustmentValue.Visible = false;\n                sliderAngleAdjustment.Visible = false;\n                sliderAngleAdjustment.Max = mouse.AngleTuningMax();\n                sliderAngleAdjustment.Min = mouse.AngleTuningMin();\n                sliderAngleAdjustment.Step = mouse.AngleTuningStep();\n            }\n\n            if (!mouse.HasAngleTuning() && !mouse.HasAngleSnapping())\n            {\n                panelAngleSnapping.Visible = false;\n            }\n\n            if (!mouse.HasMotionSync())\n            {\n                panelMotionSync.Visible = false;\n            }\n\n            if (!mouse.HasZoneMode())\n            {\n                panelZoneMode.Visible = false;\n            }\n            else\n            {\n                // Initialize Zone Mode Polling Rate combobox with limited options\n                comboBoxZoneModePollingRate.Items.Clear();\n                comboBoxZoneModePollingRate.Items.Add(\"1000 Hz\");\n                comboBoxZoneModePollingRate.Items.Add(\"2000 Hz\");\n                comboBoxZoneModePollingRate.Items.Add(\"4000 Hz\");\n                comboBoxZoneModePollingRate.Items.Add(\"8000 Hz\");\n                comboBoxZoneModePollingRate.SelectedIndex = 2; // Default to 4000Hz\n            }\n\n            if (mouse.HasAcceleration())\n            {\n                sliderAcceleration.Max = mouse.MaxAcceleration();\n            }\n            else\n            {\n                panelAcceleration.Visible = false;\n            }\n\n            if (mouse.HasDeceleration())\n            {\n                sliderDeceleration.Max = mouse.MaxDeceleration();\n            }\n            else\n            {\n                panelDeceleration.Visible = false;\n            }\n\n            if (mouse.HasLiftOffSetting())\n            {\n                comboBoxLiftOffDistance.Items.AddRange(new string[] {\n                    Properties.Strings.Low,\n                    Properties.Strings.High,\n                });\n            }\n            else\n            {\n                panelLiftOffDistance.Visible = false;\n            }\n\n            if (mouse.DPIProfileCount() < 4)\n            {\n                for (int i = 3; i > mouse.DPIProfileCount() - 1; --i)\n                {\n                    dpiButtons[i].Visible = false;\n                }\n            }\n\n            if (!mouse.HasBattery())\n            {\n                panelBatteryState.Visible = false;\n            }\n\n            if (mouse.HasAutoPowerOff())\n            {\n                comboBoxAutoPowerOff.Items.AddRange(new string[]{\n                    \" 1 \"+ Properties.Strings.Minute,\n                    \" 2 \"+ Properties.Strings.Minutes,\n                    \" 3 \"+ Properties.Strings.Minutes,\n                    \" 5 \"+ Properties.Strings.Minutes,\n                    \"10 \"+ Properties.Strings.Minutes,\n                     Properties.Strings.Never,\n                });\n            }\n\n            if (!mouse.HasLowBatteryWarning())\n            {\n                labelLowBatteryWarning.Visible = false;\n                labelLowBatteryWarningValue.Visible = false;\n                sliderLowBatteryWarning.Visible = false;\n            }\n            else\n            {\n                sliderLowBatteryWarning.Min = 0;\n                sliderLowBatteryWarning.Step = mouse.LowBatteryWarningStep();\n                sliderLowBatteryWarning.Max = mouse.LowBatteryWarningMax();\n            }\n\n            if (!mouse.HasAutoPowerOff() && !mouse.HasLowBatteryWarning())\n            {\n                panelEnergy.Visible = false;\n            }\n\n            if (mouse.HasRGB())\n            {\n                if (mouse.SupportedLightingZones().Length > 1)\n                {\n                    buttonLightingZoneLogo.Visible = mouse.SupportedLightingZones().Contains(LightingZone.Logo);\n                    buttonLightingZoneScroll.Visible = mouse.SupportedLightingZones().Contains(LightingZone.Scrollwheel);\n                    buttonLightingZoneUnderglow.Visible = mouse.SupportedLightingZones().Contains(LightingZone.Underglow);\n                    buttonLightingZoneDock.Visible = mouse.SupportedLightingZones().Contains(LightingZone.Dock);\n                }\n                else\n                {\n                    buttonLightingZoneLogo.Visible = false;\n                    buttonLightingZoneScroll.Visible = false;\n                    buttonLightingZoneUnderglow.Visible = false;\n                    buttonLightingZoneDock.Visible = false;\n                }\n\n                sliderBrightness.Max = mouse.MaxBrightness();\n\n                InitLightingModes();\n\n                comboBoxAnimationDirection.Items.AddRange(new string[] {\n                    Properties.Strings.AuraClockwise,\n                    Properties.Strings.AuraCounterClockwise,\n                });\n\n                comboBoxAnimationSpeed.Items.AddRange(new string[] {\n                    Properties.Strings.AuraSlow,\n                    Properties.Strings.AuraNormal,\n                    Properties.Strings.AuraFast\n                });\n            }\n            else\n            {\n                panelLighting.Visible = false;\n            }\n        }\n\n        private void InitLightingModes()\n        {\n            comboBoxLightingMode.Items.Clear();\n            supportedLightingModes.Clear();\n            foreach (LightingMode lm in Enum.GetValues(typeof(LightingMode)))\n            {\n                if (mouse.IsLightingModeSupported(lm) && mouse.IsLightingModeSupportedForZone(lm, visibleZone))\n                {\n                    comboBoxLightingMode.Items.Add(lightingModeNames.GetValueOrDefault(lm));\n                    supportedLightingModes.Add(lm);\n                }\n            }\n        }\n\n\n        private void VisualizeMouseSettings()\n        {\n            if (mouse.Profile < comboProfile.Items.Count)\n                comboProfile.SelectedIndex = mouse.Profile;\n\n            if (mouse.HasRGB())\n            {\n                //If current lighting mode is zoned, pre-select the first zone and not \"All\".\n                bool zoned = mouse.IsLightingZoned();\n                if (zoned)\n                {\n                    visibleZone = mouse.SupportedLightingZones()[0];\n                    InitLightingModes();\n                }\n            }\n\n\n            VisualizeDPIButtons();\n            VisualizeCurrentDPIProfile();\n            VisusalizeLightingSettings();\n\n            if (mouse.CanSetPollingRate())\n            {\n                int idx = mouse.PollingRateIndex(mouse.PollingRate);\n                if (idx == -1)\n                {\n                    return;\n                }\n                comboBoxPollingRate.SelectedIndex = idx;\n            }\n\n            if (mouse.HasAngleSnapping())\n            {\n                checkBoxAngleSnapping.Checked = mouse.AngleSnapping;\n            }\n\n            if (mouse.HasAngleTuning())\n            {\n                sliderAngleAdjustment.Value = mouse.AngleAdjustmentDegrees;\n            }\n\n            if (mouse.HasAutoPowerOff())\n            {\n                if (mouse.PowerOffSetting == PowerOffSetting.Never)\n                {\n                    comboBoxAutoPowerOff.SelectedIndex = comboBoxAutoPowerOff.Items.Count - 1;\n                }\n                else\n                {\n                    comboBoxAutoPowerOff.SelectedIndex = (int)mouse.PowerOffSetting;\n                }\n            }\n\n            if (mouse.HasLowBatteryWarning())\n            {\n                sliderLowBatteryWarning.Value = mouse.LowBatteryWarning;\n            }\n\n            if (mouse.HasLiftOffSetting())\n            {\n                comboBoxLiftOffDistance.SelectedIndex = (int)mouse.LiftOffDistance;\n            }\n\n            if (mouse.HasDebounceSetting())\n            {\n                sliderButtonDebounce.Min = (int)mouse.MinDebounce();\n                sliderButtonDebounce.Max = (int)mouse.MaxDebounce();\n                sliderButtonDebounce.Value = (int)mouse.Debounce;\n            }\n\n            if (mouse.HasAcceleration())\n            {\n                sliderAcceleration.Value = mouse.Acceleration;\n            }\n\n            if (mouse.HasDeceleration())\n            {\n                sliderDeceleration.Value = mouse.Deceleration;\n            }\n\n            if (mouse.HasMotionSync())\n            {\n                UpdateMotionSyncState();\n            }\n\n            if (mouse.HasZoneMode())\n            {\n                checkBoxZoneMode.Checked = mouse.ZoneMode;\n                sliderZoneModeDPI.Value = mouse.ZoneModeDPI;\n                numericUpDownZoneModeDPI.Value = mouse.ZoneModeDPI;\n\n                // Set Zone Mode Polling Rate combobox\n                PollingRate[] zoneModePollingRates = { PollingRate.PR1000Hz, PollingRate.PR2000Hz, PollingRate.PR4000Hz, PollingRate.PR8000Hz };\n                int prIndex = Array.IndexOf(zoneModePollingRates, mouse.ZoneModePollingRate);\n                if (prIndex >= 0) comboBoxZoneModePollingRate.SelectedIndex = prIndex;\n\n                UpdateZoneModeUIState();\n            }\n        }\n\n        private void UpdateMotionSyncState()\n        {\n            if (!mouse.HasMotionSync())\n            {\n                return;\n            }\n\n            bool is8000Hz = mouse.PollingRate == PollingRate.PR8000Hz;\n            checkBoxMotionSync.Enabled = !is8000Hz;\n            checkBoxMotionSync.Checked = is8000Hz ? false : mouse.MotionSync;\n        }\n\n        private void UpdateZoneModeUIState()\n        {\n            if (!mouse.HasZoneMode())\n            {\n                return;\n            }\n\n            bool zoneModeEnabled = mouse.ZoneMode;\n\n            // Zone Mode controls: enabled when Zone Mode is ON\n            sliderZoneModeDPI.Enabled = zoneModeEnabled;\n            comboBoxZoneModePollingRate.Enabled = zoneModeEnabled;\n            numericUpDownZoneModeDPI.Enabled = zoneModeEnabled;\n\n            // Normal controls: disabled when Zone Mode is ON\n            panelDPISettings.Enabled = !zoneModeEnabled;\n            tableDPI.Enabled = !zoneModeEnabled;\n            comboBoxPollingRate.Enabled = !zoneModeEnabled;\n        }\n\n        private void VisualizeBatteryState()\n        {\n            if (!mouse.HasBattery())\n            {\n                return;\n            }\n\n            labelBatteryState.Text = mouse.Battery + \"%\";\n            labelChargingState.Visible = mouse.Charging;\n\n            if (mouse.Charging)\n            {\n                pictureBoxBatteryState.BackgroundImage = ControlHelper.TintImage(Properties.Resources.icons8_ladende_batterie_48, foreMain);\n            }\n            else\n            {\n                pictureBoxBatteryState.BackgroundImage = ControlHelper.TintImage(Properties.Resources.icons8_batterie_voll_geladen_48, foreMain);\n            }\n        }\n\n        public void VisusalizeLightingZones()\n        {\n            bool zoned = mouse.IsLightingZoned();\n\n            buttonLightingZoneAll.Activated = visibleZone == LightingZone.All;\n            buttonLightingZoneLogo.Activated = visibleZone == LightingZone.Logo;\n            buttonLightingZoneScroll.Activated = visibleZone == LightingZone.Scrollwheel;\n            buttonLightingZoneUnderglow.Activated = visibleZone == LightingZone.Underglow;\n            buttonLightingZoneDock.Activated = visibleZone == LightingZone.Dock;\n\n            buttonLightingZoneAll.Secondary = zoned;\n            buttonLightingZoneLogo.Secondary = !zoned;\n            buttonLightingZoneScroll.Secondary = !zoned;\n            buttonLightingZoneUnderglow.Secondary = !zoned;\n            buttonLightingZoneDock.Secondary = !zoned;\n\n            buttonLightingZoneAll.BackColor = buttonLightingZoneAll.Secondary ? RForm.buttonSecond : RForm.buttonMain;\n            buttonLightingZoneLogo.BackColor = buttonLightingZoneLogo.Secondary ? RForm.buttonSecond : RForm.buttonMain;\n            buttonLightingZoneScroll.BackColor = buttonLightingZoneScroll.Secondary ? RForm.buttonSecond : RForm.buttonMain;\n            buttonLightingZoneUnderglow.BackColor = buttonLightingZoneUnderglow.Secondary ? RForm.buttonSecond : RForm.buttonMain;\n            buttonLightingZoneDock.BackColor = buttonLightingZoneDock.Secondary ? RForm.buttonSecond : RForm.buttonMain;\n        }\n\n        private void VisusalizeLightingSettings()\n        {\n            if (!mouse.HasRGB())\n            {\n                return;\n            }\n\n            VisusalizeLightingZones();\n\n            LightingSetting? ls = mouse.LightingSettingForZone(visibleZone);\n\n            if (ls is null)\n            {\n                //Lighting settings not loaded?\n                return;\n            }\n\n            sliderBrightness.Value = ls.Brightness;\n\n            checkBoxRandomColor.Visible = mouse.SupportsRandomColor(ls.LightingMode);\n\n            pictureBoxLightingColor.Visible = mouse.SupportsColorSetting(ls.LightingMode);\n            buttonLightingColor.Visible = mouse.SupportsColorSetting(ls.LightingMode);\n\n            comboBoxAnimationSpeed.Visible = mouse.SupportsAnimationSpeed(ls.LightingMode);\n            labelAnimationSpeed.Visible = mouse.SupportsAnimationSpeed(ls.LightingMode);\n            comboBoxAnimationDirection.Visible = mouse.SupportsAnimationDirection(ls.LightingMode);\n            labelAnimationDirection.Visible = mouse.SupportsAnimationDirection(ls.LightingMode);\n\n            comboBoxLightingMode.SelectedIndex = supportedLightingModes.IndexOf(ls.LightingMode);\n\n            if (mouse.SupportsRandomColor(ls.LightingMode))\n            {\n                checkBoxRandomColor.Checked = ls.RandomColor;\n                buttonLightingColor.Visible = !ls.RandomColor;\n            }\n\n            if (ls.RandomColor && mouse.SupportsRandomColor(ls.LightingMode))\n                pictureBoxLightingColor.BackColor = Color.Transparent;\n            else\n                pictureBoxLightingColor.BackColor = ls.RGBColor;\n\n            //0x09 => 0\n            //0x07 => 1\n            //0x05 => 2\n            comboBoxAnimationSpeed.SelectedIndex = 2 - ((((int)ls.AnimationSpeed) - 5) / 2);\n            \n            int directionIndex = (int)ls.AnimationDirection;\n            if (directionIndex >= 0 && directionIndex < comboBoxAnimationDirection.Items.Count)\n            {\n                comboBoxAnimationDirection.SelectedIndex = directionIndex;\n            }\n            else\n            {\n                comboBoxAnimationDirection.SelectedIndex = 0; // Default to first item\n            }\n        }\n\n\n        private void VisualizeDPIButtons()\n        {\n            // Update to use CurrentDPIProfileCount\n            for (int i = 0; i < 4; ++i)\n            {\n                // Slot logic: 0..Count-1 are normal profiles\n                // Slot Count is \"Add\" button (if Count < 4)\n\n                if (i < mouse.CurrentDPIProfileCount)\n                {\n                    AsusMouseDPI dpi = mouse.DpiSettings[i];\n                    if (dpi is null) continue;\n\n                    dpiButtons[i].Visible = true;\n                    if (mouse.HasDPIColors())\n                    {\n                        dpiButtons[i].Image = ControlHelper.ResizeImage(\n                        ControlHelper.TintImage(Properties.Resources.lighting_dot_32, dpi.Color),\n                        ControlHelper.Scale);\n                        dpiButtons[i].BorderColor = dpi.Color;\n                    }\n                    else\n                    {\n                        // Fallback icon if no color support? Usually kept simple\n                    }\n\n                    dpiButtons[i].Activated = (mouse.DpiProfile - 1) == i;\n                    dpiButtons[i].Text = \"DPI \" + (i + 1) + \"\\n\" + dpi.DPI;\n\n                    // Clear secondary style (used for Add button)\n                    dpiButtons[i].Secondary = false;\n                }\n                else if (mouse.CanChangeDPICount() && i == mouse.CurrentDPIProfileCount)\n                {\n                    // This is the \"Add\" slot\n                    dpiButtons[i].Visible = true;\n                    dpiButtons[i].Image = null;\n                    dpiButtons[i].Text = \"+\";\n                    dpiButtons[i].Activated = false;\n                    dpiButtons[i].Secondary = true;\n                    dpiButtons[i].BorderColor = Color.Transparent;\n                }\n                else\n                {\n                    // Hidden slots\n                    dpiButtons[i].Visible = false;\n                }\n            }\n        }\n\n\n        private void VisualizeCurrentDPIProfile()\n        {\n            if (mouse.DpiProfile > mouse.DpiSettings.Length)\n            {\n                Logger.WriteLine($\"Wrong mouse DPI: {mouse.DpiProfile}\");\n                return;\n            }\n\n            AsusMouseDPI dpi;\n\n            try\n            {\n                dpi = mouse.DpiSettings[mouse.DpiProfile - 1];\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine($\"Wrong mouse DPI: {mouse.DpiProfile} {mouse.DpiSettings.Length} {ex.Message}\");\n                return;\n            }\n\n            if (dpi is null)\n            {\n                return;\n            }\n            sliderDPI.Value = (int)dpi.DPI;\n            pictureDPIColor.BackColor = dpi.Color;\n        }\n\n        private void AsusMouseSettings_Shown(object? sender, EventArgs e)\n        {\n\n            if (Height > Program.settingsForm.Height)\n            {\n                Top = Program.settingsForm.Top + Program.settingsForm.Height - Height;\n            }\n            else\n            {\n                Top = Program.settingsForm.Top;\n            }\n\n            Left = Program.settingsForm.Left - Width - 5;\n\n\n            mouse.Disconnect += Mouse_Disconnect;\n            mouse.BatteryUpdated += Mouse_BatteryUpdated;\n            mouse.MouseReadyChanged += Mouse_MouseReadyChanged;\n        }\n\n        private void ButtonSync_Click(object sender, EventArgs e)\n        {\n            RefreshMouseData();\n        }\n\n        private void buttonImport_Click(object sender, EventArgs e)\n        {\n            byte[] data = null;\n\n            Thread t = new Thread(() =>\n            {\n                OpenFileDialog ofd = new OpenFileDialog();\n                ofd.Filter = \"G-Helper Mouse Profile V1 (*.gmp1)|*.gmp1\";\n\n                if (ofd.ShowDialog() == DialogResult.OK)\n                {\n                    data = File.ReadAllBytes(ofd.FileName);\n                }\n            });\n\n            t.SetApartmentState(ApartmentState.STA);\n            t.Start();\n            t.Join();\n\n            if (data == null)\n            {\n                //User aborted loading\n                return;\n            }\n\n            if (!mouse.Import(data))\n            {\n                Logger.WriteLine(\"Failed to import mouse profile\");\n                MessageBox.Show(Properties.Strings.MouseImportFailed);\n            }\n            else\n            {\n                if (!mouse.IsLightingZoned())\n                {\n                    visibleZone = LightingZone.All;\n                }\n\n                RefreshMouseData();\n            }\n        }\n\n        private void buttonExport_Click(object sender, EventArgs e)\n        {\n            Thread t = new Thread(() =>\n            {\n                SaveFileDialog sfd = new SaveFileDialog();\n                sfd.Filter = \"G-Helper Mouse Profile V1 (*.gmp1)|*.gmp1\";\n\n                if (sfd.ShowDialog() == DialogResult.OK)\n                {\n                    File.WriteAllBytes(sfd.FileName, mouse.Export());\n                }\n            });\n\n            t.SetApartmentState(ApartmentState.STA);\n            t.Start();\n            t.Join();\n        }\n    }\n}\n"
  },
  {
    "path": "app/AsusMouseSettings.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!--\n    Microsoft ResX Schema\n\n    Version 2.0\n\n    The primary goals of this format is to allow a simple XML format\n    that is mostly human readable. The generation and parsing of the\n    various data types are done through the TypeConverter classes\n    associated with the data types.\n\n    Example:\n\n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n\n    There are any number of \"resheader\" rows that contain simple\n    name/value pairs.\n\n    Each data row contains a name, and value. The row also contains a\n    type or mimetype. Type corresponds to a .NET class that support\n    text/value conversion through the TypeConverter architecture.\n    Classes that don't support this are serialized and stored with the\n    mimetype set.\n\n    The mimetype is used for serialized objects, and tells the\n    ResXResourceReader how to depersist the object. This is currently not\n    extensible. For a given mimetype the value must be set accordingly:\n\n    Note - application/x-microsoft.net.object.binary.base64 is the format\n    that the ResXResourceWriter will generate, however the reader can\n    read any of the formats listed below.\n\n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array\n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "app/AutoUpdate/AutoUpdateControl.cs",
    "content": "﻿using GHelper.Helpers;\nusing System.Diagnostics;\nusing System.Net;\nusing System.Reflection;\nusing System.Text.Json;\nusing System.Text.RegularExpressions;\n\nnamespace GHelper.AutoUpdate\n{\n    public class AutoUpdateControl\n    {\n\n        SettingsForm settings;\n\n        public string versionUrl = \"https://github.com/seerge/g-helper/releases\";\n        public bool update = false;\n\n        static long lastUpdate;\n\n        public AutoUpdateControl(SettingsForm settingsForm)\n        {\n            settings = settingsForm;\n            var appVersion = new Version(Assembly.GetExecutingAssembly().GetName().Version.ToString());\n            settings.SetVersionLabel(Properties.Strings.VersionLabel + $\": {appVersion.Major}.{appVersion.Minor}.{appVersion.Build}\");\n        }\n\n        public void CheckForUpdates()\n        {\n            // Run update once per 12 hours\n            if (Math.Abs(DateTimeOffset.Now.ToUnixTimeSeconds() - lastUpdate) < 43200) return;\n            lastUpdate = DateTimeOffset.Now.ToUnixTimeSeconds();\n\n            Task.Run(async () =>\n            {\n                await Task.Delay(TimeSpan.FromSeconds(1));\n                CheckForUpdatesAsync();\n            });\n        }\n\n        public void Update()\n        {\n            if (update)\n            {\n                Task.Run(() =>\n                {\n                    CheckForUpdatesAsync(true);\n                });\n            } else\n            {\n                LoadReleases();\n            }\n        }\n\n        public void LoadReleases()\n        {\n            try\n            {\n                Process.Start(new ProcessStartInfo(versionUrl) { UseShellExecute = true });\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine(\"Failed to open releases page:\" + ex.Message);\n            }\n        }\n\n        async void CheckForUpdatesAsync(bool force = false)\n        {\n\n            if (AppConfig.Is(\"skip_updates\")) return;\n\n            try\n            {\n\n                using (var httpClient = new HttpClient())\n                {\n                    httpClient.DefaultRequestHeaders.Add(\"User-Agent\", \"C# App\");\n                    var json = await httpClient.GetStringAsync(\"https://api.github.com/repos/seerge/g-helper/releases/latest\");\n                    var config = JsonSerializer.Deserialize<JsonElement>(json);\n                    var tag = config.GetProperty(\"tag_name\").ToString().Replace(\"v\", \"\");\n                    var assets = config.GetProperty(\"assets\");\n\n                    string url = null;\n\n                    for (int i = 0; i < assets.GetArrayLength(); i++)\n                    {\n                        if (assets[i].GetProperty(\"browser_download_url\").ToString().Contains(\".zip\"))\n                            url = assets[i].GetProperty(\"browser_download_url\").ToString();\n                    }\n\n                    if (url is null)\n                        url = assets[0].GetProperty(\"browser_download_url\").ToString();\n\n                    var gitVersion = new Version(tag);\n                    var appVersion = new Version(Assembly.GetExecutingAssembly().GetName().Version.ToString());\n                    //appVersion = new Version(\"0.50.0.0\"); \n\n                    if (gitVersion.CompareTo(appVersion) > 0)\n                    {\n                        versionUrl = url;\n                        update = true;\n                        settings.SetVersionLabel(Properties.Strings.DownloadUpdate + $\": {appVersion.Major}.{appVersion.Minor}.{appVersion.Build} → {tag}\", true);\n\n                        string[] args = Environment.GetCommandLineArgs();\n                        if (force || args.Length > 1 && args[1] == \"autoupdate\")\n                        {\n                            AutoUpdate(url);\n                            return;\n                        }\n\n                        if (AppConfig.GetString(\"skip_version\") != tag)\n                        {\n                            DialogResult dialogResult = DialogResult.No;\n\n                            settings.Invoke((System.Windows.Forms.MethodInvoker)delegate\n                            {\n                                dialogResult = MessageBox.Show(settings, Properties.Strings.DownloadUpdate + \": G-Helper \" + tag + \"?\", \"Update\", MessageBoxButtons.YesNo);\n                            });\n                            \n                            if (dialogResult == DialogResult.Yes)\n                                AutoUpdate(url);\n                            else\n                                AppConfig.Set(\"skip_version\", tag);\n                        }\n\n                    }\n                    else\n                    {\n                        Logger.WriteLine($\"Latest version {appVersion}\");\n                    }\n\n                }\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine(\"Failed to check for updates:\" + ex.Message);\n            }\n\n        }\n\n        public static string EscapeString(string input)\n        {\n            return Regex.Replace(Regex.Replace(input, @\"\\[|\\]\", \"`$0\"), @\"\\'\", \"''\");\n        }\n\n        async void AutoUpdate(string requestUri)\n        {\n\n            Uri uri = new Uri(requestUri);\n            string zipName = Path.GetFileName(uri.LocalPath);\n\n            string exeLocation = Application.ExecutablePath;\n            string exeDir = Path.GetDirectoryName(exeLocation);\n            //exeDir = \"C:\\\\Program Files\\\\GHelper\";\n            string exeName = Path.GetFileName(exeLocation);\n            string zipLocation = exeDir + \"\\\\\" + zipName;\n\n            using (WebClient client = new WebClient())\n            {\n                Logger.WriteLine(requestUri);\n                Logger.WriteLine(exeDir);\n                Logger.WriteLine(zipName);\n                Logger.WriteLine(exeName);\n\n                try\n                {\n                    client.DownloadFile(uri, zipLocation);\n                }\n                catch (Exception ex)\n                {\n                    Logger.WriteLine(ex.Message);\n                    if (!ProcessHelper.IsUserAdministrator())\n                    {\n                        ProcessHelper.RunAsAdmin(\"autoupdate\");\n                        Application.Exit();\n                    } else\n                    {\n                        LoadReleases();\n                    }\n                    return;\n                }\n\n                string command = $\"$ErrorActionPreference = \\\"Stop\\\"; Set-Location -Path '{EscapeString(exeDir)}'; Wait-Process -Name \\\"GHelper\\\"; Expand-Archive \\\"{zipName}\\\" -DestinationPath . -Force; Remove-Item \\\"{zipName}\\\" -Force; \\\".\\\\{exeName}\\\"; \";\n                Logger.WriteLine(command);\n\n                try\n                {\n                    var cmd = new Process();\n                    cmd.StartInfo.WorkingDirectory = exeDir;\n                    cmd.StartInfo.UseShellExecute = false;\n                    cmd.StartInfo.CreateNoWindow = true;\n                    cmd.StartInfo.FileName = \"powershell\";\n                    cmd.StartInfo.Arguments = command;\n                    if (ProcessHelper.IsUserAdministrator()) cmd.StartInfo.Verb = \"runas\";\n                    cmd.Start();\n                }\n                catch (Exception ex)\n                {\n                    Logger.WriteLine(ex.Message);\n                }\n\n                Application.Exit();\n            }\n\n        }\n\n    }\n}\n"
  },
  {
    "path": "app/Battery/BatteryControl.cs",
    "content": "﻿using System.Diagnostics;\n\nnamespace GHelper.Battery\n{\n    public static class BatteryControl\n    {\n\n        static bool _chargeFull = AppConfig.Is(\"charge_full\");\n        public static bool chargeFull\n        {\n            get\n            {\n                return _chargeFull;\n            }\n            set\n            {\n                AppConfig.Set(\"charge_full\", value ? 1 : 0);\n                _chargeFull = value;\n            }\n        }\n\n        public static void ToggleBatteryLimitFull()\n        {\n            if (chargeFull) SetBatteryChargeLimit();\n            else SetBatteryLimitFull();\n        }\n\n        public static void SetBatteryLimitFull()\n        {\n            chargeFull = true;\n            Program.acpi.DeviceSet(AsusACPI.BatteryLimit, 100, \"BatteryLimit\");\n            Program.settingsForm.VisualiseBatteryFull();\n        }\n\n        public static void UnSetBatteryLimitFull()\n        {\n            chargeFull = false;\n            Logger.WriteLine(\"Battery fully charged\");\n            Program.settingsForm.Invoke(Program.settingsForm.VisualiseBatteryFull);\n        }\n\n        public static void AutoBattery(bool init = false)\n        {\n            if (chargeFull && !init) SetBatteryLimitFull();\n            else SetBatteryChargeLimit();\n        }\n\n        public static void SetBatteryChargeLimit(int limit = -1)\n        {\n\n            if (limit < 0) limit = AppConfig.Get(\"charge_limit\");\n            if (limit < 40 || limit > 100) return;\n\n            if (AppConfig.IsChargeLimit6080())\n            {\n                if (limit > 85) limit = 100;\n                else if (limit >= 80) limit = 80;\n                else if (limit < 60) limit = 60;\n            }\n\n            Program.acpi.DeviceSet(AsusACPI.BatteryLimit, limit, \"BatteryLimit\");\n\n            AppConfig.Set(\"charge_limit\", limit);\n            chargeFull = false;\n\n            Program.settingsForm.VisualiseBattery(limit);\n        }\n\n        public static void BatteryReport()\n        {\n            var reportDir = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);\n\n            try\n            {\n                var cmd = new Process();\n                cmd.StartInfo.WorkingDirectory = reportDir;\n                cmd.StartInfo.UseShellExecute = false;\n                cmd.StartInfo.CreateNoWindow = true;\n                cmd.StartInfo.FileName = \"powershell\";\n                cmd.StartInfo.Arguments = \"powercfg /batteryreport; explorer battery-report.html\";\n                cmd.Start();\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine(ex.Message);\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "app/Display/AmdDisplay.cs",
    "content": "﻿using Microsoft.Win32;\nusing Ryzen;\nusing System.Diagnostics;\n\npublic static class AmdDisplay\n{\n    private const string DisplayPath0 =\n        @\"SYSTEM\\CurrentControlSet\\Control\\Class\\{4d36e968-e325-11ce-bfc1-08002be10318}\\0001\\DAL2_DATA__2_0\\DisplayPath_0\";\n\n    private static string _cachedAdjustmentPath = null;\n    private static bool _isPathSearched = false;\n\n    private static string GetAdjustmentPath()\n    {\n        if (_isPathSearched) return _cachedAdjustmentPath;\n\n        try\n        {\n            using RegistryKey dp0 = Registry.LocalMachine.OpenSubKey(DisplayPath0, writable: false);\n            if (dp0 != null)\n            {\n                string edidKey = Array.Find(dp0.GetSubKeyNames(),\n                    name => name.StartsWith(\"EDID_\", StringComparison.OrdinalIgnoreCase));\n\n                if (edidKey != null)\n                {\n                    _cachedAdjustmentPath = $@\"HKEY_LOCAL_MACHINE\\{DisplayPath0}\\{edidKey}\\Adjustment\";\n                }\n            }\n        }\n        catch\n        {\n            // Handle permissions or missing keys silently\n        }\n        finally\n        {\n            _isPathSearched = true;\n        }\n\n        return _cachedAdjustmentPath;\n    }\n\n    public static bool IsOledPowerOptimization()\n    {\n        if (!AppConfig.IsOLED() || !RyzenControl.IsAMD()) return false;\n\n        try\n        {\n            string path = GetAdjustmentPath();\n            if (path == null) return false;\n\n            object value = Registry.GetValue(path, \"DAL_SCE_Settings\", null);\n\n            if (value is byte[] data && data.Length >= 5)\n            {\n                return (data[4] & 0x02) != 0;\n            }\n        } catch\n        {\n            Logger.WriteLine(\"Can't check AMD OLED Optimization flag\");\n        }\n\n        return false;\n    }\n\n    public static void RunAdrenaline()\n    {\n        string desktopPath = @\"C:\\Program Files\\AMD\\CNext\\CNext\\RadeonSoftware.exe\";\n        string uwpPackageFolder = Path.Combine(\n            Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),\n            @\"Packages\\AdvancedMicroDevicesInc-2.AMDRadeonSoftware_0a9344xs7nr4m\"\n        );\n\n        if (File.Exists(desktopPath))\n        {\n            Process.Start(new ProcessStartInfo(desktopPath)\n            {\n                UseShellExecute = true,\n                Verb = \"runas\" \n            });\n            return; \n        }\n\n        if (Directory.Exists(uwpPackageFolder))\n        {\n            string aumid = @\"shell:AppsFolder\\AdvancedMicroDevicesInc-2.AMDRadeonSoftware_0a9344xs7nr4m!App\";\n            Process.Start(new ProcessStartInfo(\"explorer.exe\", aumid)\n            {\n                UseShellExecute = true\n            });\n            return;\n        }\n\n        Logger.WriteLine(\"AMD Radeon Software is not installed.\");\n    }\n\n}\n"
  },
  {
    "path": "app/Display/ColorProfileHelper.cs",
    "content": "﻿using GHelper.Helpers;\nusing System.IO.Compression;\n\nnamespace GHelper.Display\n{\n    public static class ColorProfileHelper\n    {\n        public static string? GetProfileUrl(string model)\n        {\n            byte[] data = Convert.FromBase64String(\"aHR0cHM6Ly9kbGNkbi1yb2dib3hidTEuYXN1cy5jb20vcHViL0FTVVMvQVBTZXJ2aWNlL0dhbWluZy9TWVMvUk9HUy8=\");\n            string baseUrl = System.Text.Encoding.UTF8.GetString(data);\n\n            var profiles = new Dictionary<string, string>()\n            {\n                {\"FA_Series\", \"2177-APOR41-de476ec68578c865e886ef6872aa56ee.zip\"},\n                {\"FA401KH\", \"23150-Q32GC2-01817943f438e9eb18a544fe19ceb4df.zip\"},\n                {\"FA401KM\", \"23151-M1BUH0-efd842cbb6bb2a08766f8f7daf7e6506.zip\"},\n                {\"FA401UH\", \"23152-FIT0A1-baa19cc70d90d4ba94c1364805a75e4f.zip\"},\n                {\"FA401UI\", \"19767-N39QWK-05990dae2bf601e9db8b998bfad49f57.zip\"},\n                {\"FA401UM\", \"23153-XCHXWG-b040bd78b565ecdbe56439714ca35eb2.zip\"},\n                {\"FA401UU\", \"19768-K9LFCV-5224d6f68051d884a3adaa588e6300c3.zip\"},\n                {\"FA401UV\", \"19769-8MSQD6-d06ff0a176407b4eaeed468a3bff2bc1.zip\"},\n                {\"FA401WI\", \"19937-J3GRCD-e37d8c1557b9f11d8fb493a78b50fe2d.zip\"},\n                {\"FA401WU\", \"19938-5PIL7F-a3c8522c89e03fc25e2f7290ee5c5f22.zip\"},\n                {\"FA401WV\", \"19939-KIX4CK-3462e49f2c6388228b427b85332538b7.zip\"},\n                {\"FA506IC\", \"7822-ZGQ1KC-bc80be3be7ca585bef60f526b6461c86.zip\"},\n                {\"FA506ICB\", \"13914-2HYCD7-95fabfe5669a204620517f0158c0cea1.zip\"},\n                {\"FA506IE\", \"7828-57N8GH-9fe07a7e4ebde12a8d4682d3ffa66fe4.zip\"},\n                {\"FA506IEB\", \"14661-ZYWH5T-3b45ebeb7fca81d98796d5960e11226c.zip\"},\n                {\"FA506IH\", \"3407-VZBOUN-8a12385fa46e077010677d330e9320d5.zip\"},\n                {\"FA506IHR\", \"7823-15HGA0-44d621a3c0f0dd2c407f67d262871be0.zip\"},\n                {\"FA506IHRB\", \"19343-MBMUPH-190cdb28402ba8efd3e11561c9b2eeb9.zip\"},\n                {\"FA506II\", \"3410-9ZXQO2-aa08794537699c5dbfcca49b63fb7f8d.zip\"},  \n                {\"FA506IM\", \"7824-EKKW9A-21c7e073a81fc868b78e605b17290839.zip\"},\n                {\"FA506IR\", \"7825-G6XND9-c16ea7e98b58e878c61d1071b100ee60.zip\"},\n                {\"FA506IU\", \"3413-AMCR39-2a8b889a8810da4e8692f87e1ae3ea2c.zip\"},\n                {\"FA506IV\", \"3415-VA0CJ6-266febe84bcecc5ed89fdc286f444ce2.zip\"},\n                {\"FA506NC\", \"18359-BM2XCN-3ca9de427310b05afa92dcbe1babf947.zip\"},\n                {\"FA506NCG\", \"23272-PFXOCX-966fca9a86ffb5241144776b8a4244c9.zip\"},\n                {\"FA506NCR\", \"19230-KJ866Z-1980e6f6a843b6b31111e38973fa1cda.zip\"},\n                {\"FA506NF\", \"18361-CU7H6I-55beba8445b9aa0fe9cbeb8ec9a47ccf.zip\"},\n                {\"FA506NFR\", \"19231-GARR16-f7052f6be62ddce2048ebcd6ba808563.zip\"},\n                {\"FA506QC\", \"7829-LBYY5U-b14343c260b738563b69ad0e4f4b88d1.zip\"},\n                {\"FA506QE\", \"7827-75P3DP-b664f4da04e77ed1faa722bf0c781d82.zip\"},\n                {\"FA506QM\", \"9440-87VQKP-48357026f1f3099cfed1161a320587f0.zip\"},\n                {\"FA506QR\", \"7830-KO7FQ6-618480f72c2e68bafc594b5323a5d13c.zip\"},\n                {\"FA507NI\", \"14451-N6AX9R-0bc8e15be5cf889c755aaa7052f6fee8.zip\"},\n                {\"FA507NJ\", \"14454-QXKHOE-d28f2eb001f9b7ce0582cbe33961a6ad.zip\"},\n                {\"FA507NU\", \"14452-EZXLVF-c64dd3d7efede78df653b029888d9d04.zip\"},\n                {\"FA507NUR\", \"19358-JYO79G-f8bc53beeadfdfef80dc6a4eb85c69e2.zip\"},\n                {\"FA507NV\", \"14453-VC333P-41549f64788d59c9711eccec892fa8c1.zip\"},\n                {\"FA507NVR\", \"19359-YWEAES-37feeb146db89c3549bac528d67ae209.zip\"},\n                {\"FA507RC\", \"11448-0TRT8V-7712eb9302300dd82815027efbbe4787.zip\"},\n                {\"FA507RE\", \"11449-ONC7VG-a7ac70468292336f63532c21204d69d4.zip\"},\n                {\"FA507RF\", \"14311-X72FIU-66bf16069a82bdf2cc09f8b92cb25c67.zip\"},\n                {\"FA507RH\", \"11453-W4B8H4-e1645d3ce1e0216a30246ad6a84c3819.zip\"},\n                {\"FA507RM\", \"11452-ZGHOOO-f3bddf2fddd3c027568646bc5afe3c7d.zip\"},\n                {\"FA507RR\", \"11450-UU8KFV-2c718d16687fa3b038e625f504ccd13f.zip\"},\n                {\"FA507RW\", \"11451-XHL0SH-c2702d2047b7b93636cc1372caf25a75.zip\"},\n                {\"FA507UI\", \"17850-4J1GCV-c30e3d47aa82df4e3f0754888903c5dd.zip\"},\n                {\"FA507UU\", \"17851-PIGBD6-45227ab485302ec2cca63f0bbb71d473.zip\"},\n                {\"FA507UV\", \"17852-T32MPT-a2fd989758365b8a04e4dc5bbb146af1.zip\"},\n                {\"FA507XI\", \"14817-A522MM-fad14cb28f00b94735eb55c2b3b7b892.zip\"},\n                {\"FA507XJ\", \"14820-8RT0TF-9d341fae2a290494206deb5fcf1fd427.zip\"},\n                {\"FA507XU\", \"14818-3PA2GD-2d1e2d035309ec7282a1c47e27f7c7fd.zip\"},\n                {\"FA507XV\", \"14819-ET4L73-daf905274776ae9c92a7b74e687dc63d.zip\"},\n                {\"FA607NU\", \"21471-PAVHE0-6fe10875084d9b483f9a010f203d9432.zip\"},\n                {\"FA607NUG\", \"23270-Q0C8M1-4704c503432082b1b2a108464492d06c.zip\"},\n                {\"FA607NUR\", \"21472-KVEN8N-c2aba8f6d9ccfe3dc1557064692d1e7d.zip\"},\n                {\"FA607PI\", \"21198-0USYJW-ab92526d5cb7249caef7c27ec0a26959.zip\"},\n                {\"FA607PU\", \"21199-DRVP13-264a6bfce9599b5b65001789e603bc61.zip\"},\n                {\"FA607PV\", \"21200-JWPHF3-195d7d570718e9269d051e1b040060c5.zip\"},\n                {\"FA607RC\", \"10190-XHDRTQ-0e6c248e3dab6bb07e052edd963c5218.zip\"},\n                {\"FA607RE\", \"10194-AF495K-23a4d74be5132e4babc64bb13237a12b.zip\"},\n                {\"FA607RH\", \"10191-9BS333-c6deb5f9fd5a37d446d2722da54c0ec3.zip\"},\n                {\"FA607RM\", \"10195-4U5EEF-cf98d168cacdd5a60782e881a9c143be.zip\"},\n                {\"FA607RR\", \"10193-FYX2N7-730c76e49ef71a6164804eafd2621dab.zip\"},\n                {\"FA607RW\", \"10192-UFOOP3-f52a50dac189ffa96560f73e04c53a6c.zip\"},\n                {\"FA608FH\", \"22880-2K54GA-168f317757270f37b74cddd9e1d34952.zip\"},\n                {\"FA608FM\", \"22881-LN927H-3827d064e0499ef5c4b55fdac8669335.zip\"},\n                {\"FA608FP\", \"22882-YNB6V0-f9e70d6473cb5249965b126f21f8f184.zip\"},\n                {\"FA608PH\", \"22883-8CUVYX-1f3c61030aa8039f6d27fc66b1dc65c0.zip\"},\n                {\"FA608PM\", \"22884-Y3B91M-707a992984a26f65fcb216e2433559d6.zip\"},\n                {\"FA608PP\", \"22885-G9MBRP-e1185349010359f639cca75d9adfa11b.zip\"},\n                {\"FA608UH\", \"23061-MKY0MS-e740ecf2d481ca33ac6711098815d668.zip\"},\n                {\"FA608UM\", \"23063-PUFOXB-e8ed9dc6af4820002878dee891bebd8f.zip\"},\n                {\"FA608UP\", \"23062-2Y1LLX-53956fabbfab2e7efa8e7c4af156df1e.zip\"},\n                {\"FA608WH\", \"23067-6P30EW-4777c8a270ff36931732744f7ca1825c.zip\"},\n                {\"FA608WI\", \"20103-UE0O65-d6707b2a2f666d671d728661c981883a.zip\"},\n                {\"FA608WM\", \"23068-XI8WYL-8e6db2e6f67c69fafeff914531dc9c74.zip\"},\n                {\"FA608WP\", \"23069-NE9XRI-457fc5f0d7d6d059cbff934908ced89e.zip\"},\n                {\"FA608WU\", \"20102-IQVJL2-edc900ffe25635856729d26dbeac272f.zip\"},\n                {\"FA608WV\", \"20104-EE3Q5U-a7695b4d1668b1a8dda2576f64bffad2.zip\"},\n                {\"FA617NS\", \"21796-EMUOH9-1495ff888af3848ecafb9b938293af7a.zip\"},\n                {\"FA617NSR\", \"21797-VNRP2J-e274ed99fe4c91ad6c1f730063dcc61e.zip\"},\n                {\"FA617NT\", \"21798-X83UVR-6286daaa5031857a511ddd9152fdfcdf.zip\"},\n                {\"FA617NTR\", \"21799-7GA7BG-a2a7d981f4993a1dfe99a143102b9bc1.zip\"},\n                {\"FA617XS\", \"15968-Y9NFXN-cb420fe6e177fc1cf675e9d42a6fd0ea.zip\"},\n                {\"FA617XT\", \"15969-UKYP5L-ad54051ebbad4b17693b65f5bceda799.zip\"},\n                {\"FA706IC\", \"5215-5J3H5Y-d2cdc2f5e03d68e5e5e562581a77c8e6.zip\"},\n                {\"FA706IE\", \"8827-43DTPG-ba6be621f7d0dda88e5391164cbc7a74.zip\"},\n                {\"FA706IH\", \"2610-2EJ0EQ-245d43d7bd14bb3e664fa96e9f5a690e.zip\"},\n                {\"FA706IHR\", \"8828-XBJAQU-5d8064b0fb63ca7866ee4cf821ece676.zip\"},\n                {\"FA706II\", \"2611-HO3IK9-2fb972a395137c940151723b01e9b9cb.zip\"},\n                {\"FA706IM\", \"8829-GWFKN5-5ab773eb09bfb3099137fae3c7d547c1.zip\"},\n                {\"FA706IR\", \"8825-63J2NY-2496ecf21b5fa71e65671531b670cdac.zip\"},\n                {\"FA706IU\", \"2608-EI64MF-64c35bda7789e6e71298e22d793b78d4.zip\"},\n                {\"FA706NF\", \"18362-1V7Z1Z-0bc79f01bdfadc5b39342fba622a5b8d.zip\"},\n                {\"FA706NFR\", \"19232-FE6TXN-d062445db610ce901453145ebc518efe.zip\"},\n                {\"FA706QC\", \"8826-032S4E-868933565b1a7d762bda8cafc1e77458.zip\"},\n                {\"FA706QE\", \"8824-KZNJL9-9d827f4973d4c9787ff050dc1bf35eef.zip\"},\n                {\"FA706QM\", \"8830-6NX7U4-b7bbfe663aa954534d33d2f822181728.zip\"},\n                {\"FA706QR\", \"8823-RXSLAC-a2720365e842af1dd826920fb447fba5.zip\"},\n                {\"FA707NI\", \"14455-19J6WZ-10282c6083ee018a614e75bc809ecf1f.zip\"},\n                {\"FA707NJ\", \"14457-BGJD0K-d963ff94009c9a2a5b99606eac711a95.zip\"},\n                {\"FA707NU\", \"14456-VAZ4LS-1d798d3873c55e9d10b43a3f2b12cd15.zip\"},\n                {\"FA707NUG\", \"23271-FN0Y8E-dee259494174794e33ff6856ebd92fd7.zip\"},\n                {\"FA707NUR\", \"20568-IPF4CY-f7bd11b80ffa20b77b75e6a89213db48.zip\"},\n                {\"FA707NV\", \"14458-7G8B40-08117ddb45ed3c6978aa4ad60e3d2c96.zip\"},\n                {\"FA707NVR\", \"20569-1MFNC4-e41979f29c26628eacf1e9067dd3544d.zip\"},\n                {\"FA707RC\", \"10196-81D3O0-94ccf4d908c9bcb44f8f9092ef9fa2e2.zip\"},\n                {\"FA707RE\", \"10200-AUS9AW-7f366055be2ae2b4c659aa9590bb4d5e.zip\"},\n                {\"FA707RF\", \"14312-6KGU80-09ba6d3e3b490c3d1dce3d16df62cd8a.zip\"},\n                {\"FA707RH\", \"10197-BB5746-a958ff2eeedcfd1753c2e7151c0a3f96.zip\"},\n                {\"FA707RM\", \"10198-TBWO12-e35e49d79fcc03c5cc84b5b40c222e80.zip\"},\n                {\"FA707RR\", \"10199-LILM59-05448f5e429c6c4be7b531d0b6aa2319.zip\"},\n                {\"FA707RW\", \"10201-0KXC4K-3dca8e95a9e676a1010efc79becde228.zip\"},\n                {\"FA707XI\", \"14821-JO8WIQ-77921f1a7a523fe5674f39f10e66f4a3.zip\"},\n                {\"FA707XIN\", \"14822-7W7Q8W-e2e50358e878b092fc888e8e70575985.zip\"},\n                {\"FA707XJ\", \"14823-MX6CGK-0d0862cd441f96a72b1c8baeaa8aa3b4.zip\"},\n                {\"FA707XU\", \"14824-O2LZZA-f0ea2bf54bbc4fd4e7391048f4a083e4.zip\"},\n                {\"FA707XV\", \"14825-DUSKD1-7d0a055d869a7366105380c44788724b.zip\"},\n                {\"FA808UH\", \"23065-2NU5W9-428014aacf31a932a36f88bd5201c0a0.zip\"},\n                {\"FA808UM\", \"23064-L97GA2-7a8ed68f7c5ba31c3bc18d4543ac69cf.zip\"},\n                {\"FA808UP\", \"23066-YJN1R5-2f2deb0ff1c0a764dbd6f4cd61dfcd5b.zip\"},\n                {\"FA808WI\", \"19512-TZ3G4D-60c6849ce49cca1d2177f31ead77df5a.zip\"},\n                {\"FA808WU\", \"19510-ASGCD8-0558641c1b976b901c52d1d72f0bddd7.zip\"},\n                {\"FA808WV\", \"19511-QDVPAJ-f3990996e7a9c0d472b46af286d529f1.zip\"},\n                {\"FX_Series\", \"2174-J1XJKV-bd932ade5eebb0b2f1a36eac85bc5c7d.zip\"},\n                {\"FX505DD\", \"3439-CJLCNE-3df3a90619c571de2917a35a402fe6cb.zip\"},\n                {\"FX505DT\", \"3427-H77L9I-2f3f50fbbb1dc4ac6e703b2820acb491.zip\"},\n                {\"FX505DU\", \"3426-9P4PXL-7e640e1e38c6395bc5455bdf838ea83d.zip\"},\n                {\"FX505DV\", \"3425-31OQ2O-3ab11acfb17dca8f339fe0b8a4efa33d.zip\"},\n                {\"FX505DY\", \"162-H1YFBE-1e5c82e28fa35559e5f7a6aa934d7405.zip\"},\n                {\"FX505GT\", \"3423-8CCGEQ-a72ef69d8d5aab7bfd3eb34e2a55cd48.zip\"},\n                {\"FX505GU\", \"3424-9J0I5H-1c209ee72d9f7ba2caa559fddd9f5fdc.zip\"},\n                {\"FX506HC\", \"7821-BDCXZM-23e718ce9f58cbef286e77c7d97752d0.zip\"},\n                {\"FX506HCB\", \"8452-QZYXAU-9385f6b96812173b12dcf23934d2729d.zip\"},\n                {\"FX506HE\", \"7831-C0XU6K-16e393308545bf5fa327997b33edeba9.zip\"},\n                {\"FX506HEB\", \"8453-42FVNT-a7c6b122bb1f2e16340c016d09b43c13.zip\"},\n                {\"FX506HF\", \"14511-KKQA1F-9129e79baf1215ce451e791b51fee304.zip\"},\n                {\"FX506HHR\", \"7832-KJD4ZK-d6e5fcf84caf94be5b312d6233876322.zip\"},\n                {\"FX506HM\", \"7833-2EVLVM-3082377bce59838bf06bd09c3c9911fe.zip\"},\n                {\"FX506HMB\", \"8454-32DRJH-818506f55eef4d13839ea8e8d8765534.zip\"},\n                {\"FX506LH\", \"10917-Y6JJC7-4596433cf10a71242d9a9255c2b31458.zip\"},\n                {\"FX506LHB\", \"16838-WYAR19-d3f87642f6cf12ec77e231b7d405fa61.zip\"},\n                {\"FX506LI\", \"4428-Y7KRBX-df2c328780c4506a2cb2279ddf84ca58.zip\"},\n                {\"FX506LU\", \"4429-34SZ6D-2df0b447ff1dcf6d887cad5c679331de.zip\"},\n                {\"FX507VI\", \"14064-MTRMKH-169de48f4b0b3035315106bde1a1020f.zip\"},\n                {\"FX507VI4\", \"14065-9VTCNA-b5e0ac043ffd3e3ffab879f6401b2e07.zip\"},\n                {\"FX507VJ\", \"14066-W5FPY3-89180f515ba2c785b1f87c895e09cee9.zip\"},\n                {\"FX507VJ4\", \"14067-DKVRHI-bc0fa5ec61259e31536356ec67d27cb5.zip\"},\n                {\"FX507VU\", \"14071-EEJKDG-95e42e7c6ebaea33206a1de566588ae8.zip\"},\n                {\"FX507VU4\", \"14069-1JAF2A-4d328ede6adf0796924734da3e04a18f.zip\"},\n                {\"FX507VV\", \"14068-QO62TU-b6aadf3d84f816a42f111649bb1381ae.zip\"},\n                {\"FX507VV4\", \"14070-WHB99Q-57b4d0c8f9405038db3e298f72474505.zip\"},\n                {\"FX507ZC\", \"11454-8DEVNS-3503e698cf0b56b387bf65ebd0169786.zip\"},\n                {\"FX507ZC4\", \"13785-D9YTVH-2fb9db83c6f04518f230d1d453373e5d.zip\"},\n                {\"FX507ZE\", \"11459-DKP456-c8d8862da76207dc0a3bf2642b98632d.zip\"},\n                {\"FX507ZE4\", \"13786-3YM16F-fa4c0a13c74e6c1253d464bbb035cbc3.zip\"},\n                {\"FX507ZH\", \"11455-OQI6ZD-866eb458d7ab9ac51cb88966b2c4acf1.zip\"},\n                {\"FX507ZI4\", \"14056-D01K4S-bb2cfa4d564b8a6834c78d675aebdd1c.zip\"},\n                {\"FX507ZJ4\", \"14057-YY0XRG-4f7570dee1902f2012b812d50b0d2334.zip\"},\n                {\"FX507ZM\", \"11456-OM12KU-7c91b2d14b093dc2eef17a555e14ada3.zip\"},\n                {\"FX507ZR\", \"11458-P8RTC8-2b3802527c98749fb68397f35c6bb86b.zip\"},\n                {\"FX507ZU4\", \"14058-9ZYS4E-7e244d3e7dc3641d602130563c1c84b7.zip\"},\n                {\"FX507ZV4\", \"14059-VBGCNK-0314facaf02290da1a75d1b00455cb3a.zip\"},\n                {\"FX507ZW\", \"11457-4F1FOO-5f24a98f90735cedf1ad9fb5ac90adbf.zip\"},\n                {\"FX516PC\", \"7788-GJYPET-06cf200d5b8fb92c807de03796535e80.zip\"},\n                {\"FX516PE\", \"7789-WIT1BW-b32fd9546ac9ac5b6878a3f46c30247c.zip\"},\n                {\"FX516PH\", \"7237-G94WZH-30c10f820dcdf03cc661fd9b73c2927a.zip\"},\n                {\"FX516PM\", \"7790-OG0DVJ-e7ad44e2fa38eb4256e09a62a744659a.zip\"},\n                {\"FX516PR\", \"7791-LJ7RQ7-36c58a0b55aeb5c3782302fd58139815.zip\"},\n                {\"FX517ZC\", \"13757-QJDW9D-ab71bd2ecf24d182bf32fbd931b24e58.zip\"},\n                {\"FX517ZE\", \"13758-75WLCE-fac3186e372a6e0e422d3d78de1addb3.zip\"},\n                {\"FX517ZH\", \"11461-A4BH34-2464f8a583b064ab2bdb336dc13d8b2e.zip\"},\n                {\"FX517ZM\", \"13759-694BOG-7b8f61a1d8a387715721fd2b8e0bd766.zip\"},\n                {\"FX517ZR\", \"11463-MCHEWS-7a732705aea49eb663fe1e8930c463de.zip\"},\n                {\"FX517ZW\", \"11464-S41ORA-d99633ecf421ba4ab73800bc9ebf2e5b.zip\"},\n                {\"FX607JI\", \"20802-NQBEQ9-79a5bd78ec8c0f15cd05c7bc95291d3e.zip\"},\n                {\"FX607JIR\", \"20803-ETAED9-704bade4fbbcdd2e63484f04c5f441d4.zip\"},\n                {\"FX607JU\", \"20804-231XB9-490c8fb8497b7d8cc36a2b65f4f426ba.zip\"},\n                {\"FX607JUR\", \"20805-OVSUFT-1301c03bd490532e04fa177b3812866e.zip\"},\n                {\"FX607JV\", \"20806-32Z9GU-b2db6bb173b2b88d89eb6f8f081812dc.zip\"},\n                {\"FX607JVR\", \"20807-JWOZQV-0ef54b8d3dc0340a0c10cfdf77f56dda.zip\"},\n                {\"FX607VB\", \"21654-S6SM9A-ae7726e202b92f76f7da0118c117a7b0.zip\"},\n                {\"FX607VBR\", \"21653-AWJNDQ-7de72903e78670297fc54e7a83fa0a67.zip\"},\n                {\"FX607VF\", \"20706-OMC7L2-e66289430eb7decd16fe4c6353edb8c4.zip\"},\n                {\"FX607VI\", \"14072-0Z0LX5-c3145816b5c9b045a3e829e194425624.zip\"},\n                {\"FX607VJ\", \"22148-ZIDZCB-73ff3d6b62337227a5b44cc51d59f4ab.zip\"},\n                {\"FX607VU\", \"21652-QFMHFH-8b7ef4a22350147be4520f4197c575eb.zip\"},\n                {\"FX607VUR\", \"21651-1GVYD5-98886916af3c9191b407e29ffbc7293c.zip\"},\n                {\"FX607VV\", \"14075-BX4NJX-a9e24be091f08e6cc3885397f143bdc5.zip\"},\n                {\"FX607ZC\", \"9267-SQXQMT-edf1ee77d7f276d9b2f14fbe80e86459.zip\"},\n                {\"FX607ZE\", \"9268-MI06A0-5f60b76f497adb2c80dc5d34e7ca00ef.zip\"},\n                {\"FX607ZH\", \"9266-75PO51-12f649be993639c1ff986129977bc516.zip\"},\n                {\"FX607ZM\", \"9269-MEPP17-baf25a9abae3ae712da40dc6c4f2de22.zip\"},\n                {\"FX607ZR\", \"9285-7B20C5-9a0ee909d954eda9fd9f334a6b76bdda.zip\"},\n                {\"FX607ZW\", \"9265-9H05OM-5b2735efc15db9c49302451b728338a8.zip\"},\n                {\"FX608JH\", \"22661-SPDZBF-edffaa27ae0b56cc968ce1aafa54aed1.zip\"},\n                {\"FX608JHR\", \"22662-M9XU96-98916125fe0f05c31b6e45abae5a84e3.zip\"},\n                {\"FX608JM\", \"22665-O47X7H-825f786cff2f0f7eb66c7fa6c7d06c1a.zip\"},\n                {\"FX608JMR\", \"22663-IRAW07-7bf1adcb29633cdc03f5f408fcf8bf70.zip\"},\n                {\"FX608JP\", \"22664-793QGS-db9cb3d22d9d5e087c8e778f97ea92a3.zip\"},\n                {\"FX608JPR\", \"22666-MF20F5-8a3d7cec18bc9fd661787259e5244860.zip\"},\n                {\"FX608LM\", \"22659-G2RPZT-e73f7482e6de86050aac83e91dbeda3e.zip\"},\n                {\"FX608LP\", \"22660-2JTM3R-7ba360ce5bf1f50d29618c0bcb3506a0.zip\"},\n                {\"FX617ZC\", \"9263-3PLDC1-74d554f08fac5b1689c7dbb581fc97c4.zip\"},\n                {\"FX617ZE\", \"9264-9L5V7F-203b8f8a48d47470aef80dd42bbef60b.zip\"},\n                {\"FX617ZH\", \"9261-DIXTFE-b20887acff77b59a80e62088caf695f3.zip\"},\n                {\"FX617ZM\", \"9262-OXO77E-8476443cfd885a718b915731b9807bc0.zip\"},\n                {\"FX617ZR\", \"9286-VA9VXJ-8c69c08b5812b00656142d93cb5a5013.zip\"},\n                {\"FX617ZW\", \"9260-O8UGYN-9678cab288d9b85ec59961647ca94ff7.zip\"},\n                {\"FX705DY\", \"163-N6IM0Z-3bee0b29abd2d6b419ba322661d64a6a.zip\"},\n                {\"FX706HC\", \"8834-3HMY7W-fb49a16bc9cda208a3acf5f2ea32fc63.zip\"},\n                {\"FX706HCB\", \"8835-FHPH4O-319d35ab96a1eef3b5ae7fefde106cf2.zip\"},\n                {\"FX706HE\", \"8833-SW8GIL-71ae2ebbdb18ec3380cf682be0ca32a3.zip\"},\n                {\"FX706HEB\", \"8836-SUE4HH-55876358bbe39f53ea2010c8f66e9093.zip\"},\n                {\"FX706HF\", \"17052-8B8C18-0c762fb15cd6367d08c954ce5e01f497.zip\"},\n                {\"FX706HHR\", \"7837-S711RT-ed9d8a61e80895a6403dda19ac873f62.zip\"},\n                {\"FX706HM\", \"8832-O7W1D2-853dd8eb62665c369cd2c3b716a53b80.zip\"},\n                {\"FX706HMB\", \"8831-NKXZ56-437ac6d56280dd0734f9f56db3ba6a6f.zip\"},\n                {\"FX707VB\", \"20829-OQDH77-35aaf2c0ec2e96f2ff51d939e9f7b236.zip\"},\n                {\"FX707VBR\", \"20828-KQM5B0-7bc2f06ec53e28489f2bdad1c6d1a658.zip\"},\n                {\"FX707VI\", \"14076-C4CQ2E-0771f0ec46072ac38a7dbb8829783298.zip\"},\n                {\"FX707VI4\", \"14078-UXPPY2-ffe538cd58da15c780e6263c2818f995.zip\"},\n                {\"FX707VJ\", \"14077-6KB0BJ-af4fae81000b0143477091deaca569da.zip\"},\n                {\"FX707VJ4\", \"14080-YBM0VD-bef842b5fcc1b49cb054cfb1eb3d2258.zip\"},\n                {\"FX707VU\", \"14081-I8JRY3-2ab8a5dcab2033a19de169e424da1530.zip\"},\n                {\"FX707VU4\", \"14079-TALDGM-c7d6c6820a223967463a76152e178af4.zip\"},\n                {\"FX707VUR\", \"20827-1FZPS7-cc2f1b5319994a30fa109ecd023919fa.zip\"},\n                {\"FX707VV\", \"14082-2UYJNX-a21d4e4e856e8a4fe52b30593705d818.zip\"},\n                {\"FX707VV4\", \"14083-79JC8K-74d96cb066ded2d86255755fdc1f3167.zip\"},\n                {\"FX707ZC\", \"9278-7TRFVL-9a0693a78d8d69a265cb7101314dd055.zip\"},\n                {\"FX707ZC4\", \"13358-EPBJ9S-035eca4acee4db9814f693f4aeef0147.zip\"},\n                {\"FX707ZE\", \"9279-QYJXB7-17ff65bda614791358426882d48be6fe.zip\"},\n                {\"FX707ZE4\", \"13357-V3LZL7-64a1ecac6b4657e98a422cd5657cc89b.zip\"},\n                {\"FX707ZH\", \"9280-62FAFQ-3193a4215440ecbe7fece9091fad6205.zip\"},\n                {\"FX707ZI4\", \"14060-EEB7IW-e716f0f9a1f8f91e5ae93d902de96385.zip\"},\n                {\"FX707ZJ4\", \"14061-T7UBPM-91f62b48749f5ed42e3c3d1f2b8bb645.zip\"},\n                {\"FX707ZM\", \"9281-YKO83G-ff6a896b4e055cc6500470636cf9e1ad.zip\"},\n                {\"FX707ZR\", \"9284-GYDQK8-bfdc718699fb7030b0f133402933e12f.zip\"},\n                {\"FX707ZU4\", \"14062-52EB12-8a85d0170af52dfbaf216b98085015d0.zip\"},\n                {\"FX707ZV4\", \"14063-R6EM57-62ad692f855e33bb05aaae1823207415.zip\"},\n                {\"FX707ZW\", \"9282-E6GYQU-5f673e25b2ef5e57c78e36668e9c5e9f.zip\"},\n                {\"G_Series\", \"2176-RS8S2K-e815e5e0be51e1bd76674cd3826cbfec.zip\"},\n                {\"G512LH\", \"3312-AM98EE-e9a32238fa66ffe8683ff0a34019f216.zip\"},\n                {\"G512LI\", \"3310-9MDL49-daee5dd162a699f60f2bb68a3cba7ef7.zip\"},\n                {\"G512LU\", \"4150-SX012C-b6e7d21b645495f57b2fb7bd9734e839.zip\"},\n                {\"G512LV\", \"4151-LUEHCJ-f145d1dd67079a3739a564cb04eaa6ff.zip\"},\n                {\"G512LW\", \"4152-4IMGHN-f0a946d2f21860039a9181b17ca1f1be.zip\"},\n                {\"G512LWS\", \"4153-IZDAY7-3cc48027800d6d123db4f584a5a2e4a4.zip\"},\n                {\"G513IC\", \"7233-I1XU1L-57f580817efeb347c2e64b467b569d48.zip\"},\n                {\"G513IE\", \"7232-7C4QK2-effb8e534fc4639d7fd72e957e1a13fc.zip\"},\n                {\"G513IH\", \"7231-YGY2HL-ef7e448a0e3b2502219c74c2f8a26a72.zip\"},\n                {\"G513IM\", \"7883-JSH1ET-04fb928a7fe54481b8156627d30451ce.zip\"},\n                {\"G513IR\", \"7884-DB01TN-5bdc2457c9a42ad9c0b1ab82139beeac.zip\"},\n                {\"G513QC\", \"7228-I73APA-79e1e7f9582bdc44f510d651e909250b.zip\"},\n                {\"G513QE\", \"7227-9J3H2Y-d222e0119fef169bbe0f20f754743ca7.zip\"},\n                {\"G513QH\", \"7226-MUU2SQ-05a65cada4f1c986b7b2c5e2cf7ea796.zip\"},\n                {\"G513QM\", \"7882-2FWOWK-ca956a4c309edb8cd9d9c24178ec3912.zip\"},\n                {\"G513QR\", \"7885-4VL6WK-6a21c044bb2d69f55febdb6ffcd5b7d8.zip\"},\n                {\"G513QY\", \"7881-S6R4GZ-5832d1de6fc107509803927e4a52ebf7.zip\"},\n                {\"G513RC\", \"14513-WMQ0GS-4018fc7459d96efec72f15f724c33062.zip\"},\n                {\"G513RE\", \"14516-VXJYUR-fbaadee0ba8dea2a24282b2be882d571.zip\"},\n                {\"G513RH\", \"11732-8ODACG-845738811f5dcaee76c7ba113ed0c8bd.zip\"},\n                {\"G513RM\", \"11735-UXEJT9-03457f6d6350f0a860fe6386de27a659.zip\"},\n                {\"G513RS\", \"11733-9SABRD-3a4c8dee5ff96668dc9ff509d626e17e.zip\"},\n                {\"G513RW\", \"11737-VS9IFQ-b9c6657578263ac3ab1062b32ab599bb.zip\"},\n                {\"G513RX\", \"11736-CHOX6M-ca19a5d6e7153102c3825f8b3371b4d7.zip\"},\n                {\"G531GD\", \"3698-YSDO31-352980933199182c587573ecf056711b.zip\"},\n                {\"G531GT\", \"3697-OYLYLQ-4916a89afb3a6964cb2b0ddd8dc45fe1.zip\"},\n                {\"G531GU\", \"744-S7QQP3-8572157fa95e0eb235f29df0227d5064.zip\"},\n                {\"G532LU\", \"4146-NF3MBY-79c262fe416eb469fdff811d501233c9.zip\"},\n                {\"G532LV\", \"4147-F6P59K-328b1796ee854653a1470be865e06d0e.zip\"},\n                {\"G532LW\", \"4148-KUJ0SA-affcc286138b433b9b051dffc8158672.zip\"},\n                {\"G532LWS\", \"4149-RDJKG0-c5f4470225e184cdbc34b9b41c9e2666.zip\"},\n                {\"G533QM\", \"7880-VL41LZ-ea6868a4918e7a2571a169b0b20d53de.zip\"},\n                {\"G533QR\", \"7879-3915UU-cec5ce6e895bc9acf0367b1ae69d7d01.zip\"},\n                {\"G533QS\", \"7878-SLEHTN-4844d16bf258768105873010c17398ea.zip\"},\n                {\"G533ZC\", \"11725-BVSBSP-1f91feb49662e4f4257a27ea081db4ac.zip\"},\n                {\"G533ZE\", \"11730-DEG4Q9-3d77f3901752747e449fdaa5467a250b.zip\"},\n                {\"G533ZM\", \"11726-01FCGK-180459312539e4c38def3c7323a60494.zip\"},\n                {\"G533ZS\", \"11728-KGTOE8-4fe0474fc6e8944dbdcf726bad1a7db1.zip\"},\n                {\"G533ZW\", \"11727-98BKOJ-93e373e64e92c21ff018ba6c66a9de9d.zip\"},\n                {\"G533ZX\", \"11729-XNFMPR-e0aad4e4d4956dba8629f419b1f86026.zip\"},\n                {\"G614FH\", \"22964-IKFUNI-ff41ee5ac7afd01c38f49c761c68f393.zip\"},\n                {\"G614FM\", \"22966-LMNTTU-df1a5431f63db9753a820fce6121ba3d.zip\"},\n                {\"G614FP\", \"22965-54RYS9-ab7cb9ce54a7a73a66242a1f62ae20c9.zip\"},\n                {\"G614FR\", \"22967-9WDJ29-6d50a5d7fc8ea253b1d370f390ec1add.zip\"},\n                {\"G614JF\", \"14496-NAATJZ-a3847e890e57aa749645b854b28ead79.zip\"},\n                {\"G614JI\", \"14168-4VTU0U-37decb2df809672eccf1156769eda929.zip\"},\n                {\"G614JIR\", \"19126-IMXGO5-4cce9f45ad28fa60d016f8d212c50b10.zip\"},\n                {\"G614JJ\", \"14497-P0D5PL-abe178509e0316da9ee56b24e15d0384.zip\"},\n                {\"G614JU\", \"14498-5D71EB-2300be03087494ee34356470ca022b7c.zip\"},\n                {\"G614JV\", \"14500-SPJCAL-a8e2e223857c334ba4c20c8122151bb7.zip\"},\n                {\"G614JVR\", \"19129-EA1WB4-4666564ee013c4df53be44bcdd20bec0.zip\"},\n                {\"G614JZ\", \"18199-P9WWOH-093d361358629a2bddd5bff7b5fb7a5f.zip\"},\n                {\"G614PH\", \"22613-X5U6T7-e7e2654b2ec7a8efac46319b45906454.zip\"},\n                {\"G614PM\", \"22617-L0AL1H-e6804d067503cc527b8332224350f1ef.zip\"},\n                {\"G614PP\", \"22614-DTOZFV-c1d2512299d5bf2c832965fddda47a41.zip\"},\n                {\"G614PR\", \"22619-PRHJH0-e03c3c78a6d0053b0f4facd6c08920ef.zip\"},\n                {\"G615JH\", \"31607-3GDOXP-4ea1f67c8fa8dcaa3afc66af911b4bc0.zip\"},\n                {\"G615JHR\", \"31604-7N44ZS-325895f1c158f51fff5ae4fe17e5d993.zip\"},\n                {\"G615JM\", \"31608-TQHVZV-6d9fe17c485c0915121d15bedd692389.zip\"},\n                {\"G615JMR\", \"31605-7E9UBG-b0d27b4a158048005d1558f8d07a2368.zip\"},\n                {\"G615JPR\", \"31606-J8SVX6-30cce6a6ef8be37010dfd844a41d4aeb.zip\"},\n                {\"G615LH\", \"21974-7TI36W-4ceedda7dfafaa372eca088a94265c7d.zip\"},\n                {\"G615LM\", \"21975-NG6PCX-e16e93776433e27605e28696bbd8ea75.zip\"},\n                {\"G615LP\", \"21983-37FTFE-a41de242fa2af1bb6b7fee9cd433826d.zip\"},\n                {\"G615LR\", \"21977-UAAJKQ-50eff9e99b7d8f5662cf43fffde6883a.zip\"},\n                {\"G615LW\", \"21976-FNFOAP-c9693e32f4d0e8a64db7e63e6a79820c.zip\"},\n                {\"G634JY\", \"14163-JLRBOO-8ea519425efe56cc144e38d22cebd3f0.zip\"},\n                {\"G634JYR\", \"19130-MUAT65-0eced7ca55a61cc41341faa3a48d34f3.zip\"},\n                {\"G634JZ\", \"15827-MSW5I1-0f39e92313e54afe3e35f5636dc37fd5.zip\"},\n                {\"G634JZR\", \"17891-O7PAGL-5c6e6d059ff7bc1b9245fdf8a8066263.zip\"},\n                {\"G635LR\", \"21984-G3L1SG-24fef8c24f87794c1d09b1e9efb02ef2.zip\"},\n                {\"G635LW\", \"21985-AV5G50-9b3da7234e21be309ec3d889cd88c4af.zip\"},\n                {\"G635LX\", \"21986-H42PRP-be7b559744ef9aaf21aebdd233fa0015.zip\"},\n                {\"G703GX\", \"105-NMT9XG-76a0810ddf16ee376fa049bd179377fc.zip\"},\n                {\"G712LU\", \"3364-3GYELH-a0f545d6a2f5ca2516e91f0495f98110.zip\"},\n                {\"G712LV\", \"3365-UYDEWV-6675727e4e0588b95d9faa2df69b1972.zip\"},\n                {\"G712LW\", \"3366-OK41IE-fc01da1e3d6217e6bce24f3237b5631e.zip\"},\n                {\"G712LWS\", \"3367-N1B9F6-72dd79495de9b660a8b120579c708623.zip\"},\n                {\"G713IC\", \"14187-GKTF5N-c602fb66b48f86aa2ab7b14367dba7b0.zip\"},\n                {\"G713IE\", \"11023-PVEVI5-bfa9a58633213b87629c5117030d54f2.zip\"},\n                {\"G713IH\", \"6317-I3AGUT-a0a1e3b68265d7bd3a2a1657afa0cfb6.zip\"},\n                {\"G713IM\", \"7890-IC1UIL-85b242f2f61aef5cd16166178b6a1adc.zip\"},\n                {\"G713IR\", \"7891-832AOR-104e408922a3f0c4e8d97d03dd000083.zip\"},\n                {\"G713PI\", \"14527-XK0JY1-ffe9b04acfd36ebcf3b1331577515b8c.zip\"},\n                {\"G713PU\", \"14528-AC10R7-ee30e2f76e16c16db44758ac911e9d61.zip\"},\n                {\"G713PV\", \"14530-3ONUVM-abf27eca2271dcdfd150acdf6cc26800.zip\"},\n                {\"G713PVN\", \"14529-YMPI29-b958f3ae6ad8118997c16c87d9840fb9.zip\"},\n                {\"G713QC\", \"5496-KAW7ZL-7a45d99d71ba375d79d047a015c27c2a.zip\"},\n                {\"G713QE\", \"5497-T7QUN2-f5c00e128ed96b9727dcdfb4d857dbb7.zip\"},\n                {\"G713QH\", \"6316-ANOUE8-9b18e7d3aeaeb5cc4520be09df860617.zip\"},\n                {\"G713QM\", \"7892-JCIYF7-acf05d6b34e417efed385e84dc079677.zip\"},\n                {\"G713QR\", \"7888-XIBCC9-d2e608529ce49f0daf90bf3d81cbd69e.zip\"},\n                {\"G713QY\", \"7889-FH9X9W-5c4d00f5506924fc9f29e1c190b1bf51.zip\"},\n                {\"G713RC\", \"14514-8R6TFS-eb95e08804622256fc5be85a1f14301c.zip\"},\n                {\"G713RE\", \"14515-LTB9LQ-a6a522a9d63083e0366d13f40af54ebf.zip\"},\n                {\"G713RH\", \"11305-VO5JTS-7cb1b763f054da29ce2ba1e08c897a60.zip\"},\n                {\"G713RM\", \"11309-GX2AYR-5b172b743c185242080b08dd7e2b7fc7.zip\"},\n                {\"G713RS\", \"11306-E1A3OM-37679d1dfc144d892325420d784f5d8e.zip\"},\n                {\"G713RW\", \"11308-IPZSAB-6c8827c63a27cee6257c755bf0bd9c41.zip\"},\n                {\"G713RX\", \"11307-JGFO1D-cff83a2f34e3c0ed755ed63c20d2905d.zip\"},\n                {\"G732LU\", \"3368-C89MVD-1ecb4a036b697bd4bd027d2bd160d219.zip\"},\n                {\"G732LV\", \"3369-TI19K6-56ca5eb37397117c97e0bae42e82b2b4.zip\"},\n                {\"G732LW\", \"3370-HLPSUS-9c7615d0220bde50de5ecd4c7e51182c.zip\"},\n                {\"G732LWS\", \"3371-B4CG89-c22a9f4deb49d6e1e921ebd5a0cab685.zip\"},\n                {\"G732LXS\", \"3372-OJEP07-c0e21f578660bec502aec19a3645b067.zip\"},\n                {\"G733CM\", \"11332-V8B7E9-2a7f61f88106051be62b57250ed33eaf.zip\"},\n                {\"G733CW\", \"11334-MQ3PJE-f03f2950247ac635dda1b30245d220aa.zip\"},\n                {\"G733CX\", \"11333-XS984I-d48bb5ee3416d47fa203090bc8bce04d.zip\"},\n                {\"G733PY\", \"14531-B4NFUU-4ec97a54081ea4b713975fd1ab7c1b80.zip\"},\n                {\"G733PYV\", \"15178-1CIVEB-5a9d09a4d22d6361992c7cd6ca27fb41.zip\"},\n                {\"G733PZ\", \"14532-4UUM5E-296ee92ca5416a8c59bffd6f101feaa5.zip\"},\n                {\"G733PZV\", \"15179-EDHNHX-ce69d260b1e8077d8d522d3b4326322c.zip\"},\n                {\"G733QM\", \"7893-OW1O2I-a2dcb8ff88cae20c7086bac8d9312dbc.zip\"},\n                {\"G733QR\", \"7887-OA7Z12-bc86110ff0d1f359d9230fca8bbabe51.zip\"},\n                {\"G733QS\", \"7886-V9PIMC-27ca6272c2b093264d88a32f1093a4fe.zip\"},\n                {\"G733QSA\", \"5501-LX7POZ-9289c2079bdb48e2fdd76d7981fb0e5d.zip\"},\n                {\"G733ZC\", \"10077-J3XTHP-525deb09f2ada7dc36dc82772f7a9cce.zip\"},\n                {\"G733ZE\", \"10079-KAW34P-16c4b5e812e10019f21b4d7f879acfaf.zip\"},\n                {\"G733ZM\", \"10078-K6B3CR-63dd00f6ecc3eb61e92439ef5caaea17.zip\"},\n                {\"G733ZS\", \"10081-VM2AN1-517b1e41388f12048ec3a88c780f1d65.zip\"},\n                {\"G733ZW\", \"10080-HY42QH-aa285046069cfe113953b91f1a28d101.zip\"},\n                {\"G733ZX\", \"10082-JS5F1Y-41bccc831aec7bf1c0a59a309bc607c7.zip\"},\n                {\"G814FH\", \"22968-E1S7CQ-74db4415d107c62a83d16ad3651bc050.zip\"},\n                {\"G814FM\", \"22969-W0BPSY-85970fbc1c06f1211d4079f1a5a88814.zip\"},\n                {\"G814FP\", \"22970-A9YYN5-3aae7c7bfd23fea9653e47a8af10ccf8.zip\"},\n                {\"G814JI\", \"18243-BAU912-671afb033d3b1c44f9852ff608910f42.zip\"},\n                {\"G814JIR\", \"19802-1CGBPH-f1d31bab157b36d109e1e10591d49f4b.zip\"},\n                {\"G814JU\", \"18193-Y5GMF0-843cee9ed982a3d5aba21e99efbc396c.zip\"},\n                {\"G814JV\", \"18194-9Q537I-c5c2ca782d26dcd5346c110767347903.zip\"},\n                {\"G814JVR\", \"19801-JK7M4V-617e0c975bf6e2a6f67802d825fa6aa4.zip\"},\n                {\"G814JZ\", \"18195-V98WBX-19d4c2e52916bf9c96fcaed6f1d9bdda.zip\"},\n                {\"G814PH\", \"22616-BV83XY-70a74e6af7e03ba02c7cc1cd4d673dfd.zip\"},\n                {\"G814PM\", \"22615-BA9BEE-b50e8887b590eaef979582b10100d8c5.zip\"},\n                {\"G814PP\", \"22618-LD3JLK-2d0e669837bebbc804840a6fe8d8b398.zip\"},\n                {\"G815JHR\", \"22607-WNVMUG-a68e0fc8990eef8bd47566ae45b69d88.zip\"},\n                {\"G815JMR\", \"22608-IXWA0Z-9885972f57eeccda2bebb851ab79a481.zip\"},\n                {\"G815JPR\", \"22609-MXV0D5-9b5445f2e3900d16ee3327cafa7b3bf1.zip\"},\n                {\"G815LH\", \"21978-OT4T3K-1945c266905d7f779bcd57400eca1b9a.zip\"},\n                {\"G815LM\", \"21981-T8RBUT-0251d2dfd9150ed6d5c9999e6428707f.zip\"},\n                {\"G815LP\", \"21982-RXZOHG-ca29c09860c97f0e69b225ad8cb8a47b.zip\"},\n                {\"G815LR\", \"21980-ZT48Z9-b60f503dcd152b6152dcf1e328a79177.zip\"},\n                {\"G815LW\", \"21979-LR1WNB-4ef0e10c142e7805e0d207261e484dff.zip\"},\n                {\"G834JY\", \"15954-HAV3KR-d219c43750d485279e12cf76f5b2569b.zip\"},\n                {\"G834JYR\", \"19121-GX7FZU-7c449cf7db0033db75da0f4a464ee4d9.zip\"},\n                {\"G834JZ\", \"15953-C7XC62-a987058c0a26fa3c929b300d099296a5.zip\"},\n                {\"G834JZR\", \"19122-CAYURL-f71108b839d923ae92f3f83451ddfa69.zip\"},\n                {\"G835LR\", \"21987-TCRPUD-19e2bd431fa4d9acd5f6b4f53cd63445.zip\"},\n                {\"G835LW\", \"21989-JGI499-89ec59aa686a58d890e6f441c329e8bd.zip\"},\n                {\"G835LX\", \"21988-Q88PAJ-a0413f1695207b780f3a9a1c30aa838a.zip\"},\n                {\"GA401IC\", \"5864-KC8TTP-082f9a62dda322ccaed82ff3e3466bf8.zip\"},\n                {\"GA401IE\", \"5866-JO8504-dde5402bdecafc1cef55a7dc3d6167ec.zip\"},\n                {\"GA401IHR\", \"5865-7DV6TB-9833a54c7334dc3aef1b9e99f56b9e95.zip\"},\n                {\"GA401QC\", \"5129-PY283Y-ac372208c57a7f558db6c169cd50d091.zip\"},\n                {\"GA401QE\", \"5130-C2G5CO-8ea0eb1ca537d77d19bad13dee55294c.zip\"},\n                {\"GA401QH\", \"5124-QQ97GA-bbde59c5235d8b72b78059b95e8a23a2.zip\"},\n                {\"GA401QM\", \"4922-222SBA-340a82b955a5f57ff39f6d2d08af365b.zip\"},\n                {\"GA402NF\", \"14160-ORONGT-ca84f0561683e1a07548d0cb7e42c275.zip\"},\n                {\"GA402NI\", \"14159-SDCMA5-300bd29af08b0f5d1527a375f8c326f2.zip\"},\n                {\"GA402NJ\", \"14158-O7H0GR-10db546f9901ac02d3ce8d5a28cb4772.zip\"},\n                {\"GA402NU\", \"14157-QJ4W59-69222faad499f94b4d96f7d85504930d.zip\"},\n                {\"GA402NV\", \"14156-ZKGYBE-ae1ac3947eb8684cabc0cd45f8d4c67e.zip\"},\n                {\"GA402NY\", \"14155-AL3KZU-17ac9e4b88c03ebaf983134f76f9a4b2.zip\"},\n                {\"GA402NZ\", \"14154-SY6J4X-7d8416a09b51e32f856f3353173ccc70.zip\"},\n                {\"GA402RI\", \"10145-9W1623-272e082c57c6e41074b2cace72adc92e.zip\"},\n                {\"GA402RJ\", \"10146-IY7ENY-f6d2d25b5b6b21616ceddc4e9aefa656.zip\"},\n                {\"GA402RK\", \"10151-7RPIER-2588aa83188168f8375ed9bab7bb67d2.zip\"},\n                {\"GA402RQ\", \"10147-9NQMQH-7ff3944c376e91b26c0a1c18122a4262.zip\"},\n                {\"GA402RU\", \"10149-3F10IX-43c96d30b6702261c3cf85467857eec9.zip\"},\n                {\"GA402RW\", \"10150-5H5ISD-1badfa856f0ec8d15d9d5832a8d54fc9.zip\"},\n                {\"GA402RX\", \"10148-QFCU8O-704d371255ae8a72737f5f8eca75eb9d.zip\"},\n                {\"GA402XI\", \"14899-86ZX57-5940ed56b182781334ca2856f6ba0b9e.zip\"},\n                {\"GA402XJ\", \"14901-MDIR3C-5022331539bb187bf041a7e3ab0a46bf.zip\"},\n                {\"GA402XU\", \"14900-KYCOC7-361bb364d26ff834d6bd716d14f70006.zip\"},\n                {\"GA402XV\", \"14902-EL34M9-731ba1cc0d27d2db9a79d872673e7958.zip\"},\n                {\"GA402XY\", \"14903-ICC56W-0456739d8ba5ee543dfba99eb6ad217a.zip\"},\n                {\"GA402XZ\", \"14904-B3K2NR-928b7272790e7da0079c549cd4885d5d.zip\"},\n                {\"GA403UH\", \"22130-961KSK-c85781ae0e06619558d0e5521410ed9b.zip\"},\n                {\"GA403UI\", \"19112-NB8TJ1-e1de0121e30431cc5520ea6eccb6e46f.zip\"},\n                {\"GA403UM\", \"22131-6S9LD4-8b2947a33df627268d02508e3c0d4e94.zip\"},\n                {\"GA403UP\", \"22132-CYYLFA-5f1047df14434ddd8d5ab779c55c9173.zip\"},\n                {\"GA403UU\", \"19113-C86SAH-4338dac48ad593c4079515b7599b8943.zip\"},\n                {\"GA403UV\", \"19114-6KR0FP-4740ed98a2ca06bc26c363de380a037d.zip\"},\n                {\"GA403WH\", \"22124-MX48WN-aad1a7201e9f3ed9c99b060b14eed997.zip\"},\n                {\"GA403WM\", \"22125-DFIUZF-8772887a07055debb5a3cf97c55c4242.zip\"},\n                {\"GA403WP\", \"22129-XXPL3G-1a8da27221fbab5daba1852103a93577.zip\"},\n                {\"GA403WR\", \"22126-4XQZW0-10c3ddd2ea2cf3f17a1df07326bc0f97.zip\"},\n                {\"GA403WW\", \"22128-VNI4AK-eab16cadfd673802df351d71f451b223.zip\"},\n                {\"GA403WX\", \"22127-T3HDCM-801fd1dbc97b43cd849331501c4e9c94.zip\"},\n                {\"GA502II\", \"3554-REAPZQ-5f94c7ecd52ae2cad50aaac4341bec7b.zip\"},\n                {\"GA502IU\", \"3555-15UWZ4-d1cd040265773efd61bdfd146140a990.zip\"},\n                {\"GA502IV\", \"3556-ULLH3K-1f56134e43e1ffa353256fbeb9840d3f.zip\"},\n                {\"GA503IC\", \"7457-RENJRP-5b833a2bd8e1e13ec41f0acf7ef04fd0.zip\"},\n                {\"GA503IE\", \"7465-QO1Q0F-663f0c9501e649bcb0069413f3081a49.zip\"},\n                {\"GA503IH\", \"7458-D6CHF3-4c6b83cb3efc11713fddd9c41cfd127c.zip\"},\n                {\"GA503IM\", \"7741-F8GHPK-63e17aca55a11e838b1079eb0c6bea16.zip\"},\n                {\"GA503QC\", \"7459-308BEA-bcf2604511112df5fa810faa9cdece89.zip\"},\n                {\"GA503QE\", \"7464-4T2J1D-3920997d2f44d3b40dffd6ba9f028075.zip\"},\n                {\"GA503QM\", \"7739-BSD39S-f9858fd4a68ff8ef60b8abf2cda92dd7.zip\"},\n                {\"GA503QN\", \"7740-QT19P2-33054dbe06ae3baa435a44ce529eddb5.zip\"},\n                {\"GA503QR\", \"7738-QVCIRY-4e612ff997f11448c77068e39ee0681e.zip\"},\n                {\"GA503QS\", \"7737-B5L4LD-4400a4ddc94eebefb0678fb281b63fa0.zip\"},\n                {\"GA503RJ\", \"10630-MSC4Q2-f16f1ef2847069e50aad62083836b220.zip\"},\n                {\"GA503RK\", \"10631-VXWRAN-b2a1aa499bf33f1f9bd3d80e31dd9d69.zip\"},\n                {\"GA503RM\", \"12054-38JGOX-35e7b1afb150daea1eab90ae97f0da7b.zip\"},\n                {\"GA503RR\", \"10632-IOY3C0-bf16d1028f572ede9dd8e1a2fd632ae5.zip\"},\n                {\"GA503RS\", \"11745-689QTC-6c441a7161a34b871918fce5997c4e2e.zip\"},\n                {\"GA503RW\", \"12055-SG6VTH-91cc5782da63cf3dcc16804a47db25a2.zip\"},\n                {\"GA503RX\", \"12056-MR9J0D-b7dad63f751d2e53aeee479524986bdd.zip\"},\n                {\"GA605KH\", \"34778-1X5X1P-9b023a4cc276c1b76403252fb0f3e5a3.zip\"},\n                {\"GA605KM\", \"34779-NF05HM-bcb5d80ed987f1bb4dfd4483bb1641fb.zip\"},\n                {\"GA605KP\", \"34780-M8F3RH-0cb687d074f358270b8d189bac6c77c3.zip\"},\n                {\"GA605WI\", \"20014-K4K912-2a2e5a66fac3cc97fb13394a189bd75e.zip\"},\n                {\"GA605WU\", \"20015-HJM11B-a724c1fe216b73c0b3b24475047f4615.zip\"},\n                {\"GA605WV\", \"20016-BWVQPK-01624c1cdd5a3c05252bad472fab1240.zip\"},\n                {\"GL_Series\", \"2167-P7ELNB-44d357ee720a0c48c2eb37eee785316c.zip\"},\n                {\"GL503GE\", \"57-YI7HPS-9ed36ba45ff6398f3648a44ced4e5e61.zip\"},\n                {\"GL504GM\", \"58-JOZ3S5-998677afd41375cb8fd60ace8d11a788.zip\"},\n                {\"GL504GS\", \"59-KS4SJK-b1c9807c7d7dc847fa895516b3b9a8cb.zip\"},\n                {\"GL504GV\", \"167-OX51EF-b8b5c713bff267d315e0255370956e75.zip\"},\n                {\"GL504GW\", \"168-NMGNB6-1f6d79b87d077c235c57d4505ce802e7.zip\"},\n                {\"GL703GE\", \"60-M0UOZ3-1474ef8209bf010de4c6e6ae94ce351d.zip\"},\n                {\"GL703GM\", \"61-WJGLV3-b8005e077aa4825799459412849e346c.zip\"},\n                {\"GL703GS\", \"62-HU12J1-a88023229e3a2dbc5fc1aca1b07e4d76.zip\"},\n                {\"GL704GV\", \"106-3IHGVF-5d15db39c04a44e3503d3536d4f0c132.zip\"},\n                {\"GL704GW\", \"107-NZ7VZL-cae8497c2eb8479f4808d2b61e7c8e70.zip\"},\n                {\"GM_Series\", \"2169-K05CUW-841a5508c96649de28d613e32dfb7fcf.zip\"},\n                {\"GM501GM\", \"63-3CL0UZ-eee6728dd2517d6e3af581f1caef0114.zip\"},\n                {\"GM501GS\", \"64-GH66XC-5e69efa00bbe486efd897414ed329545.zip\"},\n                {\"GU_Series\", \"2170-FYLCER-f45e5d5e38121b7bfe275b780e739a8e.zip\"},\n                {\"GU501GM\", \"65-LSRZXK-658dc6e1c89a7787201ec7c74eebf2d5.zip\"},\n                {\"GU502DU\", \"4004-T40IY1-74f962c9d9d27544c964bdb347074472.zip\"},\n                {\"GU603HE\", \"11674-VGXXML-41035c5f9dbf4e0b64a74eb3f89d95e4.zip\"},\n                {\"GU603HM\", \"11676-GO5KVF-581b4f49e0e12d9d6654ab2c1db9ab11.zip\"},\n                {\"GU603HR\", \"11675-AZPXHF-48a9979ce428acfcc57c4e295f8a9840.zip\"},\n                {\"GU603VI\", \"22217-V6DZR1-cb3e0bf4c1fa63e2cc3509b8b0cf517d.zip\"},\n                {\"GU603VJ\", \"14580-18G1FP-4456270d80c37a0597b3bfc559222f64.zip\"},\n                {\"GU603VQ\", \"14581-8YY8TX-e7aa10a20a41245500f40841b2298a42.zip\"},\n                {\"GU603VU\", \"22218-5W0UVU-2d9ccfbfe1e5fb58d477e9c456ddf637.zip\"},\n                {\"GU603VV\", \"22219-EKZ2J0-3c73e741e68555dc39976ed2c38cd347.zip\"},\n                {\"GU603ZE\", \"9817-3EENL9-3187794df7ec8ddef2fe04d0787eff63.zip\"},\n                {\"GU603ZEB\", \"9818-KOP3C1-11ab717fddedafb9066b362d8da5af85.zip\"},\n                {\"GU603ZI\", \"14431-H4XZCU-1c907d4e22bbd5000a6c81cfc2e1dae4.zip\"},\n                {\"GU603ZJ\", \"14432-Y5HC6R-b50edb7a5ad9469b89c35e5cd9fc114f.zip\"},\n                {\"GU603ZM\", \"9819-718DH0-30bf094253e5178aba765436bb8b150f.zip\"},\n                {\"GU603ZQ\", \"14434-3KPJU7-211e518352b0660babc4816fa5dd80bd.zip\"},\n                {\"GU603ZR\", \"9820-LIQ8FP-6a60aee97d7028e7ea63bd2ab6c2b099.zip\"},\n                {\"GU603ZU\", \"14435-2ZW8FL-65ab99a80fe08d8d088d8fdc998076f4.zip\"},\n                {\"GU603ZV\", \"14433-FEY59U-cd0508e779a6b3874a61668f39ff78e0.zip\"},\n                {\"GU603ZW\", \"9822-3R2PGP-f2d24c6931e733a5e0e41dc8560b80cc.zip\"},\n                {\"GU603ZX\", \"9821-AQYG62-f42f167ec7b4f4fe003f05b1c1c61d58.zip\"},\n                {\"GU604VI\", \"14284-R38BM3-e2591bfa2582ce68b2c8aba63beac5e3.zip\"},\n                {\"GU604VY\", \"14282-78N7V4-25e76896744c53317fa41a80788a2241.zip\"},\n                {\"GU604VZ\", \"14283-U4JX5C-f31dff75d52f48ceca0102fd1bc76e31.zip\"},\n                {\"GU605CH\", \"22118-KAKRIQ-b2b88103b3bd650bdfd526a4a64be94f.zip\"},\n                {\"GU605CM\", \"22119-AIQFFC-12e1e36bcc6b917210c454177c012146.zip\"},\n                {\"GU605CP\", \"22120-SJ4WQL-331fc48fa8fe4494f52492b143a4c5c0.zip\"},\n                {\"GU605CR\", \"22121-IEKEQ3-5265006f98166fe397a0a9ffac782e87.zip\"},\n                {\"GU605CW\", \"22123-63UFOU-d8c179200a0ddd661e8b8838ad023452.zip\"},\n                {\"GU605CX\", \"22122-M8J9C2-029d307fdbc49dd80dca79e1c8ed6e32.zip\"},\n                {\"GU605MI\", \"19271-93QRMU-eab4115ee09fb9bbd86facec08a822a1.zip\"},\n                {\"GU605MU\", \"19272-RDZDEJ-4380e52eab6a3742613c2f694a19da1e.zip\"},\n                {\"GU605MV\", \"19274-1T9PKS-d05273f430d255ad1779cf6a7eb57db3.zip\"},\n                {\"GU605MY\", \"19273-F4A493-2bc9083d99e7827b4580311d34f8998b.zip\"},\n                {\"GU605MZ\", \"19275-52DG5X-1072d6f4fdc5b9cbb304da7146f05a79.zip\"},\n                {\"GV301QC\", \"5128-RN42GR-9a6049e7adabd1ff2aeed24293fe03a8.zip\"},\n                {\"GV301QCZ\", \"6778-152PHS-7a9ad124aef1059471542dfc8912ed7b.zip\"},\n                {\"GV301QE\", \"5125-PD15GR-9a7f72cbf5bd97d283464d8e407f0231.zip\"},\n                {\"GV301QEZ\", \"6780-N3Y08B-222db095847d99663a575be36fbcf410.zip\"},\n                {\"GV301QH\", \"5077-0BEYRT-ff8e30857ab4af017381f5703b39abed.zip\"},\n                {\"GV301QHZ\", \"6779-9XZE32-329974b938dff4baf3097e3d745839eb.zip\"},\n                {\"GV301RA\", \"10272-1B7YAA-45e3697377ff2e7dd68c57f5919eecd2.zip\"},\n                {\"GV301RC\", \"10273-UJ0Q76-53bdfe00929ccf3f594f813ba235438b.zip\"},\n                {\"GV301RE\", \"10274-1J3P7N-42dabc435e4daa40d4be2fa482624321.zip\"},\n                {\"GV302NA\", \"14663-N4C4U4-1654950fbc1fad0e37a016c4a1e8a934.zip\"},\n                {\"GV302NF\", \"14668-GMKBGC-1bd7957eb1a688f8eb0e6fb85395b839.zip\"},\n                {\"GV302NI\", \"14664-ZQXAM8-1dec6b07c9589698c8cccdbc3a3211a6.zip\"},\n                {\"GV302NJ\", \"14667-OFKJGT-60db594b4af90c481212ee31ffa96d38.zip\"},\n                {\"GV302NU\", \"14666-6M0N3K-3d08325f6c4b3fcacf53a2f863a0e6c5.zip\"},\n                {\"GV302NV\", \"14665-DWLIIQ-9b3b8b0aaca3a071f82cbb30fbbe2fd1.zip\"},\n                {\"GV302XA\", \"14934-AU5P0J-1873c4e95dadcf72b1fad550108a0eb5.zip\"},\n                {\"GV302XF\", \"14935-D5PHI6-aa9715b2328c499c8cd72b4958ba6641.zip\"},\n                {\"GV302XI\", \"14936-CHYX8S-f5fe72833a34f1f002dae6789f2760fe.zip\"},\n                {\"GV302XJ\", \"14937-LMH57E-651161fb27c3ef9904e15fc42e5d8352.zip\"},\n                {\"GV302XU\", \"14938-4DXJJV-82feb9f0156bb914ccbde2de6d59ad14.zip\"},\n                {\"GV302XV\", \"14939-KLW56G-32ffda0b7ee35bbe4ca5789da7210cc9.zip\"},\n                {\"GV601RA\", \"11078-109U4J-33e9d7342819b8a7a534632df659e509.zip\"},\n                {\"GV601RE\", \"11079-U5MUWC-8c22738f13a798376733fead5f091a4b.zip\"},\n                {\"GV601RM\", \"11082-XN5PLH-5c405808680f6bfc36c5069bcd5dc366.zip\"},\n                {\"GV601RW\", \"11081-FK9JFY-b82e25b8f9bcd2ad1d3ae23c7cb327d0.zip\"},\n                {\"GV601RX\", \"11080-45B7E2-b64fdbf32877dc996b4efe274ff51f41.zip\"},\n                {\"GV601VI\", \"14446-JS3QXL-72327a76c47c2ffdeaad392197a4b2ce.zip\"},\n                {\"GV601VJ\", \"14448-TIX8CU-ed84b2ee1d92d2f38a891ed1c684eddf.zip\"},\n                {\"GV601VQ\", \"14447-7C8UIX-13cc4d4632406ca5976358a4080f26af.zip\"},\n                {\"GV601VU\", \"14450-0SP39K-8071216d3c679d013fffe57eca9f790c.zip\"},\n                {\"GV601VV\", \"14449-QZS5FH-6a7771cbbf9bcc641a5418f250ef3b43.zip\"},\n                {\"GX_Series\", \"2171-LHV7R6-bf1d918fd26714f10c3f3de990e30a1b.zip\"},\n                {\"GX501GI\", \"66-U9BQN2-9a12abd42e07169ec6ebf4d4a6d2c148.zip\"},\n                {\"GX502LWS\", \"3552-YRITSK-6f08012703e7718be25477f20ccd4d7e.zip\"},\n                {\"GX502LXS\", \"3553-3ACO9T-20757861512ff920da316c949249b62d.zip\"},\n                {\"GX531GM\", \"67-ER25S2-71ec74e4e8d14fc9c6cc8608d1616e5f.zip\"},\n                {\"GX531GS\", \"68-V9PHXL-3cabb33363337795287458e3b10114f8.zip\"},\n                {\"GX531GV\", \"108-VCV90K-00cec46bd49df326109c060367eaa57c.zip\"},\n                {\"GX531GW\", \"109-0GH5PV-ce1ff55527d5da0b547df776af887276.zip\"},\n                {\"GX531GX\", \"110-A0TZ36-4cf1c1cdeee6e0e27567e317444c62cb.zip\"},\n                {\"GX550LWS\", \"3671-DEEX56-d93255f509e16f740c71e8c358e8ff36.zip\"},\n                {\"GX550LXS\", \"3672-O3V2FT-6572c1aa661e3f406ce6e840075d81ab.zip\"},\n                {\"GX551QM\", \"8108-47QAG6-7d57f542a91fca797f6bad910af5b864.zip\"},\n                {\"GX551QR\", \"8109-ADSI6K-87224022e84f6a6c0ed2820cc4642a66.zip\"},\n                {\"GX551QS\", \"8110-NLPALF-6ec9938f67229be071cdb8c436303734.zip\"},\n                {\"GX650PI\", \"14591-ODJA1G-23aaf98034a279ae87f93f67db9b3b95.zip\"},\n                {\"GX650PU\", \"14592-A6IJIM-e847943987f3cf4f1d0278fe1d5ee984.zip\"},\n                {\"GX650PV\", \"14595-XKP10A-e14bb5df924255dc965bb975e1d64434.zip\"},\n                {\"GX650PY\", \"14593-KC9ZMM-6e519dbcdd0139ed1d8e7649e407d8a8.zip\"},\n                {\"GX650PZ\", \"14594-AETGOJ-4ba96caa5ae0ee68d8b457e0fbc03a17.zip\"},\n                {\"GX650RM\", \"34896-YFMU1L-4853b30e2cee17b06a8f5aab60b50d7b.zip\"},\n                {\"GX650RS\", \"34897-NAC55T-ddb77920692114eb95b3b95ccbc6773e.zip\"},\n                {\"GX650RW\", \"34898-UT9USZ-989bc43d4b45a8f69da8154b3873bc0e.zip\"},\n                {\"GX650RX\", \"34899-PNRB1M-a929aabb6428cd238713da872723ec0b.zip\"},\n                {\"GX701GV\", \"166-EI8VY0-1568b74c5bbf22297720b548ce6bcefa.zip\"},\n                {\"GX701GW\", \"165-C6KON3-9b95db9f024e457420793b4915749fbd.zip\"},\n                {\"GX701GX\", \"164-I4CRXM-b5e8ddc68c884eda5cf4676dd2683624.zip\"},\n                {\"GX701LV\", \"3309-DPFMBZ-ffda0b00117a5f1c69a091158b631bbe.zip\"},\n                {\"GX701LWS\", \"3308-PQVG48-ad364af358f946382f840c969c73d49b.zip\"},\n                {\"GX701LXS\", \"3307-AY5DMD-681ac8295b6f98fda4c66b891f19be4d.zip\"},\n                {\"GX703HM\", \"7962-KBDQY2-ff82594ee47f5c1058bc2115b6a74841.zip\"},\n                {\"GX703HMD\", \"7963-A3TM3L-5f39a856e3f694e9db1ed5a5410baa39.zip\"},\n                {\"GX703HR\", \"7967-5LQ4FV-7b6af6e1dc3a6c0786bec0ec084ee5c2.zip\"},\n                {\"GX703HRD\", \"7964-TFYJ6L-4bec23647da2f9bc8403d060635dbdda.zip\"},\n                {\"GX703HS\", \"7965-3HSRRO-c1869c30564e2db44a97c1e8953093b9.zip\"},\n                {\"GX703HSD\", \"7966-9CCDGL-96f0c0f9e1e50ee66894e7b168e59cc3.zip\"},\n                {\"GZ_Series\", \"2172-Z8OHBD-393c5060aaa27883e2fcbebc7e53997e.zip\"},\n                {\"GZ301VF\", \"13604-50UADT-4df87ac6eab6ac261647875d727db9d4.zip\"},\n                {\"GZ301VFC\", \"13787-WB73LI-b148b7cf3c90bc90fca4938bfc6fbbe5.zip\"},\n                {\"GZ301VI\", \"13601-DPC6YI-17ac748ec814ec3152ad973f3a0cff4b.zip\"},\n                {\"GZ301VIC\", \"13790-Z6V8RW-7a4f735f65c545158c7ba715694aa3c7.zip\"},\n                {\"GZ301VJ\", \"13600-UNQHZ7-e7d0cbf757eeed28dba9295b517ef835.zip\"},\n                {\"GZ301VJC\", \"13788-QVWJWQ-a13027f81094f94eea1d86152fe69ba9.zip\"},\n                {\"GZ301VQ\", \"13789-K6I7SO-4a8594363610c383e39940ff135c0d7e.zip\"},\n                {\"GZ301VQC\", \"13791-DBRKCU-a10ec3e290c5dc93bbb45f52c714a9b8.zip\"},\n                {\"GZ301VU\", \"13602-6JQ2BK-4353d6c0b83589477ff4570b49258217.zip\"},\n                {\"GZ301VUC\", \"13792-009F1L-4ee6b0014eca72c7d0217219ebe9e365.zip\"},\n                {\"GZ301VV\", \"13603-OOLT27-8788c068fdad2a64da9925a5411b30af.zip\"},\n                {\"GZ301VVC\", \"13793-8DIIWY-72aca4ea0f1db6c991b3e24da5a7907c.zip\"},\n                {\"GZ301ZA\", \"10139-YXT5A7-521746c1b4991657abc37999a318219e.zip\"},\n                {\"GZ301ZC\", \"10140-QA59M0-be0cf751aba85c98832f4a0f16456330.zip\"},\n                {\"GZ301ZE\", \"10141-P1OXLB-318b5c3601e0d5c55d3b4307eba08ab2.zip\"},\n                {\"GZ301ZH\", \"10142-ELMX6M-f9c50110ca0a763bf4b6d1e9dd9e3afa.zip\"},\n                {\"GZ302EA\", \"21590-GQ959N-152f6838ae23ac9c30f05737f86505c7.zip\"},\n                {\"NR2301L\", \"14736-3DM4T5-41c1b0b5c2d726da7c66e0c39ea08017.zip\"},\n                {\"RC71L\", \"17126-IIDPFS-718c077a118724bb0045b35e30d5ac4e.zip\"},\n                {\"RC71X\", \"15182-KWVC62-c754d9ea39f9160df7e21e4538ce60df.zip\"},\n                {\"RC72LA\", \"19770-DOSUSI-85f700513af330af6e20fcfdabaeb87f.zip\"},\n                {\"RC73XA\", \"22912-04WYQN-fdd641029ab74a51bbbf037ea04713be.zip\"},\n                {\"RC73YA\", \"22913-BDOXY4-aff9d8707fceedbf6cc35cb570fc27b5.zip\"}\n            };\n\n            if (profiles.ContainsKey(model))\n            {\n                return baseUrl + profiles[model];\n            }\n            else\n            {\n                return null;\n            }\n        }\n\n        public static bool ProfileExists()\n        {\n            (string bios, string model) = AppConfig.GetBiosAndModel();\n            if (model is null) return false;\n            return (GetProfileUrl(model) is not null);\n        }\n\n        public static async Task InstallProfile()\n        {\n            ProcessHelper.RunAsAdmin(\"colors\");\n\n            (string bios, string model) = AppConfig.GetBiosAndModel();\n            string? profileUrl = GetProfileUrl(model);\n\n            if (profileUrl == null)\n            {\n                Logger.WriteLine($\"No ICC Profile found for {model}\");\n                return;\n            }\n\n            await DownloadAndExtractZip(profileUrl, VisualControl.GetGameVisualPath());\n        }\n\n        static async Task DownloadAndExtractZip(string zipUrl, string extractPath)\n        {\n            using (HttpClient client = new HttpClient())\n            {\n                try\n                {\n                    Logger.WriteLine($\"Getting: {zipUrl}\");\n                    byte[] zipData = await client.GetByteArrayAsync(zipUrl);\n\n                    Directory.CreateDirectory(extractPath);\n\n                    string tempZipPath = Path.Combine(extractPath, \"temp.zip\");\n                    await File.WriteAllBytesAsync(tempZipPath, zipData);\n\n                    ZipFile.ExtractToDirectory(tempZipPath, extractPath, true);\n\n                    File.Delete(tempZipPath);\n                }\n                catch (Exception ex)\n                {\n                    Logger.WriteLine($\"Error: {ex.Message}\");\n                }\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "app/Display/DisplayGammaRamp.cs",
    "content": "﻿namespace GHelper.Display\n{\n\n    public class DisplayGammaRamp\n    {\n\n        public DisplayGammaRamp(ushort[] red, ushort[] green, ushort[] blue)\n        {\n            if (red?.Length != GammaRamp.DataPoints)\n            {\n                throw new ArgumentOutOfRangeException(nameof(red));\n            }\n\n            if (green?.Length != GammaRamp.DataPoints)\n            {\n                throw new ArgumentOutOfRangeException(nameof(green));\n            }\n\n            if (blue?.Length != GammaRamp.DataPoints)\n            {\n                throw new ArgumentOutOfRangeException(nameof(blue));\n            }\n\n            Red = red;\n            Green = green;\n            Blue = blue;\n        }\n\n        public DisplayGammaRamp(double brightness = 1, double contrast = 1, double gamma = 1)\n            : this(\n                CalculateLUT(brightness, contrast, gamma),\n                CalculateLUT(brightness, contrast, gamma),\n                CalculateLUT(brightness, contrast, gamma)\n            )\n        {\n        }\n\n        public DisplayGammaRamp(\n            double redBrightness,\n            double redContrast,\n            double redGamma,\n            double greenBrightness,\n            double greenContrast,\n            double greenGamma,\n            double blueBrightness,\n            double blueContrast,\n            double blueGamma\n        )\n            : this(\n                CalculateLUT(redBrightness, redContrast, redGamma),\n                CalculateLUT(greenBrightness, greenContrast, greenGamma),\n                CalculateLUT(blueBrightness, blueContrast, blueGamma)\n            )\n        {\n        }\n\n        internal DisplayGammaRamp(GammaRamp ramp) :\n            this(ramp.Red, ramp.Green, ramp.Blue)\n        {\n        }\n        public ushort[] Blue { get; }\n        public ushort[] Green { get; }\n        public ushort[] Red { get; }\n        private static ushort[] CalculateLUT(double brightness, double contrast, double gamma)\n        {\n            brightness = 0.5 + brightness / 2;\n            var result = new ushort[GammaRamp.DataPoints];\n            for (var i = 0; i < result.Length; i++)\n            {\n                result[i] = (ushort)(brightness * ushort.MaxValue * i / (float)(result.Length - 1));\n            }\n            return result;\n        }\n\n        public bool IsOriginal()\n        {\n            int MaxRed = Red[Red.Length - 1];\n            int MaxGreen = Green[Green.Length - 1];\n            int MaxBlue = Blue[Blue.Length - 1];\n            return (Math.Abs((MaxRed + MaxGreen + MaxBlue) / 3 - ushort.MaxValue) < 256);\n        }\n\n        private static ushort[] Brightness(ushort[] data, double brightness)\n        {\n            var result = new ushort[GammaRamp.DataPoints];\n            for (var i = 0; i < result.Length; i++)\n            {\n                if (brightness < 0.5)\n                    result[i] = (ushort)(0.5 * ushort.MaxValue * Math.Pow((float)i/(result.Length - 1),  2 - brightness*2));\n                else\n                    result[i] = (ushort)(data[i] * brightness);\n            }\n            return result;\n        }\n\n        internal GammaRamp AsBrightnessRamp(double brightness)\n        {\n            return new GammaRamp(\n                Brightness(Red, brightness),\n                Brightness(Green, brightness),\n                Brightness(Blue, brightness)\n            );\n        }\n\n        internal GammaRamp AsRamp()\n        {\n            return new GammaRamp(Red, Green, Blue);\n        }\n\n\n    }\n}"
  },
  {
    "path": "app/Display/GammaRamp.cs",
    "content": "﻿using System.Runtime.InteropServices;\n\nnamespace GHelper.Display\n{\n\n    [StructLayout(LayoutKind.Sequential)]\n    internal struct GammaRamp\n    {\n        public const int DataPoints = 256;\n\n        [MarshalAs(UnmanagedType.ByValArray, SizeConst = DataPoints)]\n        public readonly ushort[] Red;\n        [MarshalAs(UnmanagedType.ByValArray, SizeConst = DataPoints)]\n        public readonly ushort[] Green;\n        [MarshalAs(UnmanagedType.ByValArray, SizeConst = DataPoints)]\n        public readonly ushort[] Blue;\n\n        public GammaRamp(ushort[] red, ushort[] green, ushort[] blue)\n        {\n            if (red == null)\n            {\n                throw new ArgumentNullException(nameof(red));\n            }\n\n            if (green == null)\n            {\n                throw new ArgumentNullException(nameof(green));\n            }\n\n            if (blue == null)\n            {\n                throw new ArgumentNullException(nameof(blue));\n            }\n\n            if (red.Length != DataPoints)\n            {\n                throw new ArgumentOutOfRangeException(nameof(red));\n            }\n\n            if (green.Length != DataPoints)\n            {\n                throw new ArgumentOutOfRangeException(nameof(green));\n            }\n\n            if (blue.Length != DataPoints)\n            {\n                throw new ArgumentOutOfRangeException(nameof(blue));\n            }\n\n            Red = red;\n            Green = green;\n            Blue = blue;\n        }\n    }\n\n}"
  },
  {
    "path": "app/Display/ScreenBrightness.cs",
    "content": "﻿namespace GHelper.Display\n{\n    using System;\n    using System.Diagnostics;\n    using System.Management;\n\n    public static class ScreenBrightness\n    {\n        public static int Get()\n        {\n            using var mclass = new ManagementClass(\"WmiMonitorBrightness\")\n            {\n                Scope = new ManagementScope(@\"\\\\.\\root\\wmi\")\n            };\n            using var instances = mclass.GetInstances();\n            foreach (ManagementObject instance in instances)\n            {\n                return (byte)instance.GetPropertyValue(\"CurrentBrightness\");\n            }\n            return 0;\n        }\n\n        public static void Set(int brightness)\n        {\n            using var mclass = new ManagementClass(\"WmiMonitorBrightnessMethods\")\n            {\n                Scope = new ManagementScope(@\"\\\\.\\root\\wmi\")\n            };\n            using var instances = mclass.GetInstances();\n            var args = new object[] { 1, brightness };\n            foreach (ManagementObject instance in instances)\n            {\n                instance.InvokeMethod(\"WmiSetBrightness\", args);\n            }\n        }\n\n        public static int Adjust(int delta)\n        {\n            int brightness = Get();\n            Debug.WriteLine(brightness);\n            brightness = Math.Min(100, Math.Max(0, brightness + delta));\n            Set(brightness);\n            return brightness;\n        }\n\n    }\n}\n"
  },
  {
    "path": "app/Display/ScreenCCD.cs",
    "content": "﻿using System.ComponentModel;\nusing System.Runtime.InteropServices;\n\nnamespace GHelper.Display\n{\n    public class ScreenCCD\n    {\n\n        public static bool GetHDRStatus(bool log = true)\n        {\n            var err = GetDisplayConfigBufferSizes(QDC.QDC_ONLY_ACTIVE_PATHS, out var pathCount, out var modeCount);\n            if (err != 0)\n                throw new Win32Exception(err);\n\n            var paths = new DISPLAYCONFIG_PATH_INFO[pathCount];\n            var modes = new DISPLAYCONFIG_MODE_INFO[modeCount];\n            err = QueryDisplayConfig(QDC.QDC_ONLY_ACTIVE_PATHS, ref pathCount, paths, ref modeCount, modes, IntPtr.Zero);\n            if (err != 0)\n            {\n                Logger.WriteLine(\"HDR Detection Error: \" + new Win32Exception(err).Message);\n                return false;\n            }\n\n            string internalName = AppConfig.GetString(\"internal_display\");\n\n            foreach (var path in paths)\n            {\n                // get display name\n                var info = new DISPLAYCONFIG_TARGET_DEVICE_NAME();\n                info.header.type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME;\n                info.header.size = Marshal.SizeOf<DISPLAYCONFIG_TARGET_DEVICE_NAME>();\n                info.header.adapterId = path.targetInfo.adapterId;\n                info.header.id = path.targetInfo.id;\n                err = DisplayConfigGetDeviceInfo(ref info);\n                if (err != 0)\n                    throw new Win32Exception(err);\n\n                var colorInfo = new DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO();\n                colorInfo.header.type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_ADVANCED_COLOR_INFO;\n                colorInfo.header.size = Marshal.SizeOf<DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO>();\n                colorInfo.header.adapterId = path.targetInfo.adapterId;\n                colorInfo.header.id = path.targetInfo.id;\n                err = DisplayConfigGetDeviceInfo(ref colorInfo);\n                if (err != 0)\n                    throw new Win32Exception(err);\n\n\n                if (info.outputTechnology == DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY.DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL ||\n                    info.outputTechnology == DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY.DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED ||\n                    info.monitorFriendlyDeviceName == internalName)\n                {\n                    if (log) Logger.WriteLine(info.monitorFriendlyDeviceName + \" HDR: \" + colorInfo.advancedColorEnabled + \" \" + colorInfo.bitsPerColorChannel + \" \" + colorInfo.value + \" \" + colorInfo.wideColorEnforced);\n                    return colorInfo.advancedColorEnabled && (colorInfo.bitsPerColorChannel > 8 || !colorInfo.wideColorEnforced);\n                }\n\n            }\n\n            return false;\n\n        }\n\n        private enum DISPLAYCONFIG_DEVICE_INFO_TYPE\n        {\n            DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME = 1,\n            DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME = 2,\n            DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE = 3,\n            DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME = 4,\n            DISPLAYCONFIG_DEVICE_INFO_SET_TARGET_PERSISTENCE = 5,\n            DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_BASE_TYPE = 6,\n            DISPLAYCONFIG_DEVICE_INFO_GET_SUPPORT_VIRTUAL_RESOLUTION = 7,\n            DISPLAYCONFIG_DEVICE_INFO_SET_SUPPORT_VIRTUAL_RESOLUTION = 8,\n            DISPLAYCONFIG_DEVICE_INFO_GET_ADVANCED_COLOR_INFO = 9,\n            DISPLAYCONFIG_DEVICE_INFO_SET_ADVANCED_COLOR_STATE = 10,\n            DISPLAYCONFIG_DEVICE_INFO_GET_SDR_WHITE_LEVEL = 11,\n        }\n\n        private enum DISPLAYCONFIG_COLOR_ENCODING\n        {\n            DISPLAYCONFIG_COLOR_ENCODING_RGB = 0,\n            DISPLAYCONFIG_COLOR_ENCODING_YCBCR444 = 1,\n            DISPLAYCONFIG_COLOR_ENCODING_YCBCR422 = 2,\n            DISPLAYCONFIG_COLOR_ENCODING_YCBCR420 = 3,\n            DISPLAYCONFIG_COLOR_ENCODING_INTENSITY = 4,\n        }\n\n        private enum DISPLAYCONFIG_SCALING\n        {\n            DISPLAYCONFIG_SCALING_IDENTITY = 1,\n            DISPLAYCONFIG_SCALING_CENTERED = 2,\n            DISPLAYCONFIG_SCALING_STRETCHED = 3,\n            DISPLAYCONFIG_SCALING_ASPECTRATIOCENTEREDMAX = 4,\n            DISPLAYCONFIG_SCALING_CUSTOM = 5,\n            DISPLAYCONFIG_SCALING_PREFERRED = 128,\n        }\n\n        private enum DISPLAYCONFIG_ROTATION\n        {\n            DISPLAYCONFIG_ROTATION_IDENTITY = 1,\n            DISPLAYCONFIG_ROTATION_ROTATE90 = 2,\n            DISPLAYCONFIG_ROTATION_ROTATE180 = 3,\n        }\n\n        private enum DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY\n        {\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER = -1,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HD15 = 0,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SVIDEO = 1,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPOSITE_VIDEO = 2,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPONENT_VIDEO = 3,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DVI = 4,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HDMI = 5,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_LVDS = 6,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_D_JPN = 8,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDI = 9,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EXTERNAL = 10,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED = 11,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EXTERNAL = 12,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EMBEDDED = 13,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDTVDONGLE = 14,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_MIRACAST = 15,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INDIRECT_WIRED = 16,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INDIRECT_VIRTUAL = 17,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL = unchecked((int)0x80000000),\n        }\n\n        private enum DISPLAYCONFIG_TOPOLOGY_ID\n        {\n            DISPLAYCONFIG_TOPOLOGY_INTERNAL = 0x00000001,\n            DISPLAYCONFIG_TOPOLOGY_CLONE = 0x00000002,\n            DISPLAYCONFIG_TOPOLOGY_EXTEND = 0x00000004,\n            DISPLAYCONFIG_TOPOLOGY_EXTERNAL = 0x00000008,\n        }\n\n        private enum DISPLAYCONFIG_PATH\n        {\n            DISPLAYCONFIG_PATH_ACTIVE = 0x00000001,\n            DISPLAYCONFIG_PATH_PREFERRED_UNSCALED = 0x00000004,\n            DISPLAYCONFIG_PATH_SUPPORT_VIRTUAL_MODE = 0x00000008,\n        }\n\n        private enum DISPLAYCONFIG_SOURCE_FLAGS\n        {\n            DISPLAYCONFIG_SOURCE_IN_USE = 0x00000001,\n        }\n\n        private enum DISPLAYCONFIG_TARGET_FLAGS\n        {\n            DISPLAYCONFIG_TARGET_IN_USE = 0x00000001,\n            DISPLAYCONFIG_TARGET_FORCIBLE = 0x00000002,\n            DISPLAYCONFIG_TARGET_FORCED_AVAILABILITY_BOOT = 0x00000004,\n            DISPLAYCONFIG_TARGET_FORCED_AVAILABILITY_PATH = 0x00000008,\n            DISPLAYCONFIG_TARGET_FORCED_AVAILABILITY_SYSTEM = 0x00000010,\n            DISPLAYCONFIG_TARGET_IS_HMD = 0x00000020,\n        }\n\n        private enum QDC\n        {\n            QDC_ALL_PATHS = 0x00000001,\n            QDC_ONLY_ACTIVE_PATHS = 0x00000002,\n            QDC_DATABASE_CURRENT = 0x00000004,\n            QDC_VIRTUAL_MODE_AWARE = 0x00000010,\n            QDC_INCLUDE_HMD = 0x00000020,\n        }\n\n        private enum DISPLAYCONFIG_SCANLINE_ORDERING\n        {\n            DISPLAYCONFIG_SCANLINE_ORDERING_UNSPECIFIED = 0,\n            DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE = 1,\n            DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED = 2,\n            DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_UPPERFIELDFIRST = DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED,\n            DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_LOWERFIELDFIRST = 3,\n        }\n\n        private enum DISPLAYCONFIG_PIXELFORMAT\n        {\n            DISPLAYCONFIG_PIXELFORMAT_8BPP = 1,\n            DISPLAYCONFIG_PIXELFORMAT_16BPP = 2,\n            DISPLAYCONFIG_PIXELFORMAT_24BPP = 3,\n            DISPLAYCONFIG_PIXELFORMAT_32BPP = 4,\n            DISPLAYCONFIG_PIXELFORMAT_NONGDI = 5,\n        }\n\n        private enum DISPLAYCONFIG_MODE_INFO_TYPE\n        {\n            DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE = 1,\n            DISPLAYCONFIG_MODE_INFO_TYPE_TARGET = 2,\n            DISPLAYCONFIG_MODE_INFO_TYPE_DESKTOP_IMAGE = 3,\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        private struct DISPLAYCONFIG_DEVICE_INFO_HEADER\n        {\n            public DISPLAYCONFIG_DEVICE_INFO_TYPE type;\n            public int size;\n            public LUID adapterId;\n            public uint id;\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        private struct DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO\n        {\n            public DISPLAYCONFIG_DEVICE_INFO_HEADER header;\n            public uint value;\n            public DISPLAYCONFIG_COLOR_ENCODING colorEncoding;\n            public int bitsPerColorChannel;\n\n            public bool advancedColorSupported => (value & 0x1) == 0x1;\n            public bool advancedColorEnabled => (value & 0x2) == 0x2;\n            public bool wideColorEnforced => (value & 0x4) == 0x4;\n            public bool advancedColorForceDisabled => (value & 0x8) == 0x8;\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        private struct POINTL\n        {\n            public int x;\n            public int y;\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        private struct LUID\n        {\n            public uint LowPart;\n            public int HighPart;\n\n            public long Value => ((long)HighPart << 32) | LowPart;\n            public override string ToString() => Value.ToString();\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        private struct DISPLAYCONFIG_SOURCE_MODE\n        {\n            public uint width;\n            public uint height;\n            public DISPLAYCONFIG_PIXELFORMAT pixelFormat;\n            public POINTL position;\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        private struct DISPLAYCONFIG_RATIONAL\n        {\n            public uint Numerator;\n            public uint Denominator;\n\n            public override string ToString() => Numerator + \" / \" + Denominator;\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        private struct DISPLAYCONFIG_2DREGION\n        {\n            public uint cx;\n            public uint cy;\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        private struct DISPLAYCONFIG_DESKTOP_IMAGE_INFO\n        {\n            public POINTL PathSourceSize;\n            public RECT DesktopImageRegion;\n            public RECT DesktopImageClip;\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        private struct DISPLAYCONFIG_VIDEO_SIGNAL_INFO\n        {\n            public ulong pixelRate;\n            public DISPLAYCONFIG_RATIONAL hSyncFreq;\n            public DISPLAYCONFIG_RATIONAL vSyncFreq;\n            public DISPLAYCONFIG_2DREGION activeSize;\n            public DISPLAYCONFIG_2DREGION totalSize;\n            public uint videoStandard;\n            public DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        private struct DISPLAYCONFIG_TARGET_MODE\n        {\n            public DISPLAYCONFIG_VIDEO_SIGNAL_INFO targetVideoSignalInfo;\n        }\n\n        [StructLayout(LayoutKind.Explicit)]\n        private struct DISPLAYCONFIG_MODE_INFO_union\n        {\n            [FieldOffset(0)]\n            public DISPLAYCONFIG_TARGET_MODE targetMode;\n\n            [FieldOffset(0)]\n            public DISPLAYCONFIG_SOURCE_MODE sourceMode;\n\n            [FieldOffset(0)]\n            public DISPLAYCONFIG_DESKTOP_IMAGE_INFO desktopImageInfo;\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        private struct DISPLAYCONFIG_PATH_SOURCE_INFO\n        {\n            public LUID adapterId;\n            public uint id;\n            public uint modeInfoIdx;\n            public DISPLAYCONFIG_SOURCE_FLAGS statusFlags;\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        private struct DISPLAYCONFIG_PATH_TARGET_INFO\n        {\n            public LUID adapterId;\n            public uint id;\n            public uint modeInfoIdx;\n            public DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology;\n            public DISPLAYCONFIG_ROTATION rotation;\n            public DISPLAYCONFIG_SCALING scaling;\n            public DISPLAYCONFIG_RATIONAL refreshRate;\n            public DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;\n            public bool targetAvailable;\n            public DISPLAYCONFIG_TARGET_FLAGS statusFlags;\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        private struct DISPLAYCONFIG_PATH_INFO\n        {\n            public DISPLAYCONFIG_PATH_SOURCE_INFO sourceInfo;\n            public DISPLAYCONFIG_PATH_TARGET_INFO targetInfo;\n            public DISPLAYCONFIG_PATH flags;\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        private struct DISPLAYCONFIG_MODE_INFO\n        {\n            public DISPLAYCONFIG_MODE_INFO_TYPE infoType;\n            public uint id;\n            public LUID adapterId;\n            public DISPLAYCONFIG_MODE_INFO_union info;\n        }\n\n        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]\n        private struct DISPLAYCONFIG_SOURCE_DEVICE_NAME\n        {\n            public DISPLAYCONFIG_DEVICE_INFO_HEADER header;\n            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]\n            public string viewGdiDeviceName;\n        }\n\n        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]\n        private struct DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS\n        {\n            public uint value;\n        }\n\n        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]\n        private struct DISPLAYCONFIG_TARGET_DEVICE_NAME\n        {\n            public DISPLAYCONFIG_DEVICE_INFO_HEADER header;\n            public DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS flags;\n            public DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology;\n            public ushort edidManufactureId;\n            public ushort edidProductCodeId;\n            public uint connectorInstance;\n            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]\n            public string monitorFriendlyDeviceName;\n            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]\n            public string monitorDevicePat;\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        private struct RECT\n        {\n            public int left;\n            public int top;\n            public int right;\n            public int bottom;\n        }\n\n        [DllImport(\"user32\")]\n        private static extern int GetDisplayConfigBufferSizes(QDC flags, out int numPathArrayElements, out int numModeInfoArrayElements);\n\n        [DllImport(\"user32\")]\n        private static extern int QueryDisplayConfig(QDC flags, ref int numPathArrayElements, [In, Out] DISPLAYCONFIG_PATH_INFO[] pathArray, ref int numModeInfoArrayElements, [In, Out] DISPLAYCONFIG_MODE_INFO[] modeInfoArray, out DISPLAYCONFIG_TOPOLOGY_ID currentTopologyId);\n\n        [DllImport(\"user32\")]\n        private static extern int QueryDisplayConfig(QDC flags, ref int numPathArrayElements, [In, Out] DISPLAYCONFIG_PATH_INFO[] pathArray, ref int numModeInfoArrayElements, [In, Out] DISPLAYCONFIG_MODE_INFO[] modeInfoArray, IntPtr currentTopologyId);\n\n        [DllImport(\"user32\")]\n        private static extern int DisplayConfigGetDeviceInfo(ref DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO requestPacket);\n\n        [DllImport(\"user32\")]\n        private static extern int DisplayConfigGetDeviceInfo(ref DISPLAYCONFIG_SOURCE_DEVICE_NAME requestPacket);\n\n        [DllImport(\"user32\")]\n        private static extern int DisplayConfigGetDeviceInfo(ref DISPLAYCONFIG_TARGET_DEVICE_NAME requestPacket);\n    }\n}\n"
  },
  {
    "path": "app/Display/ScreenControl.cs",
    "content": "﻿using System.Diagnostics;\n\nnamespace GHelper.Display\n{\n    public static class ScreenControl\n    {\n\n        public const int MAX_REFRESH = 1000;\n        public static int MIN_RATE = AppConfig.Get(\"min_rate\", 60);\n        public static int MAX_RATE = AppConfig.Get(\"max_rate\");\n\n        public static int GetMaxRate(string? laptopScreen)\n        {\n            if (MAX_RATE > 0) return MAX_RATE;\n            else return ScreenNative.GetMaxRefreshRate(laptopScreen);\n        }\n\n        public static void AutoScreen(bool force = false)\n        {\n            if (force || AppConfig.Is(\"screen_auto\"))\n            {\n                if (SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online)\n                    SetScreen(MAX_REFRESH, 1);\n                else\n                    SetScreen(MIN_RATE, 0);\n            }\n            else\n            {\n                SetScreen(overdrive: AppConfig.Get(\"overdrive\"));\n            }\n        }\n\n        public static void ToggleScreenRate()\n        {\n            var laptopScreen = ScreenNative.FindLaptopScreen(true);\n            var refreshRate = ScreenNative.GetRefreshRate(laptopScreen);\n            if (refreshRate < 0) return;\n\n            ScreenNative.SetRefreshRate(laptopScreen, refreshRate > MIN_RATE ? MIN_RATE : GetMaxRate(laptopScreen));\n            InitScreen();\n        }\n\n\n        public static void SetScreen(int frequency = -1, int overdrive = -1, int miniled = -1)\n        {\n            var laptopScreen = ScreenNative.FindLaptopScreen(true);\n            var refreshRate = ScreenNative.GetRefreshRate(laptopScreen);\n\n            if (refreshRate < 0) return;\n\n            if (frequency >= MAX_REFRESH)\n            {\n                frequency = GetMaxRate(laptopScreen);\n            }\n\n            if (frequency > 0 && frequency != refreshRate)\n            {\n                ScreenNative.SetRefreshRate(laptopScreen, frequency);\n            }\n\n            if (Program.acpi.IsOverdriveSupported() && overdrive >= 0)\n            {\n                if (AppConfig.IsNoOverdrive()) overdrive = 0;\n                if (overdrive != Program.acpi.DeviceGet(AsusACPI.ScreenOverdrive))\n                {\n                    Program.acpi.DeviceSet(AsusACPI.ScreenOverdrive, overdrive, \"ScreenOverdrive\");\n                }\n            }\n\n            SetMiniled(miniled);\n\n            InitScreen();\n        }\n\n        public static void SetMiniled(int miniled = -1)\n        {\n            if (miniled >= 0)\n            {\n                if (Program.acpi.DeviceGet(AsusACPI.ScreenMiniled1) >= 0)\n                    Program.acpi.DeviceSet(AsusACPI.ScreenMiniled1, miniled, \"Miniled1\");\n                else\n                {\n                    Program.acpi.DeviceSet(AsusACPI.ScreenMiniled2, miniled, \"Miniled2\");\n                    Thread.Sleep(100);\n                }\n            }\n        }\n\n        public static void InitMiniled()\n        {\n            if (AppConfig.IsForceMiniled())\n            {\n                SetMiniled(AppConfig.Get(\"miniled\"));\n                SetHDRControl(AppConfig.Get(\"hdr_control\"));\n            }\n        }\n\n        public static void InitOptimalBrightness()\n        {\n            int optimalBrightness = AppConfig.Get(\"optimal_brightness\");\n            if (optimalBrightness >= 0) SetOptimalBrightness(optimalBrightness);\n        }\n\n        public static void SetOptimalBrightness(int status)\n        {\n            AppConfig.Set(\"optimal_brightness\", status);\n            if (status == 2) status = SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Offline ? 1 : 0;\n            Program.acpi.DeviceSet(AsusACPI.ScreenOptimalBrightness, status, \"Optimal Brightness\");\n        }\n\n        public static int GetOptimalBrightness()\n        {\n            return Program.acpi.DeviceGet(AsusACPI.ScreenOptimalBrightness);\n        }\n\n        public static void ToogleFHD()\n        {\n            int fhd = Program.acpi.DeviceGet(AsusACPI.ScreenFHD);\n            Logger.WriteLine($\"FHD Toggle: {fhd}\");\n\n            DialogResult dialogResult = MessageBox.Show(\"Changing display mode requires reboot\", Properties.Strings.AlertUltimateTitle, MessageBoxButtons.YesNo);\n            if (dialogResult == DialogResult.Yes)\n            {\n                Program.acpi.DeviceSet(AsusACPI.ScreenFHD, (fhd == 1) ? 0 : 1, \"FHD\");\n                Process.Start(\"shutdown\", \"/r /t 1\");\n            }\n        }\n\n        public static void SetHDRControl(int status = -1)\n        {\n            if (status >= 0)\n            {\n                AppConfig.Set(\"hdr_control\", status);\n                Program.acpi.DeviceSet(AsusACPI.ScreenHDRControl, status, \"HDR Control\");\n            }\n        }\n\n        public static void ToogleHDRControl()\n        {\n            int hdrControl = Program.acpi.DeviceGet(AsusACPI.ScreenHDRControl);\n            Logger.WriteLine($\"HDR Control Toggle: {hdrControl}\");\n            SetHDRControl((hdrControl == 1) ? 1 : 0);\n            Thread.Sleep(200);\n            InitScreen();\n        }\n\n        public static string ToogleMiniled()\n        {\n            int miniled1 = Program.acpi.DeviceGet(AsusACPI.ScreenMiniled1);\n            int miniled2 = Program.acpi.DeviceGet(AsusACPI.ScreenMiniled2);\n\n            Logger.WriteLine($\"MiniledToggle: {miniled1} {miniled2}\");\n\n            int miniled;\n            string name;\n\n            if (miniled1 >= 0)\n            {\n                switch (miniled1)\n                {\n                    case 1: \n                        miniled = 0;\n                        name = Properties.Strings.OneZone;\n                        break;\n                    default:\n                        miniled = 1;\n                        name = Properties.Strings.Multizone;\n                        break;\n                }\n            }\n            else\n            {\n                switch (miniled2)\n                {\n                    case 1: \n                        miniled = 2;\n                        name = Properties.Strings.OneZone;\n                        break;\n                    case 2: \n                        miniled = 0;\n                        name = Properties.Strings.Multizone;\n                        break;\n                    default: \n                        miniled = 1;\n                        name = Properties.Strings.MultizoneStrong;\n                        break;\n                }\n            }\n\n            AppConfig.Set(\"miniled\", miniled);\n            SetScreen(miniled: miniled);\n            \n            return name;\n        }\n\n        public static void InitScreen()\n        {\n            var laptopScreen = ScreenNative.FindLaptopScreen();\n            int frequency = ScreenNative.GetRefreshRate(laptopScreen);\n            int maxFrequency = GetMaxRate(laptopScreen);\n\n            if (maxFrequency > 0) AppConfig.Set(\"max_frequency\", maxFrequency);\n            else maxFrequency = AppConfig.Get(\"max_frequency\");\n\n            bool screenAuto = AppConfig.Is(\"screen_auto\");\n            bool overdriveSetting = Program.acpi.IsOverdriveSupported() && !AppConfig.IsNoOverdrive();\n\n            int overdrive = AppConfig.IsNoOverdrive() ? 0 : Program.acpi.DeviceGet(AsusACPI.ScreenOverdrive);\n\n            int miniled1 = Program.acpi.DeviceGet(AsusACPI.ScreenMiniled1);\n            int miniled2 = Program.acpi.DeviceGet(AsusACPI.ScreenMiniled2);\n\n            int miniled = (miniled1 >= 0) ? miniled1 : miniled2;\n            bool hdr = false;\n\n            if (miniled >= 0)\n            {\n                Logger.WriteLine($\"Miniled: {miniled1} {miniled2}\");\n                AppConfig.Set(\"miniled\", miniled);\n            }\n\n            try\n            {\n                hdr = ScreenCCD.GetHDRStatus();\n            } catch (Exception ex)\n            {\n                Logger.WriteLine(ex.Message);\n            }\n\n            bool screenEnabled = (frequency >= 0);\n\n            int fhd = -1;\n            if (AppConfig.IsDUO())\n            {\n                fhd = Program.acpi.DeviceGet(AsusACPI.ScreenFHD);\n            }\n\n            int hdrControl = Program.acpi.DeviceGet(AsusACPI.ScreenHDRControl);\n            if (hdrControl >= 0) Logger.WriteLine($\"HDR Control Status: {hdrControl}\");\n\n            AppConfig.Set(\"frequency\", frequency);\n            AppConfig.Set(\"overdrive\", overdrive);\n\n            Program.settingsForm.Invoke(delegate\n            {\n                Program.settingsForm.VisualiseScreen(\n                    screenEnabled: screenEnabled,\n                    screenAuto: screenAuto,\n                    frequency: frequency,\n                    maxFrequency: maxFrequency,\n                    overdrive: overdrive,\n                    overdriveSetting: overdriveSetting,\n                    miniled1: miniled1,\n                    miniled2: miniled2,\n                    hdr: hdr,\n                    fhd: fhd,\n                    hdrControl: hdrControl\n                );\n            });\n\n        }\n    }\n}\n"
  },
  {
    "path": "app/Display/ScreenInterrogatory.cs",
    "content": "﻿using GHelper.Helpers;\nusing NvAPIWrapper.Display;\nusing System.ComponentModel;\nusing System.Runtime.InteropServices;\n\nnamespace GHelper.Display\n{\n    public static class ScreenInterrogatory\n    {\n        public const int ERROR_SUCCESS = 0;\n\n        #region enums\n\n        public enum QUERY_DEVICE_CONFIG_FLAGS : uint\n        {\n            QDC_ALL_PATHS = 0x00000001,\n            QDC_ONLY_ACTIVE_PATHS = 0x00000002,\n            QDC_DATABASE_CURRENT = 0x00000004\n        }\n\n        public enum DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY : uint\n        {\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER = 0xFFFFFFFF,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HD15 = 0,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SVIDEO = 1,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPOSITE_VIDEO = 2,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPONENT_VIDEO = 3,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DVI = 4,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HDMI = 5,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_LVDS = 6,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_D_JPN = 8,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDI = 9,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EXTERNAL = 10,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED = 11,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EXTERNAL = 12,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EMBEDDED = 13,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDTVDONGLE = 14,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_MIRACAST = 15,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL = 0x80000000,\n            DISPLAYCONFIG_OUTPUT_TECHNOLOGY_FORCE_UINT32 = 0xFFFFFFFF\n        }\n\n        public enum DISPLAYCONFIG_SCANLINE_ORDERING : uint\n        {\n            DISPLAYCONFIG_SCANLINE_ORDERING_UNSPECIFIED = 0,\n            DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE = 1,\n            DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED = 2,\n            DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_UPPERFIELDFIRST = DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED,\n            DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_LOWERFIELDFIRST = 3,\n            DISPLAYCONFIG_SCANLINE_ORDERING_FORCE_UINT32 = 0xFFFFFFFF\n        }\n\n        public enum DISPLAYCONFIG_ROTATION : uint\n        {\n            DISPLAYCONFIG_ROTATION_IDENTITY = 1,\n            DISPLAYCONFIG_ROTATION_ROTATE90 = 2,\n            DISPLAYCONFIG_ROTATION_ROTATE180 = 3,\n            DISPLAYCONFIG_ROTATION_ROTATE270 = 4,\n            DISPLAYCONFIG_ROTATION_FORCE_UINT32 = 0xFFFFFFFF\n        }\n\n        public enum DISPLAYCONFIG_SCALING : uint\n        {\n            DISPLAYCONFIG_SCALING_IDENTITY = 1,\n            DISPLAYCONFIG_SCALING_CENTERED = 2,\n            DISPLAYCONFIG_SCALING_STRETCHED = 3,\n            DISPLAYCONFIG_SCALING_ASPECTRATIOCENTEREDMAX = 4,\n            DISPLAYCONFIG_SCALING_CUSTOM = 5,\n            DISPLAYCONFIG_SCALING_PREFERRED = 128,\n            DISPLAYCONFIG_SCALING_FORCE_UINT32 = 0xFFFFFFFF\n        }\n\n        public enum DISPLAYCONFIG_PIXELFORMAT : uint\n        {\n            DISPLAYCONFIG_PIXELFORMAT_8BPP = 1,\n            DISPLAYCONFIG_PIXELFORMAT_16BPP = 2,\n            DISPLAYCONFIG_PIXELFORMAT_24BPP = 3,\n            DISPLAYCONFIG_PIXELFORMAT_32BPP = 4,\n            DISPLAYCONFIG_PIXELFORMAT_NONGDI = 5,\n            DISPLAYCONFIG_PIXELFORMAT_FORCE_UINT32 = 0xffffffff\n        }\n\n        public enum DISPLAYCONFIG_MODE_INFO_TYPE : uint\n        {\n            DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE = 1,\n            DISPLAYCONFIG_MODE_INFO_TYPE_TARGET = 2,\n            DISPLAYCONFIG_MODE_INFO_TYPE_FORCE_UINT32 = 0xFFFFFFFF\n        }\n\n        public enum DISPLAYCONFIG_DEVICE_INFO_TYPE : uint\n        {\n            DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME = 1,\n            DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME = 2,\n            DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE = 3,\n            DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME = 4,\n            DISPLAYCONFIG_DEVICE_INFO_SET_TARGET_PERSISTENCE = 5,\n            DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_BASE_TYPE = 6,\n            DISPLAYCONFIG_DEVICE_INFO_FORCE_UINT32 = 0xFFFFFFFF\n        }\n\n        #endregion\n\n        #region structs\n\n        [StructLayout(LayoutKind.Sequential)]\n        public struct LUID\n        {\n            public uint LowPart;\n            public int HighPart;\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        public struct DISPLAYCONFIG_PATH_SOURCE_INFO\n        {\n            public LUID adapterId;\n            public uint id;\n            public uint modeInfoIdx;\n            public uint statusFlags;\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        public struct DISPLAYCONFIG_PATH_TARGET_INFO\n        {\n            public LUID adapterId;\n            public uint id;\n            public uint modeInfoIdx;\n            private DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology;\n            private DISPLAYCONFIG_ROTATION rotation;\n            private DISPLAYCONFIG_SCALING scaling;\n            private DISPLAYCONFIG_RATIONAL refreshRate;\n            private DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;\n            public bool targetAvailable;\n            public uint statusFlags;\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        public struct DISPLAYCONFIG_RATIONAL\n        {\n            public uint Numerator;\n            public uint Denominator;\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        public struct DISPLAYCONFIG_PATH_INFO\n        {\n            public DISPLAYCONFIG_PATH_SOURCE_INFO sourceInfo;\n            public DISPLAYCONFIG_PATH_TARGET_INFO targetInfo;\n            public uint flags;\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        public struct DISPLAYCONFIG_2DREGION\n        {\n            public uint cx;\n            public uint cy;\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        public struct DISPLAYCONFIG_VIDEO_SIGNAL_INFO\n        {\n            public ulong pixelRate;\n            public DISPLAYCONFIG_RATIONAL hSyncFreq;\n            public DISPLAYCONFIG_RATIONAL vSyncFreq;\n            public DISPLAYCONFIG_2DREGION activeSize;\n            public DISPLAYCONFIG_2DREGION totalSize;\n            public uint videoStandard;\n            public DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        public struct DISPLAYCONFIG_TARGET_MODE\n        {\n            public DISPLAYCONFIG_VIDEO_SIGNAL_INFO targetVideoSignalInfo;\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        public struct POINTL\n        {\n            private int x;\n            private int y;\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        public struct DISPLAYCONFIG_SOURCE_MODE\n        {\n            public uint width;\n            public uint height;\n            public DISPLAYCONFIG_PIXELFORMAT pixelFormat;\n            public POINTL position;\n        }\n\n        [StructLayout(LayoutKind.Explicit)]\n        public struct DISPLAYCONFIG_MODE_INFO_UNION\n        {\n            [FieldOffset(0)]\n            public DISPLAYCONFIG_TARGET_MODE targetMode;\n\n            [FieldOffset(0)]\n            public DISPLAYCONFIG_SOURCE_MODE sourceMode;\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        public struct DISPLAYCONFIG_MODE_INFO\n        {\n            public DISPLAYCONFIG_MODE_INFO_TYPE infoType;\n            public uint id;\n            public LUID adapterId;\n            public DISPLAYCONFIG_MODE_INFO_UNION modeInfo;\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        public struct DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS\n        {\n            public uint value;\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        public struct DISPLAYCONFIG_DEVICE_INFO_HEADER\n        {\n            public DISPLAYCONFIG_DEVICE_INFO_TYPE type;\n            public uint size;\n            public LUID adapterId;\n            public uint id;\n        }\n\n        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]\n        public struct DISPLAYCONFIG_TARGET_DEVICE_NAME\n        {\n            public DISPLAYCONFIG_DEVICE_INFO_HEADER header;\n            public DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS flags;\n            public DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology;\n            public ushort edidManufactureId;\n            public ushort edidProductCodeId;\n            public uint connectorInstance;\n\n            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]\n            public string monitorFriendlyDeviceName;\n\n            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]\n            public string monitorDevicePath;\n        }\n\n        #endregion\n\n        #region DLL-Imports\n\n        [DllImport(\"user32.dll\")]\n        public static extern int GetDisplayConfigBufferSizes(\n            QUERY_DEVICE_CONFIG_FLAGS flags, out uint numPathArrayElements, out uint numModeInfoArrayElements);\n\n        [DllImport(\"user32.dll\")]\n        public static extern int QueryDisplayConfig(\n            QUERY_DEVICE_CONFIG_FLAGS flags,\n            ref uint numPathArrayElements, [Out] DISPLAYCONFIG_PATH_INFO[] PathInfoArray,\n            ref uint numModeInfoArrayElements, [Out] DISPLAYCONFIG_MODE_INFO[] ModeInfoArray,\n            nint currentTopologyId\n            );\n\n        [DllImport(\"user32.dll\")]\n        public static extern int DisplayConfigGetDeviceInfo(ref DISPLAYCONFIG_TARGET_DEVICE_NAME deviceName);\n\n        #endregion\n\n\n        [Flags]\n        public enum DisplayDeviceStates : int\n        {\n            ATTACHED_TO_DESKTOP = 0x01,\n            PRIMARY_DEVICE = 0x04,\n            MIRRORING_DRIVER = 0x08,\n            VGA_COMPATIBLE = 0x10,\n            REMOVABLE = 0x20,\n            DISCONNECTED = 0x2000000,\n            REMOTE = 0x4000000,\n            MODESPRUNED = 0x8000000\n        }\n\n        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]\n        public struct DISPLAY_DEVICE\n        {\n            public int cb;\n\n            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]\n            public string DeviceName;\n\n            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]\n            public string DeviceString;\n\n            public DisplayDeviceStates StateFlags;\n\n            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]\n            public string DeviceID;\n\n            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]\n            public string DeviceKey;\n        }\n\n\n        [DllImport(nameof(User32), CharSet = CharSet.Unicode, SetLastError = true)]\n        public static extern bool EnumDisplayDevices(\n            string? lpDevice,\n            uint iDevNum,\n            ref DISPLAY_DEVICE lpDisplayDevice,\n            uint dwFlags);\n\n\n        private static DISPLAYCONFIG_TARGET_DEVICE_NAME DeviceName(LUID adapterId, uint targetId)\n        {\n            var deviceName = new DISPLAYCONFIG_TARGET_DEVICE_NAME\n            {\n                header =\n                {\n                    size = (uint)Marshal.SizeOf(typeof (DISPLAYCONFIG_TARGET_DEVICE_NAME)),\n                    adapterId = adapterId,\n                    id = targetId,\n                    type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME\n                }\n            };\n            var error = DisplayConfigGetDeviceInfo(ref deviceName);\n            if (error != ERROR_SUCCESS)\n                throw new Win32Exception(error);\n\n            return deviceName;\n        }\n\n        public static IEnumerable<DISPLAYCONFIG_TARGET_DEVICE_NAME> GetAllDevices()\n        {\n            uint pathCount, modeCount;\n            var error = GetDisplayConfigBufferSizes(QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS, out pathCount, out modeCount);\n            if (error != ERROR_SUCCESS)\n                throw new Win32Exception(error);\n\n            var displayPaths = new DISPLAYCONFIG_PATH_INFO[pathCount];\n            var displayModes = new DISPLAYCONFIG_MODE_INFO[modeCount];\n            error = QueryDisplayConfig(QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS,\n                ref pathCount, displayPaths, ref modeCount, displayModes, nint.Zero);\n            if (error != ERROR_SUCCESS)\n                throw new Win32Exception(error);\n\n            for (var i = 0; i < modeCount; i++)\n                if (displayModes[i].infoType == DISPLAYCONFIG_MODE_INFO_TYPE.DISPLAYCONFIG_MODE_INFO_TYPE_TARGET)\n                {\n                    DISPLAYCONFIG_TARGET_DEVICE_NAME? displayName = null;\n                    try\n                    {\n                        displayName = DeviceName(displayModes[i].adapterId, displayModes[i].id);\n                        \n                    } catch (Exception e)\n                    {\n                        Logger.WriteLine(e.Message);\n                    }\n\n                    if (displayName is not null) yield return (DISPLAYCONFIG_TARGET_DEVICE_NAME)displayName;\n                }\n                    \n        }\n\n\n        public static IEnumerable<DISPLAY_DEVICE> GetDisplayDevices()\n        {\n\n            var displayAdapter = new DISPLAY_DEVICE();\n            displayAdapter.cb = Marshal.SizeOf<DISPLAY_DEVICE>();\n\n            var displayAdapterNumber = default(uint);\n            while (EnumDisplayDevices(null, displayAdapterNumber, ref displayAdapter, 1))\n            {\n                var displayMonitor = new DISPLAY_DEVICE();\n                displayMonitor.cb = Marshal.SizeOf<DISPLAY_DEVICE>();\n\n                var displayMonitorNumber = default(uint);\n                while (EnumDisplayDevices(displayAdapter.DeviceName, displayMonitorNumber, ref displayMonitor, 1))\n                {\n                    var isAttached = (displayMonitor.StateFlags & DisplayDeviceStates.ATTACHED_TO_DESKTOP) == DisplayDeviceStates.ATTACHED_TO_DESKTOP;\n                    var isMirroring = (displayMonitor.StateFlags & DisplayDeviceStates.MIRRORING_DRIVER) == DisplayDeviceStates.MIRRORING_DRIVER;\n                    if (isAttached && !isMirroring) yield return displayMonitor;\n                    displayMonitorNumber++;\n                    \n                }\n\n                displayAdapterNumber++;\n            }\n        }\n\n\n    }\n\n}\n"
  },
  {
    "path": "app/Display/ScreenNative.cs",
    "content": "﻿using System.Collections;\nusing System.Runtime.InteropServices;\nusing static GHelper.Display.ScreenInterrogatory;\n\nnamespace GHelper.Display\n{\n\n    class DeviceComparer : IComparer\n    {\n        public int Compare(object x, object y)\n        {\n            uint displayX = ((DISPLAYCONFIG_TARGET_DEVICE_NAME)x).connectorInstance;\n            uint displayY = ((DISPLAYCONFIG_TARGET_DEVICE_NAME)y).connectorInstance;\n\n            if (displayX > displayY)\n                return 1;\n            if (displayX < displayY)\n                return -1;\n            else\n                return 0;\n        }\n    }\n\n    class ScreenComparer : IComparer\n    {\n        public int Compare(object x, object y)\n        {\n            int displayX = Int32.Parse(((Screen)x).DeviceName.Replace(@\"\\\\.\\DISPLAY\", \"\"));\n            int displayY = Int32.Parse(((Screen)y).DeviceName.Replace(@\"\\\\.\\DISPLAY\", \"\"));\n            return (new CaseInsensitiveComparer()).Compare(displayX, displayY);\n        }\n    }\n    internal class ScreenNative\n    {\n\n        [DllImport(\"gdi32\", CharSet = CharSet.Unicode)]\n        internal static extern IntPtr CreateDC(string driver, string device, string port, IntPtr deviceMode);\n\n        [DllImport(\"gdi32\")]\n        internal static extern bool SetDeviceGammaRamp(IntPtr dcHandle, ref GammaRamp ramp);\n\n        [DllImport(\"gdi32\")]\n        internal static extern bool GetDeviceGammaRamp(IntPtr dcHandle, ref GammaRamp ramp);\n\n        [DllImport(\"gdi32\", CharSet = CharSet.Unicode)]\n        internal static extern bool SetICMProfileW(IntPtr dcHandle, string lpFileName);\n\n        [DllImport(\"gdi32\", CharSet = CharSet.Unicode)]\n        internal static extern bool SetICMMode(IntPtr dcHandle, int mode);\n\n        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]\n        public struct DEVMODE\n        {\n            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]\n            public string dmDeviceName;\n\n            public short dmSpecVersion;\n            public short dmDriverVersion;\n            public short dmSize;\n            public short dmDriverExtra;\n            public int dmFields;\n            public int dmPositionX;\n            public int dmPositionY;\n            public int dmDisplayOrientation;\n            public int dmDisplayFixedOutput;\n            public short dmColor;\n            public short dmDuplex;\n            public short dmYResolution;\n            public short dmTTOption;\n            public short dmCollate;\n\n            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]\n            public string dmFormName;\n\n            public short dmLogPixels;\n            public short dmBitsPerPel;\n            public int dmPelsWidth;\n            public int dmPelsHeight;\n            public int dmDisplayFlags;\n            public int dmDisplayFrequency;\n            public int dmICMMethod;\n            public int dmICMIntent;\n            public int dmMediaType;\n            public int dmDitherType;\n            public int dmReserved1;\n            public int dmReserved2;\n            public int dmPanningWidth;\n            public int dmPanningHeight;\n        };\n\n        [Flags()]\n        public enum DisplaySettingsFlags : int\n        {\n            CDS_UPDATEREGISTRY = 1,\n            CDS_TEST = 2,\n            CDS_FULLSCREEN = 4,\n            CDS_GLOBAL = 8,\n            CDS_SET_PRIMARY = 0x10,\n            CDS_RESET = 0x40000000,\n            CDS_NORESET = 0x10000000\n        }\n\n        // PInvoke declaration for EnumDisplaySettings Win32 API\n        [DllImport(\"user32.dll\")]\n        public static extern int EnumDisplaySettingsEx(\n             string lpszDeviceName,\n             int iModeNum,\n             ref DEVMODE lpDevMode);\n\n        // PInvoke declaration for ChangeDisplaySettings Win32 API\n        [DllImport(\"user32.dll\")]\n        public static extern int ChangeDisplaySettingsEx(\n                string lpszDeviceName, ref DEVMODE lpDevMode, IntPtr hwnd,\n                DisplaySettingsFlags dwflags, IntPtr lParam);\n\n        public static DEVMODE CreateDevmode()\n        {\n            DEVMODE dm = new DEVMODE();\n            dm.dmDeviceName = new String(new char[32]);\n            dm.dmFormName = new String(new char[32]);\n            dm.dmSize = (short)Marshal.SizeOf(dm);\n            return dm;\n        }\n\n        public enum COLORPROFILETYPE\n        {\n            CPT_ICC,\n            CPT_DMP,\n            CPT_CAMP,\n            CPT_GMMP\n        }\n        public enum COLORPROFILESUBTYPE\n        {\n            CPST_PERCEPTUAL,\n            CPST_RELATIVE_COLORIMETRIC,\n            CPST_SATURATION,\n            CPST_ABSOLUTE_COLORIMETRIC,\n            CPST_NONE,\n            CPST_RGB_WORKING_SPACE,\n            CPST_CUSTOM_WORKING_SPACE,\n            CPST_STANDARD_DISPLAY_COLOR_MODE,\n            CPST_EXTENDED_DISPLAY_COLOR_MODE\n        }\n        public enum WCS_PROFILE_MANAGEMENT_SCOPE\n        {\n            WCS_PROFILE_MANAGEMENT_SCOPE_SYSTEM_WIDE,\n            WCS_PROFILE_MANAGEMENT_SCOPE_CURRENT_USER\n        }\n\n        [DllImport(\"mscms.dll\", CharSet = CharSet.Unicode)]\n        public static extern bool WcsSetDefaultColorProfile(\n            WCS_PROFILE_MANAGEMENT_SCOPE scope,\n            string pDeviceName,\n            COLORPROFILETYPE cptColorProfileType,\n            COLORPROFILESUBTYPE cpstColorProfileSubType,\n            uint dwProfileID,\n            string pProfileName\n        );\n\n\n        public const int ENUM_CURRENT_SETTINGS = -1;\n        public const string defaultDevice = @\"\\\\.\\DISPLAY1\";\n\n\n        public static string? FindInternalName(bool log = false)\n        {\n            try\n            {\n                var devicesList = GetAllDevices();\n                var devices = devicesList.ToArray();\n                string internalName = AppConfig.GetString(\"internal_display\");\n\n                foreach (var device in devices)\n                {\n                    if (device.outputTechnology == DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY.DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL ||\n                        device.outputTechnology == DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY.DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED ||\n                        device.monitorFriendlyDeviceName == internalName)\n                    {\n                        if (log) Logger.WriteLine(device.monitorDevicePath + \" \" + device.outputTechnology);\n\n                        AppConfig.Set(\"internal_display\", device.monitorFriendlyDeviceName);\n                        var names = device.monitorDevicePath.Split(\"#\");\n                        \n                        if (names.Length > 1) return names[1];\n                        else return \"\";\n                    }\n                }\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine(ex.Message);\n            }\n\n            return null;\n        }\n\n        static string ExtractDisplay(string input)\n        {\n            int index = input.IndexOf('\\\\', 4); // Start searching from index 4 to skip \"\"\n\n            if (index != -1)\n            {\n                string extracted = input.Substring(0, index);\n                return extracted;\n            }\n\n            return input;\n        }\n\n        public static string? FindLaptopScreen(bool log = false)\n        {\n            string? laptopScreen = null;\n            string? internalName = FindInternalName(log);\n\n            if (internalName == null)\n            {\n                Logger.WriteLine(\"Internal screen off\");\n                return null;\n            }\n\n            try\n            {\n                var displays = GetDisplayDevices().ToArray();\n                foreach (var display in displays)\n                {\n                    if (log) Logger.WriteLine(display.DeviceID + \" \" + display.DeviceName);\n                    if (display.DeviceID.Contains(internalName))\n                    {\n                        laptopScreen = ExtractDisplay(display.DeviceName);\n                        break;\n                    }\n                }\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine(ex.ToString());\n            }\n\n            if (laptopScreen is null)\n            {\n                Logger.WriteLine(\"Default internal screen\");\n                laptopScreen = Screen.PrimaryScreen.DeviceName;\n            }\n\n            return laptopScreen;\n        }\n\n\n        public static int GetMaxRefreshRate(string? laptopScreen)\n        {\n\n            if (laptopScreen is null) return -1;\n\n            DEVMODE dm = CreateDevmode();\n            int frequency = -1;\n\n            int i = 0;\n            while (0 != EnumDisplaySettingsEx(laptopScreen, i, ref dm))\n            {\n                if (dm.dmDisplayFrequency > frequency) frequency = dm.dmDisplayFrequency;\n                i++;\n            }\n\n            if (frequency > 0) AppConfig.Set(\"screen_max\", frequency);\n            else frequency = AppConfig.Get(\"screen_max\");\n\n            return frequency;\n\n        }\n\n        public static int GetRefreshRate(string? laptopScreen)\n        {\n\n            if (laptopScreen is null) return -1;\n\n            DEVMODE dm = CreateDevmode();\n            int frequency = -1;\n\n            if (0 != EnumDisplaySettingsEx(laptopScreen, ENUM_CURRENT_SETTINGS, ref dm))\n            {\n                frequency = dm.dmDisplayFrequency;\n            }\n\n            return frequency;\n        }\n\n        public static int SetRefreshRate(string laptopScreen, int frequency = 120)\n        {\n            DEVMODE dm = CreateDevmode();\n\n            if (0 != EnumDisplaySettingsEx(laptopScreen, ENUM_CURRENT_SETTINGS, ref dm))\n            {\n                dm.dmDisplayFrequency = frequency;\n                int iRet = ChangeDisplaySettingsEx(laptopScreen, ref dm, IntPtr.Zero, DisplaySettingsFlags.CDS_UPDATEREGISTRY, IntPtr.Zero);\n                Logger.WriteLine(\"Screen = \" + frequency.ToString() + \"Hz : \" + (iRet == 0 ? \"OK\" : iRet));\n                return iRet;\n            }\n\n            return 0;\n\n        }\n    }\n}\n"
  },
  {
    "path": "app/Display/VisualControl.cs",
    "content": "﻿using GHelper.Helpers;\nusing Microsoft.Win32;\nusing Ryzen;\nusing System.Management;\n\nnamespace GHelper.Display\n{\n    public enum SplendidGamut : int\n    {\n        VivoNative = 0,\n        VivoSRGB = 1,\n        VivoDCIP3 = 3,\n        ViviDisplayP3 = 4,\n        Native = 50,\n        sRGB = 51,\n        DCIP3 = 53,\n        DisplayP3 = 54\n    }\n\n    public enum SplendidCommand : int\n    {\n        None = -1,\n\n        VivoNormal = 1,\n        VivoVivid = 2,\n        VivoManual = 6,\n        VivoEycare = 7,\n\n        Init = 10,\n        DimmingVivo = 9,\n        DimmingVisual = 19,\n        DimmingDuo = 109,\n\n        GamutMode = 200,\n\n        Default = 11,\n        Racing = 21,\n        Scenery = 22,\n        RTS = 23,\n        FPS = 24,\n        Cinema = 25,\n        Vivid = 13,\n        Eyecare = 17,\n        EReading = 212,\n        Disabled = 18,\n    }\n    public static class VisualControl\n    {\n        public static DisplayGammaRamp? gammaRamp;\n\n        private static int _brightness = 100;\n        private static bool _init = true;\n        private static bool _download = true;\n        private static string? _splendidPath = null;\n\n        private static System.Timers.Timer brightnessTimer = new System.Timers.Timer(200);\n\n        public const int DefaultColorTemp = 50;\n\n        public static bool forceVisual = false;\n        public static bool skipGamut = false;\n\n        static VisualControl()\n        {\n            brightnessTimer.Elapsed += BrightnessTimerTimer_Elapsed;\n        }\n\n        public static string GetGameVisualPath()\n        {\n            return Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + \"\\\\ASUS\\\\GameVisual\";\n        }\n\n        public static string GetVivobookPath()\n        {\n            return Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + \"\\\\ASUS\\\\ASUS System Control Interface\\\\ASUSOptimization\\\\Splendid\";\n        }\n\n        public static SplendidGamut GetDefaultGamut()\n        {\n            return AppConfig.IsVivoZenPro() ? SplendidGamut.VivoNative : SplendidGamut.Native;\n        }\n\n        public static bool IsEReading()\n        {\n            return File.Exists(AppConfig.IsVivoZenPro() ? GetVivobookPath() : GetGameVisualPath() + \"\\\\Asus_Monochrome.icm\");\n        }\n\n        public static Dictionary<SplendidGamut, string> GetGamutModes()\n        {\n\n            bool isVivo = AppConfig.IsVivoZenPro();\n\n            Dictionary<SplendidGamut, string> _modes = new Dictionary<SplendidGamut, string>();\n\n            string iccPath = isVivo ? GetVivobookPath() : GetGameVisualPath();\n\n            if (!Directory.Exists(iccPath))\n            {\n                Logger.WriteLine(iccPath + \" doesn't exist\");\n                return _modes;\n            }\n\n            try\n            {\n                DirectoryInfo d = new DirectoryInfo(iccPath);\n                FileInfo[] icms = d.GetFiles(\"*.icm\");\n                if (icms.Length == 0) return _modes;\n\n                _modes.Add(isVivo ? SplendidGamut.VivoNative : SplendidGamut.Native, \"Gamut: Native\");\n                foreach (FileInfo icm in icms)\n                {\n                    //Logger.WriteLine(icm.FullName);\n\n                    if (icm.Name.Contains(\"sRGB\"))\n                    {\n                        try\n                        {\n                            _modes.Add(isVivo ? SplendidGamut.VivoSRGB : SplendidGamut.sRGB, \"Gamut: sRGB\");\n                            Logger.WriteLine(icm.FullName + \" sRGB\");\n                        }\n                        catch\n                        {\n                        }\n                    }\n\n                    if (icm.Name.Contains(\"DCIP3\"))\n                    {\n                        try\n                        {\n                            _modes.Add(isVivo ? SplendidGamut.VivoDCIP3 : SplendidGamut.DCIP3, \"Gamut: DCIP3\");\n                            Logger.WriteLine(icm.FullName + \" DCIP3\");\n                        }\n                        catch\n                        {\n                        }\n                    }\n\n                    if (icm.Name.Contains(\"DisplayP3\"))\n                    {\n                        try\n                        {\n                            _modes.Add(isVivo ? SplendidGamut.ViviDisplayP3 : SplendidGamut.DisplayP3, \"Gamut: DisplayP3\");\n                            Logger.WriteLine(icm.FullName + \" DisplayP3\");\n                        }\n                        catch\n                        {\n                        }\n                    }\n                }\n                return _modes;\n            }\n            catch (Exception ex)\n            {\n                //Logger.WriteLine(ex.Message);\n                Logger.WriteLine(ex.ToString());\n                return _modes;\n            }\n\n        }\n\n        public static SplendidCommand GetDefaultVisualMode()\n        {\n            return AppConfig.IsVivoZenPro() ? SplendidCommand.VivoNormal : SplendidCommand.Default;\n        }\n\n        public static Dictionary<SplendidCommand, string> GetVisualModes()\n        {\n\n            if (AppConfig.IsVivoZenPro())\n            {\n                return new Dictionary<SplendidCommand, string>\n                {\n                    { SplendidCommand.VivoNormal, \"Default\" },\n                    { SplendidCommand.VivoVivid, \"Vivid\" },\n                    { SplendidCommand.VivoManual, \"Manual\" },\n                    { SplendidCommand.VivoEycare, \"Eyecare\" },\n                    { SplendidCommand.EReading, \"E-Reading\"},\n                };\n            }\n\n            return new Dictionary<SplendidCommand, string>\n            {\n                { SplendidCommand.Default, \"Default\"},\n                { SplendidCommand.Racing, \"Racing\"},\n                { SplendidCommand.Scenery, \"Scenery\"},\n                { SplendidCommand.RTS, \"RTS/RPG\"},\n                { SplendidCommand.FPS, \"FPS\"},\n                { SplendidCommand.Cinema, \"Cinema\"},\n                { SplendidCommand.Vivid, \"Vivid\" },\n                { SplendidCommand.Eyecare, \"Eyecare\"},\n                { SplendidCommand.EReading, \"E-Reading\"},\n                { SplendidCommand.Disabled, \"Disabled\"}\n            };\n        }\n\n        public static Dictionary<int, string> GetTemperatures()\n        {\n            return new Dictionary<int, string>\n            {\n                { 0, \"Warmest\"},\n                { 15, \"Warmer\"},\n                { 30, \"Warm\"},\n                { 50, \"Neutral\"},\n                { 70, \"Cold\"},\n                { 85, \"Colder\"},\n                { 100, \"Coldest\"},\n            };\n        }\n\n        public static Dictionary<int, string> GetEyeCares()\n        {\n            return new Dictionary<int, string>\n            {\n                { 0, \"0\"},\n                { 1, \"1\"},\n                { 2, \"2\"},\n                { 3, \"3\"},\n                { 4, \"4\"},\n            };\n        }\n\n        const string GameVisualKey = @\"HKEY_CURRENT_USER\\Software\\ASUS\\ARMOURY CRATE Service\\GameVisual\";\n        const string GameVisualValue = \"ActiveGVStatus\";\n\n        public static bool IsEnabled()\n        {\n            var status = (int?)Registry.GetValue(GameVisualKey, GameVisualValue, 1);\n            return status > 0;\n        }\n\n        public static void SetRegStatus(int status = 1)\n        {\n            Registry.SetValue(GameVisualKey, GameVisualValue, status, RegistryValueKind.DWord);\n        }\n\n        public static void InitGamut()\n        {\n            int gamut = AppConfig.Get(\"gamut\");\n\n            if (gamut < 0) return;\n            if ((SplendidGamut)gamut == SplendidGamut.Native || (SplendidGamut)gamut == SplendidGamut.VivoNative) return; \n\n            SetGamut(gamut);\n        }\n\n        public static void SetGamut(int mode = -1)\n        {\n            if (skipGamut) return;\n            if (mode < 0) mode = (int)GetDefaultGamut();\n\n            AppConfig.Set(\"gamut\", mode);\n\n            var result = RunSplendid(SplendidCommand.GamutMode, 0, mode);\n            if (result == 0) return;\n            if (result == -1)\n            {\n                Logger.WriteLine(\"Gamut setting refused, reverting.\");\n                RunSplendid(SplendidCommand.GamutMode, 0, (int)GetDefaultGamut());\n                if (ProcessHelper.IsUserAdministrator() && _download)\n                {\n                    _download = false;\n                    ColorProfileHelper.InstallProfile();\n                }\n            }\n            if (result == 1 && _init)\n            {\n                _init = false;\n                RunSplendid(SplendidCommand.Init);\n                RunSplendid(SplendidCommand.GamutMode, 0, mode);\n            }\n        }\n\n        public static void SetVisual(SplendidCommand mode = SplendidCommand.Default, int whiteBalance = DefaultColorTemp, bool init = false)\n        {\n            Task.Run(async () =>\n            {\n                if (AmdDisplay.IsOledPowerOptimization()) Program.settingsForm.VisualiseAmdOled(true);\n            });\n\n            if (mode == SplendidCommand.None) return;\n            if ((mode == SplendidCommand.Default || mode == SplendidCommand.VivoNormal) && whiteBalance == DefaultColorTemp && init) return; // Skip default setting on init\n            if (mode == SplendidCommand.Disabled && !RyzenControl.IsAMD() && init) return; // Skip disabled setting for Intel devices\n\n            AppConfig.Set(\"visual\", (int)mode);\n            AppConfig.Set(\"color_temp\", whiteBalance);\n\n            Task.Run(async () =>\n            {\n                if (!forceVisual && ScreenCCD.GetHDRStatus(true)) return;\n                if (!forceVisual && ScreenNative.GetRefreshRate(ScreenNative.FindLaptopScreen(true)) < 0) return;\n\n                if (!init && mode == SplendidCommand.EReading && !ProcessHelper.IsUserAdministrator() && !IsEReading()) ProcessHelper.RunAsAdmin();\n\n                int param1 = 0;\n                int? param2 = null;\n                int? param3 = null;\n\n                switch (mode)\n                {\n                    case SplendidCommand.Disabled:\n                        param1 = 2;\n                        break;\n                    case SplendidCommand.Eyecare:\n                        param2 = 4;\n                        break;\n                    case SplendidCommand.VivoNormal:\n                    case SplendidCommand.VivoVivid:\n                        param2 = null;\n                        break;\n                    case SplendidCommand.VivoEycare:\n                        param2 = Math.Abs(whiteBalance - 50) * 4 / 50;\n                        break;\n                    case SplendidCommand.EReading:\n                        param2 = 2;            // Contrast\n                        param3 = whiteBalance; // Color Temp\n                        break;\n                    default:\n                        param2 = whiteBalance;\n                        break;\n                }\n\n                int result = RunSplendid(mode, param1, param2, param3);\n                if (result == 0) return;\n                if (result == -1)\n                {\n                    Logger.WriteLine(\"Visual mode setting refused, reverting.\");\n                    RunSplendid(SplendidCommand.Default, 0, DefaultColorTemp);\n                    if (ProcessHelper.IsUserAdministrator() && _download)\n                    {\n                        _download = false;\n                        ColorProfileHelper.InstallProfile();\n                    }\n                }\n                if (result == 1 && _init)\n                {\n                    _init = false;\n                    RunSplendid(SplendidCommand.Init);\n                    RunSplendid(mode, 0, param2, param3);\n                }\n            });\n        }\n\n        private static string GetSplendidPath()\n        {\n            if (_splendidPath == null)\n            {\n                try\n                {\n                    using (var searcher = new ManagementObjectSearcher(@\"Select * from Win32_SystemDriver WHERE Name='ATKWMIACPIIO'\"))\n                    {\n                        foreach (var driver in searcher.Get())\n                        {\n                            string path = driver[\"PathName\"].ToString();\n                            _splendidPath = Path.GetDirectoryName(path);\n                            break;\n                        }\n                    }\n                }\n                catch (Exception ex)\n                {\n                    Logger.WriteLine(ex.Message);\n                }\n            }\n\n            return _splendidPath;\n        }\n\n        private static int RunSplendid(SplendidCommand command, int? param1 = null, int? param2 = null, int? param3 = null)\n        {\n            string splendidPath = GetSplendidPath();\n            string splendidExe = $\"{splendidPath}\\\\AsusSplendid.exe\";\n            bool isVivo = AppConfig.IsVivoZenPro();\n            bool isSplenddid = File.Exists(splendidExe);\n\n            if (AmdDisplay.IsOledPowerOptimization())\n            {\n                Logger.WriteLine(\"Skipping command due to AMD OLED Power Optimization flag\");\n                Program.settingsForm.VisualiseAmdOled(true);\n                return 0;\n            }\n\n            if (isSplenddid)\n            {\n                var result = ProcessHelper.RunCMD(splendidExe, (int)command + \" \" + param1 + \" \" + param2 + \" \" + param3, splendidPath);\n                if (result.Contains(\"file not exist\") || (result.Length == 0 && !isVivo)) return 1;\n                if (result.Contains(\"return code: -1\")) return -1;\n                if (result.Contains(\"Visual is disabled\"))\n                {\n                    SetRegStatus(1);\n                    return 1;\n                }\n            }\n\n            return 0;\n        }\n\n        private static void BrightnessTimerTimer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)\n        {\n            brightnessTimer.Stop();\n\n            var dimmingCommand = AppConfig.IsVivoZenPro() ? SplendidCommand.DimmingVivo : SplendidCommand.DimmingVisual;\n            var dimmingLevel = (int)(40 + _brightness * 0.6);\n\n            if (AppConfig.IsDUO()) RunSplendid(SplendidCommand.DimmingDuo, 0, dimmingLevel);\n            if (RunSplendid(dimmingCommand, 0, dimmingLevel) == 0) return;\n\n            if (_init)\n            {\n                _init = false;\n                RunSplendid(SplendidCommand.Init);\n                RunSplendid(SplendidCommand.Init, 4);\n                if (RunSplendid(dimmingCommand, 0, dimmingLevel) == 0) return;\n            }\n\n            // GammaRamp Fallback\n            SetGamma(_brightness);\n        }\n\n        public static void InitBrightness()\n        {\n            if (!AppConfig.IsOLED()) return;\n            if (!AppConfig.SaveDimming()) return;\n\n            int brightness = GetBrightness();\n            if (brightness >= 0) SetBrightness(brightness);\n        }\n\n        private static bool IsOnBattery()\n        {\n            return AppConfig.SaveDimming() && SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Online;\n        }\n\n        public static int GetBrightness()\n        {\n            return AppConfig.Get(IsOnBattery() ? \"brightness_battery\" : \"brightness\", 100);\n        }\n\n        public static int SetBrightness(int brightness = -1, int delta = 0)\n        {\n            if (!AppConfig.IsOLED()) return -1;\n            if (brightness < 0) brightness = GetBrightness();\n\n            _brightness = Math.Max(0, Math.Min(100, brightness + delta));\n            AppConfig.Set(IsOnBattery() ? \"brightness_battery\" : \"brightness\", _brightness);\n\n            brightnessTimer.Start();\n\n            Program.settingsForm.VisualiseBrightness();\n            //if (brightness < 100) ResetGamut();\n\n            return _brightness;\n        }\n\n        public static void ResetGamut()\n        {\n            int defaultGamut = (int)GetDefaultGamut();\n\n            if (AppConfig.Get(\"gamut\") != defaultGamut)\n            {\n                skipGamut = true;\n                AppConfig.Set(\"gamut\", defaultGamut);\n                Program.settingsForm.VisualiseGamut();\n                skipGamut = false;\n            }\n        }\n\n\n        public static void SetGamma(int brightness = 100)\n        {\n            var bright = Math.Round((float)brightness / 200 + 0.5, 2);\n\n            var screenName = ScreenNative.FindLaptopScreen();\n            if (screenName is null) return;\n\n            try\n            {\n                var handle = ScreenNative.CreateDC(screenName, screenName, null, IntPtr.Zero);\n                if (gammaRamp is null)\n                {\n                    var gammaDump = new GammaRamp();\n                    if (ScreenNative.GetDeviceGammaRamp(handle, ref gammaDump))\n                    {\n                        gammaRamp = new DisplayGammaRamp(gammaDump);\n                        //Logger.WriteLine(\"Gamma R: \" + string.Join(\"-\", gammaRamp.Red));\n                        //Logger.WriteLine(\"Gamma G: \" + string.Join(\"-\", gammaRamp.Green));\n                        //Logger.WriteLine(\"Gamma B: \" + string.Join(\"-\", gammaRamp.Blue));\n                    }\n                }\n\n                if (gammaRamp is null || !gammaRamp.IsOriginal())\n                {\n                    Logger.WriteLine(\"Not default Gamma\");\n                    gammaRamp = new DisplayGammaRamp();\n                }\n\n                var ramp = gammaRamp.AsBrightnessRamp(bright);\n                bool result = ScreenNative.SetDeviceGammaRamp(handle, ref ramp);\n\n                Logger.WriteLine(\"Gamma \" + bright.ToString() + \": \" + result);\n\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine(ex.ToString());\n            }\n\n            //ScreenBrightness.Set(60 + (int)(40 * bright));\n        }\n\n    }\n}\n"
  },
  {
    "path": "app/Extra.Designer.cs",
    "content": "﻿using GHelper.Properties;\nusing GHelper.UI;\n\nnamespace GHelper\n{\n    partial class Extra\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            components = new System.ComponentModel.Container();\n            panelServices = new Panel();\n            pictureService = new PictureBox();\n            labelServices = new Label();\n            buttonServices = new RButton();\n            panelBindingsHeader = new Panel();\n            pictureBindings = new PictureBox();\n            pictureHelp = new PictureBox();\n            labelBindings = new Label();\n            panelBindings = new Panel();\n            tableBindings = new TableLayoutPanel();\n            labelFNE = new Label();\n            comboFNE = new RComboBox();\n            textFNE = new TextBox();\n            labelFNV = new Label();\n            comboFNV = new RComboBox();\n            textFNV = new TextBox();\n            labelFNC = new Label();\n            comboFNC = new RComboBox();\n            textFNC = new TextBox();\n            labelFNF4 = new Label();\n            comboFNF4 = new RComboBox();\n            textFNF4 = new TextBox();\n            comboM4 = new RComboBox();\n            textM4 = new TextBox();\n            labelM4 = new Label();\n            comboM3 = new RComboBox();\n            textM3 = new TextBox();\n            labelM3 = new Label();\n            textM2 = new TextBox();\n            labelM2 = new Label();\n            comboM2 = new RComboBox();\n            textM1 = new TextBox();\n            comboM1 = new RComboBox();\n            labelM1 = new Label();\n            tableKeys = new TableLayoutPanel();\n            panelBacklightHeader = new Panel();\n            sliderBrightness = new Slider();\n            pictureBacklight = new PictureBox();\n            labelBacklightTitle = new Label();\n            panelBacklight = new Panel();\n            panelBacklightExtra = new Panel();\n            numericBacklightPluggedTime = new NumericUpDownWithUnit();\n            numericBacklightTime = new NumericUpDownWithUnit();\n            labelBacklightTimeout = new Label();\n            labelSpeed = new Label();\n            comboKeyboardSpeed = new RComboBox();\n            panelXGM = new Panel();\n            checkXGM = new CheckBox();\n            tableBacklight = new TableLayoutPanel();\n            labelBacklightKeyboard = new Label();\n            checkAwake = new CheckBox();\n            checkBoot = new CheckBox();\n            checkSleep = new CheckBox();\n            checkShutdown = new CheckBox();\n            checkBattery = new CheckBox();\n            labelBacklightLogo = new Label();\n            checkAwakeLogo = new CheckBox();\n            checkBootLogo = new CheckBox();\n            checkSleepLogo = new CheckBox();\n            checkShutdownLogo = new CheckBox();\n            checkBatteryLogo = new CheckBox();\n            labelBacklightBar = new Label();\n            checkAwakeBar = new CheckBox();\n            checkBootBar = new CheckBox();\n            checkSleepBar = new CheckBox();\n            checkShutdownBar = new CheckBox();\n            checkBatteryBar = new CheckBox();\n            labelBacklightLid = new Label();\n            checkAwakeLid = new CheckBox();\n            checkBootLid = new CheckBox();\n            checkSleepLid = new CheckBox();\n            checkShutdownLid = new CheckBox();\n            checkBatteryLid = new CheckBox();\n            panelSettingsHeader = new Panel();\n            pictureScan = new PictureBox();\n            pictureLog = new PictureBox();\n            pictureSettings = new PictureBox();\n            labelSettings = new Label();\n            panelSettings = new Panel();\n            checkAutoToggleClamshellMode = new CheckBox();\n            checkBWIcon = new CheckBox();\n            checkTopmost = new CheckBox();\n            checkNoOverdrive = new CheckBox();\n            checkBootSound = new CheckBox();\n            checkUSBC = new CheckBox();\n            checkGpuApps = new CheckBox();\n            checkGPUFix = new CheckBox();\n            checkNVPlatform = new CheckBox();\n            checkStatusLed = new CheckBox();\n            checkPerKeyRGB = new CheckBox();\n            panelPower = new Panel();\n            numericHibernateAfter = new NumericUpDownWithUnit();\n            labelHibernateAfter = new Label();\n            pictureHibernate = new PictureBox();\n            toolTip = new ToolTip(components);\n            panelAPU = new Panel();\n            comboAPU = new RComboBox();\n            pictureAPUMem = new PictureBox();\n            labelAPUMem = new Label();\n            panelCores = new Panel();\n            buttonCores = new RButton();\n            comboCoresP = new RComboBox();\n            comboCoresE = new RComboBox();\n            pictureCores = new PictureBox();\n            label1 = new Label();\n            panelACPI = new Panel();\n            textACPIParam = new TextBox();\n            textACPICommand = new TextBox();\n            buttonACPISend = new RButton();\n            pictureDebug = new PictureBox();\n            labelACPITitle = new Label();\n            panelOptimalBrightness = new Panel();\n            comboOptimalBrightness = new RComboBox();\n            pictureOptimalBrightness = new PictureBox();\n            labelOptimalBrightness = new Label();\n            panelServices.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureService).BeginInit();\n            panelBindingsHeader.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureBindings).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)pictureHelp).BeginInit();\n            panelBindings.SuspendLayout();\n            tableBindings.SuspendLayout();\n            panelBacklightHeader.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureBacklight).BeginInit();\n            panelBacklight.SuspendLayout();\n            panelBacklightExtra.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)numericBacklightPluggedTime).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)numericBacklightTime).BeginInit();\n            panelXGM.SuspendLayout();\n            tableBacklight.SuspendLayout();\n            panelSettingsHeader.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureScan).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)pictureLog).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)pictureSettings).BeginInit();\n            panelSettings.SuspendLayout();\n            panelPower.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)numericHibernateAfter).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)pictureHibernate).BeginInit();\n            panelAPU.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureAPUMem).BeginInit();\n            panelCores.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureCores).BeginInit();\n            panelACPI.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureDebug).BeginInit();\n            panelOptimalBrightness.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureOptimalBrightness).BeginInit();\n            SuspendLayout();\n            // \n            // panelServices\n            // \n            panelServices.AccessibleRole = AccessibleRole.Grouping;\n            panelServices.Controls.Add(pictureService);\n            panelServices.Controls.Add(labelServices);\n            panelServices.Controls.Add(buttonServices);\n            panelServices.Dock = DockStyle.Top;\n            panelServices.Location = new Point(15, 1778);\n            panelServices.Name = \"panelServices\";\n            panelServices.Size = new Size(949, 75);\n            panelServices.TabIndex = 5;\n            // \n            // pictureService\n            // \n            pictureService.BackgroundImage = Resources.icons8_automation_32;\n            pictureService.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureService.Location = new Point(21, 19);\n            pictureService.Name = \"pictureService\";\n            pictureService.Size = new Size(32, 32);\n            pictureService.TabIndex = 21;\n            pictureService.TabStop = false;\n            // \n            // labelServices\n            // \n            labelServices.AutoSize = true;\n            labelServices.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelServices.Location = new Point(57, 19);\n            labelServices.Name = \"labelServices\";\n            labelServices.Size = new Size(273, 32);\n            labelServices.TabIndex = 20;\n            labelServices.Text = \"Asus Services Running\";\n            // \n            // buttonServices\n            // \n            buttonServices.Activated = false;\n            buttonServices.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;\n            buttonServices.BackColor = SystemColors.ButtonHighlight;\n            buttonServices.BorderColor = Color.Transparent;\n            buttonServices.BorderRadius = 2;\n            buttonServices.FlatStyle = FlatStyle.Flat;\n            buttonServices.Location = new Point(713, 11);\n            buttonServices.Margin = new Padding(5, 3, 5, 3);\n            buttonServices.Name = \"buttonServices\";\n            buttonServices.Secondary = false;\n            buttonServices.Size = new Size(256, 53);\n            buttonServices.TabIndex = 19;\n            buttonServices.Text = \"Start Services\";\n            buttonServices.UseVisualStyleBackColor = false;\n            // \n            // panelBindingsHeader\n            // \n            panelBindingsHeader.AutoSize = true;\n            panelBindingsHeader.BackColor = SystemColors.ControlLight;\n            panelBindingsHeader.Controls.Add(pictureBindings);\n            panelBindingsHeader.Controls.Add(pictureHelp);\n            panelBindingsHeader.Controls.Add(labelBindings);\n            panelBindingsHeader.Dock = DockStyle.Top;\n            panelBindingsHeader.Location = new Point(15, 15);\n            panelBindingsHeader.Name = \"panelBindingsHeader\";\n            panelBindingsHeader.Padding = new Padding(11, 5, 11, 5);\n            panelBindingsHeader.Size = new Size(949, 51);\n            panelBindingsHeader.TabIndex = 4;\n            // \n            // pictureBindings\n            // \n            pictureBindings.BackgroundImage = Resources.icons8_keyboard_32;\n            pictureBindings.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureBindings.Location = new Point(21, 11);\n            pictureBindings.Name = \"pictureBindings\";\n            pictureBindings.Size = new Size(32, 32);\n            pictureBindings.TabIndex = 1;\n            pictureBindings.TabStop = false;\n            // \n            // pictureHelp\n            // \n            pictureHelp.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            pictureHelp.BackgroundImage = Resources.icons8_help_32;\n            pictureHelp.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureHelp.Cursor = Cursors.Hand;\n            pictureHelp.Location = new Point(897, 11);\n            pictureHelp.Margin = new Padding(5, 3, 5, 3);\n            pictureHelp.Name = \"pictureHelp\";\n            pictureHelp.Size = new Size(32, 32);\n            pictureHelp.TabIndex = 11;\n            pictureHelp.TabStop = false;\n            // \n            // labelBindings\n            // \n            labelBindings.AutoSize = true;\n            labelBindings.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelBindings.Location = new Point(56, 8);\n            labelBindings.Name = \"labelBindings\";\n            labelBindings.Size = new Size(114, 32);\n            labelBindings.TabIndex = 0;\n            labelBindings.Text = \"Bindings\";\n            // \n            // panelBindings\n            // \n            panelBindings.AutoSize = true;\n            panelBindings.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelBindings.Controls.Add(tableBindings);\n            panelBindings.Dock = DockStyle.Top;\n            panelBindings.Location = new Point(15, 66);\n            panelBindings.Name = \"panelBindings\";\n            panelBindings.Padding = new Padding(0, 0, 11, 5);\n            panelBindings.Size = new Size(949, 395);\n            panelBindings.TabIndex = 1;\n            panelBindings.TabStop = true;\n            // \n            // tableBindings\n            // \n            tableBindings.AccessibleRole = AccessibleRole.Table;\n            tableBindings.AutoSize = true;\n            tableBindings.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            tableBindings.ColumnCount = 3;\n            tableBindings.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));\n            tableBindings.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 40F));\n            tableBindings.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 40F));\n            tableBindings.Controls.Add(labelFNE, 0, 7);\n            tableBindings.Controls.Add(comboFNE, 0, 7);\n            tableBindings.Controls.Add(textFNE, 0, 7);\n            tableBindings.Controls.Add(labelFNV, 0, 6);\n            tableBindings.Controls.Add(comboFNV, 1, 6);\n            tableBindings.Controls.Add(textFNV, 2, 6);\n            tableBindings.Controls.Add(labelFNC, 0, 5);\n            tableBindings.Controls.Add(comboFNC, 1, 5);\n            tableBindings.Controls.Add(textFNC, 2, 5);\n            tableBindings.Controls.Add(labelFNF4, 0, 4);\n            tableBindings.Controls.Add(comboFNF4, 1, 4);\n            tableBindings.Controls.Add(textFNF4, 2, 4);\n            tableBindings.Controls.Add(comboM4, 1, 3);\n            tableBindings.Controls.Add(textM4, 2, 3);\n            tableBindings.Controls.Add(labelM4, 0, 3);\n            tableBindings.Controls.Add(comboM3, 1, 2);\n            tableBindings.Controls.Add(textM3, 2, 2);\n            tableBindings.Controls.Add(labelM3, 0, 2);\n            tableBindings.Controls.Add(textM2, 2, 1);\n            tableBindings.Controls.Add(labelM2, 0, 1);\n            tableBindings.Controls.Add(comboM2, 1, 1);\n            tableBindings.Controls.Add(textM1, 2, 0);\n            tableBindings.Controls.Add(comboM1, 1, 0);\n            tableBindings.Controls.Add(labelM1, 0, 0);\n            tableBindings.Dock = DockStyle.Top;\n            tableBindings.Location = new Point(0, 0);\n            tableBindings.Margin = new Padding(0, 3, 5, 3);\n            tableBindings.Name = \"tableBindings\";\n            tableBindings.Padding = new Padding(16, 11, 0, 11);\n            tableBindings.RowCount = 8;\n            tableBindings.RowStyles.Add(new RowStyle());\n            tableBindings.RowStyles.Add(new RowStyle());\n            tableBindings.RowStyles.Add(new RowStyle());\n            tableBindings.RowStyles.Add(new RowStyle());\n            tableBindings.RowStyles.Add(new RowStyle());\n            tableBindings.RowStyles.Add(new RowStyle());\n            tableBindings.RowStyles.Add(new RowStyle());\n            tableBindings.RowStyles.Add(new RowStyle());\n            tableBindings.Size = new Size(938, 390);\n            tableBindings.TabIndex = 12;\n            // \n            // labelFNE\n            // \n            labelFNE.AutoSize = true;\n            labelFNE.Location = new Point(16, 333);\n            labelFNE.Margin = new Padding(0);\n            labelFNE.Name = \"labelFNE\";\n            labelFNE.Padding = new Padding(5, 11, 0, 0);\n            labelFNE.Size = new Size(143, 43);\n            labelFNE.TabIndex = 20;\n            labelFNE.Text = \"FN+NmEnt:\";\n            // \n            // comboFNE\n            // \n            comboFNE.BorderColor = Color.White;\n            comboFNE.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboFNE.Dock = DockStyle.Top;\n            comboFNE.FormattingEnabled = true;\n            comboFNE.Location = new Point(205, 336);\n            comboFNE.Margin = new Padding(5, 3, 5, 3);\n            comboFNE.Name = \"comboFNE\";\n            comboFNE.Size = new Size(358, 40);\n            comboFNE.TabIndex = 8;\n            // \n            // textFNE\n            // \n            textFNE.Dock = DockStyle.Top;\n            textFNE.Location = new Point(573, 336);\n            textFNE.Margin = new Padding(5, 3, 5, 3);\n            textFNE.Name = \"textFNE\";\n            textFNE.PlaceholderText = \"action\";\n            textFNE.Size = new Size(360, 39);\n            textFNE.TabIndex = 19;\n            textFNE.TabStop = false;\n            // \n            // labelFNV\n            // \n            labelFNV.AutoSize = true;\n            labelFNV.Location = new Point(16, 287);\n            labelFNV.Margin = new Padding(0);\n            labelFNV.Name = \"labelFNV\";\n            labelFNV.Padding = new Padding(5, 11, 0, 0);\n            labelFNV.Size = new Size(85, 43);\n            labelFNV.TabIndex = 15;\n            labelFNV.Text = \"FN+V:\";\n            // \n            // comboFNV\n            // \n            comboFNV.BorderColor = Color.White;\n            comboFNV.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboFNV.Dock = DockStyle.Top;\n            comboFNV.FormattingEnabled = true;\n            comboFNV.Location = new Point(205, 290);\n            comboFNV.Margin = new Padding(5, 3, 5, 3);\n            comboFNV.Name = \"comboFNV\";\n            comboFNV.Size = new Size(358, 40);\n            comboFNV.TabIndex = 7;\n            // \n            // textFNV\n            // \n            textFNV.Dock = DockStyle.Top;\n            textFNV.Location = new Point(573, 290);\n            textFNV.Margin = new Padding(5, 3, 5, 3);\n            textFNV.Name = \"textFNV\";\n            textFNV.PlaceholderText = \"action\";\n            textFNV.Size = new Size(360, 39);\n            textFNV.TabIndex = 18;\n            textFNV.TabStop = false;\n            // \n            // labelFNC\n            // \n            labelFNC.AutoSize = true;\n            labelFNC.Location = new Point(16, 241);\n            labelFNC.Margin = new Padding(0);\n            labelFNC.Name = \"labelFNC\";\n            labelFNC.Padding = new Padding(5, 11, 0, 0);\n            labelFNC.Size = new Size(85, 43);\n            labelFNC.TabIndex = 15;\n            labelFNC.Text = \"FN+C:\";\n            // \n            // comboFNC\n            // \n            comboFNC.BorderColor = Color.White;\n            comboFNC.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboFNC.Dock = DockStyle.Top;\n            comboFNC.FormattingEnabled = true;\n            comboFNC.Location = new Point(205, 244);\n            comboFNC.Margin = new Padding(5, 3, 5, 3);\n            comboFNC.Name = \"comboFNC\";\n            comboFNC.Size = new Size(358, 40);\n            comboFNC.TabIndex = 6;\n            // \n            // textFNC\n            // \n            textFNC.Dock = DockStyle.Top;\n            textFNC.Location = new Point(573, 244);\n            textFNC.Margin = new Padding(5, 3, 5, 3);\n            textFNC.Name = \"textFNC\";\n            textFNC.PlaceholderText = \"action\";\n            textFNC.Size = new Size(360, 39);\n            textFNC.TabIndex = 17;\n            textFNC.TabStop = false;\n            // \n            // labelFNF4\n            // \n            labelFNF4.AutoSize = true;\n            labelFNF4.Location = new Point(16, 195);\n            labelFNF4.Margin = new Padding(0);\n            labelFNF4.Name = \"labelFNF4\";\n            labelFNF4.Padding = new Padding(5, 11, 0, 0);\n            labelFNF4.Size = new Size(95, 43);\n            labelFNF4.TabIndex = 6;\n            labelFNF4.Text = \"FN+F4:\";\n            // \n            // comboFNF4\n            // \n            comboFNF4.BorderColor = Color.White;\n            comboFNF4.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboFNF4.Dock = DockStyle.Top;\n            comboFNF4.FormattingEnabled = true;\n            comboFNF4.Location = new Point(205, 198);\n            comboFNF4.Margin = new Padding(5, 3, 5, 3);\n            comboFNF4.Name = \"comboFNF4\";\n            comboFNF4.Size = new Size(358, 40);\n            comboFNF4.TabIndex = 5;\n            // \n            // textFNF4\n            // \n            textFNF4.Dock = DockStyle.Top;\n            textFNF4.Location = new Point(573, 198);\n            textFNF4.Margin = new Padding(5, 3, 5, 3);\n            textFNF4.Name = \"textFNF4\";\n            textFNF4.PlaceholderText = \"action\";\n            textFNF4.Size = new Size(360, 39);\n            textFNF4.TabIndex = 8;\n            textFNF4.TabStop = false;\n            // \n            // comboM4\n            // \n            comboM4.BorderColor = Color.White;\n            comboM4.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboM4.Dock = DockStyle.Top;\n            comboM4.FormattingEnabled = true;\n            comboM4.Items.AddRange(new object[] { Strings.PerformanceMode, Strings.OpenGHelper, Strings.Custom });\n            comboM4.Location = new Point(205, 152);\n            comboM4.Margin = new Padding(5, 3, 5, 3);\n            comboM4.Name = \"comboM4\";\n            comboM4.Size = new Size(358, 40);\n            comboM4.TabIndex = 4;\n            // \n            // textM4\n            // \n            textM4.Dock = DockStyle.Top;\n            textM4.Location = new Point(573, 152);\n            textM4.Margin = new Padding(5, 3, 5, 3);\n            textM4.Name = \"textM4\";\n            textM4.PlaceholderText = \"action\";\n            textM4.Size = new Size(360, 39);\n            textM4.TabIndex = 5;\n            textM4.TabStop = false;\n            // \n            // labelM4\n            // \n            labelM4.AutoSize = true;\n            labelM4.Location = new Point(16, 149);\n            labelM4.Margin = new Padding(0);\n            labelM4.Name = \"labelM4\";\n            labelM4.Padding = new Padding(5, 11, 0, 0);\n            labelM4.Size = new Size(116, 43);\n            labelM4.TabIndex = 2;\n            labelM4.Text = \"M4/ROG:\";\n            // \n            // comboM3\n            // \n            comboM3.BorderColor = Color.White;\n            comboM3.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboM3.Dock = DockStyle.Top;\n            comboM3.FormattingEnabled = true;\n            comboM3.Items.AddRange(new object[] { Strings.Default, Strings.VolumeMute, Strings.PlayPause, Strings.PrintScreen, Strings.ToggleAura, Strings.Custom });\n            comboM3.Location = new Point(205, 106);\n            comboM3.Margin = new Padding(5, 3, 5, 3);\n            comboM3.Name = \"comboM3\";\n            comboM3.Size = new Size(358, 40);\n            comboM3.TabIndex = 3;\n            // \n            // textM3\n            // \n            textM3.Dock = DockStyle.Top;\n            textM3.Location = new Point(573, 106);\n            textM3.Margin = new Padding(5, 3, 5, 3);\n            textM3.Name = \"textM3\";\n            textM3.PlaceholderText = \"action\";\n            textM3.Size = new Size(360, 39);\n            textM3.TabIndex = 4;\n            textM3.TabStop = false;\n            // \n            // labelM3\n            // \n            labelM3.AutoSize = true;\n            labelM3.Location = new Point(16, 103);\n            labelM3.Margin = new Padding(0);\n            labelM3.Name = \"labelM3\";\n            labelM3.Padding = new Padding(5, 11, 0, 0);\n            labelM3.Size = new Size(59, 43);\n            labelM3.TabIndex = 0;\n            labelM3.Text = \"M3:\";\n            // \n            // textM2\n            // \n            textM2.Dock = DockStyle.Top;\n            textM2.Location = new Point(573, 60);\n            textM2.Margin = new Padding(5, 3, 5, 3);\n            textM2.Name = \"textM2\";\n            textM2.PlaceholderText = \"action\";\n            textM2.Size = new Size(360, 39);\n            textM2.TabIndex = 14;\n            textM2.TabStop = false;\n            // \n            // labelM2\n            // \n            labelM2.AutoSize = true;\n            labelM2.Location = new Point(16, 57);\n            labelM2.Margin = new Padding(0);\n            labelM2.Name = \"labelM2\";\n            labelM2.Padding = new Padding(5, 11, 0, 0);\n            labelM2.Size = new Size(59, 43);\n            labelM2.TabIndex = 10;\n            labelM2.Text = \"M2:\";\n            // \n            // comboM2\n            // \n            comboM2.BorderColor = Color.White;\n            comboM2.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboM2.Dock = DockStyle.Top;\n            comboM2.FormattingEnabled = true;\n            comboM2.Items.AddRange(new object[] { Strings.Default, Strings.VolumeMute, Strings.PlayPause, Strings.PrintScreen, Strings.ToggleAura, Strings.Custom });\n            comboM2.Location = new Point(205, 60);\n            comboM2.Margin = new Padding(5, 3, 5, 3);\n            comboM2.Name = \"comboM2\";\n            comboM2.Size = new Size(358, 40);\n            comboM2.TabIndex = 2;\n            // \n            // textM1\n            // \n            textM1.Dock = DockStyle.Top;\n            textM1.Location = new Point(573, 14);\n            textM1.Margin = new Padding(5, 3, 5, 3);\n            textM1.Name = \"textM1\";\n            textM1.PlaceholderText = \"action\";\n            textM1.Size = new Size(360, 39);\n            textM1.TabIndex = 13;\n            textM1.TabStop = false;\n            // \n            // comboM1\n            // \n            comboM1.BorderColor = Color.White;\n            comboM1.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboM1.Dock = DockStyle.Top;\n            comboM1.FormattingEnabled = true;\n            comboM1.Items.AddRange(new object[] { Strings.Default, Strings.VolumeMute, Strings.PlayPause, Strings.PrintScreen, Strings.ToggleAura, Strings.Custom });\n            comboM1.Location = new Point(205, 14);\n            comboM1.Margin = new Padding(5, 3, 5, 3);\n            comboM1.Name = \"comboM1\";\n            comboM1.Size = new Size(358, 40);\n            comboM1.TabIndex = 1;\n            // \n            // labelM1\n            // \n            labelM1.AutoSize = true;\n            labelM1.Location = new Point(16, 11);\n            labelM1.Margin = new Padding(0);\n            labelM1.Name = \"labelM1\";\n            labelM1.Padding = new Padding(5, 11, 0, 0);\n            labelM1.Size = new Size(59, 43);\n            labelM1.TabIndex = 9;\n            labelM1.Text = \"M1:\";\n            // \n            // tableKeys\n            // \n            tableKeys.ColumnCount = 3;\n            tableKeys.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));\n            tableKeys.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 40F));\n            tableKeys.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 40F));\n            tableKeys.Location = new Point(0, 0);\n            tableKeys.Name = \"tableKeys\";\n            tableKeys.RowCount = 6;\n            tableKeys.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F));\n            tableKeys.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F));\n            tableKeys.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F));\n            tableKeys.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F));\n            tableKeys.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F));\n            tableKeys.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F));\n            tableKeys.Size = new Size(200, 100);\n            tableKeys.TabIndex = 0;\n            // \n            // panelBacklightHeader\n            // \n            panelBacklightHeader.AutoSize = true;\n            panelBacklightHeader.BackColor = SystemColors.ControlLight;\n            panelBacklightHeader.Controls.Add(sliderBrightness);\n            panelBacklightHeader.Controls.Add(pictureBacklight);\n            panelBacklightHeader.Controls.Add(labelBacklightTitle);\n            panelBacklightHeader.Dock = DockStyle.Top;\n            panelBacklightHeader.Location = new Point(15, 461);\n            panelBacklightHeader.Name = \"panelBacklightHeader\";\n            panelBacklightHeader.Padding = new Padding(11, 5, 11, 5);\n            panelBacklightHeader.Size = new Size(949, 51);\n            panelBacklightHeader.TabIndex = 44;\n            // \n            // sliderBrightness\n            // \n            sliderBrightness.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            sliderBrightness.Location = new Point(433, 5);\n            sliderBrightness.Margin = new Padding(0);\n            sliderBrightness.Max = 3;\n            sliderBrightness.Min = 0;\n            sliderBrightness.Name = \"sliderBrightness\";\n            sliderBrightness.Size = new Size(501, 40);\n            sliderBrightness.Step = 1;\n            sliderBrightness.TabIndex = 50;\n            sliderBrightness.TabStop = false;\n            sliderBrightness.Text = \"sliderBrightness\";\n            sliderBrightness.Value = 3;\n            // \n            // pictureBacklight\n            // \n            pictureBacklight.BackgroundImage = Resources.backlight;\n            pictureBacklight.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureBacklight.Location = new Point(21, 11);\n            pictureBacklight.Name = \"pictureBacklight\";\n            pictureBacklight.Size = new Size(32, 32);\n            pictureBacklight.TabIndex = 3;\n            pictureBacklight.TabStop = false;\n            // \n            // labelBacklightTitle\n            // \n            labelBacklightTitle.AutoSize = true;\n            labelBacklightTitle.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelBacklightTitle.Location = new Point(56, 8);\n            labelBacklightTitle.Name = \"labelBacklightTitle\";\n            labelBacklightTitle.Size = new Size(119, 32);\n            labelBacklightTitle.TabIndex = 2;\n            labelBacklightTitle.Text = \"Backlight\";\n            // \n            // panelBacklight\n            // \n            panelBacklight.AutoSize = true;\n            panelBacklight.Controls.Add(panelBacklightExtra);\n            panelBacklight.Controls.Add(panelXGM);\n            panelBacklight.Controls.Add(tableBacklight);\n            panelBacklight.Dock = DockStyle.Top;\n            panelBacklight.Location = new Point(15, 512);\n            panelBacklight.Name = \"panelBacklight\";\n            panelBacklight.Padding = new Padding(0, 5, 0, 5);\n            panelBacklight.Size = new Size(949, 444);\n            panelBacklight.TabIndex = 2;\n            // \n            // panelBacklightExtra\n            // \n            panelBacklightExtra.AutoSize = true;\n            panelBacklightExtra.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelBacklightExtra.Controls.Add(numericBacklightPluggedTime);\n            panelBacklightExtra.Controls.Add(numericBacklightTime);\n            panelBacklightExtra.Controls.Add(labelBacklightTimeout);\n            panelBacklightExtra.Controls.Add(labelSpeed);\n            panelBacklightExtra.Controls.Add(comboKeyboardSpeed);\n            panelBacklightExtra.Dock = DockStyle.Top;\n            panelBacklightExtra.Location = new Point(0, 324);\n            panelBacklightExtra.Margin = new Padding(5, 3, 5, 3);\n            panelBacklightExtra.Name = \"panelBacklightExtra\";\n            panelBacklightExtra.Padding = new Padding(0, 0, 0, 5);\n            panelBacklightExtra.Size = new Size(949, 115);\n            panelBacklightExtra.TabIndex = 46;\n            // \n            // numericBacklightPluggedTime\n            // \n            numericBacklightPluggedTime.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            numericBacklightPluggedTime.Location = new Point(634, 63);\n            numericBacklightPluggedTime.Margin = new Padding(5, 3, 5, 3);\n            numericBacklightPluggedTime.Maximum = new decimal(new int[] { 3600, 0, 0, 0 });\n            numericBacklightPluggedTime.Name = \"numericBacklightPluggedTime\";\n            numericBacklightPluggedTime.Size = new Size(139, 39);\n            numericBacklightPluggedTime.TabIndex = 1;\n            numericBacklightPluggedTime.Unit = \"sec\";\n            numericBacklightPluggedTime.UnitFirst = false;\n            // \n            // numericBacklightTime\n            // \n            numericBacklightTime.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            numericBacklightTime.Location = new Point(789, 63);\n            numericBacklightTime.Margin = new Padding(5, 3, 5, 3);\n            numericBacklightTime.Maximum = new decimal(new int[] { 3600, 0, 0, 0 });\n            numericBacklightTime.Name = \"numericBacklightTime\";\n            numericBacklightTime.Size = new Size(139, 39);\n            numericBacklightTime.TabIndex = 2;\n            numericBacklightTime.Unit = \"sec\";\n            numericBacklightTime.UnitFirst = false;\n            // \n            // labelBacklightTimeout\n            // \n            labelBacklightTimeout.Location = new Point(16, 63);\n            labelBacklightTimeout.Margin = new Padding(5, 0, 5, 0);\n            labelBacklightTimeout.Name = \"labelBacklightTimeout\";\n            labelBacklightTimeout.Size = new Size(613, 47);\n            labelBacklightTimeout.TabIndex = 46;\n            labelBacklightTimeout.Text = \"Timeout when plugged / on battery\";\n            // \n            // labelSpeed\n            // \n            labelSpeed.Location = new Point(16, 16);\n            labelSpeed.Margin = new Padding(5, 0, 5, 0);\n            labelSpeed.Name = \"labelSpeed\";\n            labelSpeed.Size = new Size(613, 43);\n            labelSpeed.TabIndex = 44;\n            labelSpeed.Text = \"Animation Speed\";\n            // \n            // comboKeyboardSpeed\n            // \n            comboKeyboardSpeed.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            comboKeyboardSpeed.BorderColor = Color.White;\n            comboKeyboardSpeed.ButtonColor = SystemColors.ControlLight;\n            comboKeyboardSpeed.FlatStyle = FlatStyle.Flat;\n            comboKeyboardSpeed.Font = new Font(\"Segoe UI\", 9F);\n            comboKeyboardSpeed.FormattingEnabled = true;\n            comboKeyboardSpeed.ItemHeight = 32;\n            comboKeyboardSpeed.Items.AddRange(new object[] { \"Slow\", \"Normal\", \"Fast\" });\n            comboKeyboardSpeed.Location = new Point(634, 13);\n            comboKeyboardSpeed.Margin = new Padding(5, 11, 5, 9);\n            comboKeyboardSpeed.Name = \"comboKeyboardSpeed\";\n            comboKeyboardSpeed.Size = new Size(293, 40);\n            comboKeyboardSpeed.TabIndex = 0;\n            comboKeyboardSpeed.TabStop = false;\n            // \n            // panelXMG\n            // \n            panelXGM.Controls.Add(checkXGM);\n            panelXGM.Dock = DockStyle.Top;\n            panelXGM.Location = new Point(0, 265);\n            panelXGM.Margin = new Padding(5, 3, 5, 3);\n            panelXGM.Name = \"panelXMG\";\n            panelXGM.Size = new Size(949, 59);\n            panelXGM.TabIndex = 45;\n            // \n            // checkXMG\n            // \n            checkXGM.AutoSize = true;\n            checkXGM.Location = new Point(5, 11);\n            checkXGM.Margin = new Padding(5, 3, 5, 3);\n            checkXGM.Name = \"checkXMG\";\n            checkXGM.Padding = new Padding(16, 3, 7, 3);\n            checkXGM.Size = new Size(181, 42);\n            checkXGM.TabIndex = 2;\n            checkXGM.Text = \"XG Mobile\";\n            checkXGM.UseVisualStyleBackColor = true;\n            // \n            // tableBacklight\n            // \n            tableBacklight.AutoSize = true;\n            tableBacklight.ColumnCount = 4;\n            tableBacklight.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableBacklight.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableBacklight.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableBacklight.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableBacklight.Controls.Add(labelBacklightKeyboard, 0, 0);\n            tableBacklight.Controls.Add(checkAwake, 0, 1);\n            tableBacklight.Controls.Add(checkBoot, 0, 2);\n            tableBacklight.Controls.Add(checkSleep, 0, 3);\n            tableBacklight.Controls.Add(checkShutdown, 0, 4);\n            tableBacklight.Controls.Add(checkBattery, 0, 5);\n            tableBacklight.Controls.Add(labelBacklightLogo, 1, 0);\n            tableBacklight.Controls.Add(checkAwakeLogo, 1, 1);\n            tableBacklight.Controls.Add(checkBootLogo, 1, 2);\n            tableBacklight.Controls.Add(checkSleepLogo, 1, 3);\n            tableBacklight.Controls.Add(checkShutdownLogo, 1, 4);\n            tableBacklight.Controls.Add(checkBatteryLogo, 1, 5);\n            tableBacklight.Controls.Add(labelBacklightBar, 2, 0);\n            tableBacklight.Controls.Add(checkAwakeBar, 2, 1);\n            tableBacklight.Controls.Add(checkBootBar, 2, 2);\n            tableBacklight.Controls.Add(checkSleepBar, 2, 3);\n            tableBacklight.Controls.Add(checkShutdownBar, 2, 4);\n            tableBacklight.Controls.Add(checkBatteryBar, 2, 5);\n            tableBacklight.Controls.Add(labelBacklightLid, 3, 0);\n            tableBacklight.Controls.Add(checkAwakeLid, 3, 1);\n            tableBacklight.Controls.Add(checkBootLid, 3, 2);\n            tableBacklight.Controls.Add(checkSleepLid, 3, 3);\n            tableBacklight.Controls.Add(checkShutdownLid, 3, 4);\n            tableBacklight.Controls.Add(checkBatteryLid, 3, 5);\n            tableBacklight.Dock = DockStyle.Top;\n            tableBacklight.Location = new Point(0, 5);\n            tableBacklight.Margin = new Padding(0);\n            tableBacklight.Name = \"tableBacklight\";\n            tableBacklight.RowCount = 6;\n            tableBacklight.RowStyles.Add(new RowStyle());\n            tableBacklight.RowStyles.Add(new RowStyle());\n            tableBacklight.RowStyles.Add(new RowStyle());\n            tableBacklight.RowStyles.Add(new RowStyle());\n            tableBacklight.RowStyles.Add(new RowStyle());\n            tableBacklight.RowStyles.Add(new RowStyle());\n            tableBacklight.Size = new Size(949, 260);\n            tableBacklight.TabIndex = 44;\n            // \n            // labelBacklightKeyboard\n            // \n            labelBacklightKeyboard.Dock = DockStyle.Fill;\n            labelBacklightKeyboard.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelBacklightKeyboard.Location = new Point(5, 0);\n            labelBacklightKeyboard.Margin = new Padding(5, 0, 5, 0);\n            labelBacklightKeyboard.Name = \"labelBacklightKeyboard\";\n            labelBacklightKeyboard.Padding = new Padding(9, 5, 7, 5);\n            labelBacklightKeyboard.Size = new Size(227, 45);\n            labelBacklightKeyboard.TabIndex = 6;\n            labelBacklightKeyboard.Text = \"Keyboard\";\n            // \n            // checkAwake\n            // \n            checkAwake.Dock = DockStyle.Fill;\n            checkAwake.Location = new Point(5, 45);\n            checkAwake.Margin = new Padding(5, 0, 5, 0);\n            checkAwake.Name = \"checkAwake\";\n            checkAwake.Padding = new Padding(16, 3, 7, 3);\n            checkAwake.Size = new Size(227, 43);\n            checkAwake.TabIndex = 1;\n            checkAwake.Text = Strings.Awake;\n            checkAwake.UseVisualStyleBackColor = true;\n            // \n            // checkBoot\n            // \n            checkBoot.Dock = DockStyle.Fill;\n            checkBoot.Location = new Point(5, 88);\n            checkBoot.Margin = new Padding(5, 0, 5, 0);\n            checkBoot.Name = \"checkBoot\";\n            checkBoot.Padding = new Padding(16, 3, 7, 3);\n            checkBoot.Size = new Size(227, 43);\n            checkBoot.TabIndex = 2;\n            checkBoot.Text = Strings.Boot;\n            checkBoot.UseVisualStyleBackColor = true;\n            // \n            // checkSleep\n            // \n            checkSleep.Dock = DockStyle.Fill;\n            checkSleep.Location = new Point(5, 131);\n            checkSleep.Margin = new Padding(5, 0, 5, 0);\n            checkSleep.Name = \"checkSleep\";\n            checkSleep.Padding = new Padding(16, 3, 7, 3);\n            checkSleep.Size = new Size(227, 43);\n            checkSleep.TabIndex = 3;\n            checkSleep.Text = \"Sleep\";\n            checkSleep.UseVisualStyleBackColor = true;\n            // \n            // checkShutdown\n            // \n            checkShutdown.Dock = DockStyle.Fill;\n            checkShutdown.Location = new Point(5, 174);\n            checkShutdown.Margin = new Padding(5, 0, 5, 0);\n            checkShutdown.Name = \"checkShutdown\";\n            checkShutdown.Padding = new Padding(16, 3, 7, 3);\n            checkShutdown.Size = new Size(227, 43);\n            checkShutdown.TabIndex = 4;\n            checkShutdown.Text = Strings.Shutdown;\n            checkShutdown.UseVisualStyleBackColor = true;\n            // \n            // checkBattery\n            // \n            checkBattery.Dock = DockStyle.Fill;\n            checkBattery.Location = new Point(5, 217);\n            checkBattery.Margin = new Padding(5, 0, 5, 0);\n            checkBattery.Name = \"checkBattery\";\n            checkBattery.Padding = new Padding(16, 3, 7, 3);\n            checkBattery.Size = new Size(227, 43);\n            checkBattery.TabIndex = 24;\n            checkBattery.Text = \"Battery\";\n            checkBattery.UseVisualStyleBackColor = true;\n            // \n            // labelBacklightLogo\n            // \n            labelBacklightLogo.Dock = DockStyle.Fill;\n            labelBacklightLogo.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelBacklightLogo.Location = new Point(242, 0);\n            labelBacklightLogo.Margin = new Padding(5, 0, 5, 0);\n            labelBacklightLogo.Name = \"labelBacklightLogo\";\n            labelBacklightLogo.Padding = new Padding(9, 5, 7, 5);\n            labelBacklightLogo.Size = new Size(227, 45);\n            labelBacklightLogo.TabIndex = 21;\n            labelBacklightLogo.Text = \"Logo\";\n            // \n            // checkAwakeLogo\n            // \n            checkAwakeLogo.Dock = DockStyle.Fill;\n            checkAwakeLogo.Location = new Point(242, 45);\n            checkAwakeLogo.Margin = new Padding(5, 0, 5, 0);\n            checkAwakeLogo.Name = \"checkAwakeLogo\";\n            checkAwakeLogo.Padding = new Padding(16, 3, 7, 3);\n            checkAwakeLogo.Size = new Size(227, 43);\n            checkAwakeLogo.TabIndex = 17;\n            checkAwakeLogo.Text = Strings.Awake;\n            checkAwakeLogo.UseVisualStyleBackColor = true;\n            // \n            // checkBootLogo\n            // \n            checkBootLogo.Dock = DockStyle.Fill;\n            checkBootLogo.Location = new Point(242, 88);\n            checkBootLogo.Margin = new Padding(5, 0, 5, 0);\n            checkBootLogo.Name = \"checkBootLogo\";\n            checkBootLogo.Padding = new Padding(16, 3, 7, 3);\n            checkBootLogo.Size = new Size(227, 43);\n            checkBootLogo.TabIndex = 18;\n            checkBootLogo.Text = Strings.Boot;\n            checkBootLogo.UseVisualStyleBackColor = true;\n            // \n            // checkSleepLogo\n            // \n            checkSleepLogo.Dock = DockStyle.Fill;\n            checkSleepLogo.Location = new Point(242, 131);\n            checkSleepLogo.Margin = new Padding(5, 0, 5, 0);\n            checkSleepLogo.Name = \"checkSleepLogo\";\n            checkSleepLogo.Padding = new Padding(16, 3, 7, 3);\n            checkSleepLogo.Size = new Size(227, 43);\n            checkSleepLogo.TabIndex = 19;\n            checkSleepLogo.Text = Strings.Sleep;\n            checkSleepLogo.UseVisualStyleBackColor = true;\n            // \n            // checkShutdownLogo\n            // \n            checkShutdownLogo.Dock = DockStyle.Fill;\n            checkShutdownLogo.Location = new Point(242, 174);\n            checkShutdownLogo.Margin = new Padding(5, 0, 5, 0);\n            checkShutdownLogo.Name = \"checkShutdownLogo\";\n            checkShutdownLogo.Padding = new Padding(16, 3, 7, 3);\n            checkShutdownLogo.Size = new Size(227, 43);\n            checkShutdownLogo.TabIndex = 20;\n            checkShutdownLogo.Text = Strings.Shutdown;\n            checkShutdownLogo.UseVisualStyleBackColor = true;\n            // \n            // checkBatteryLogo\n            // \n            checkBatteryLogo.Dock = DockStyle.Fill;\n            checkBatteryLogo.Location = new Point(242, 217);\n            checkBatteryLogo.Margin = new Padding(5, 0, 5, 0);\n            checkBatteryLogo.Name = \"checkBatteryLogo\";\n            checkBatteryLogo.Padding = new Padding(16, 3, 7, 3);\n            checkBatteryLogo.Size = new Size(227, 43);\n            checkBatteryLogo.TabIndex = 25;\n            checkBatteryLogo.Text = \"Battery\";\n            checkBatteryLogo.UseVisualStyleBackColor = true;\n            // \n            // labelBacklightBar\n            // \n            labelBacklightBar.Dock = DockStyle.Fill;\n            labelBacklightBar.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelBacklightBar.Location = new Point(479, 0);\n            labelBacklightBar.Margin = new Padding(5, 0, 5, 0);\n            labelBacklightBar.Name = \"labelBacklightBar\";\n            labelBacklightBar.Padding = new Padding(9, 5, 7, 5);\n            labelBacklightBar.Size = new Size(227, 45);\n            labelBacklightBar.TabIndex = 11;\n            labelBacklightBar.Text = \"Lightbar\";\n            // \n            // checkAwakeBar\n            // \n            checkAwakeBar.Dock = DockStyle.Fill;\n            checkAwakeBar.Location = new Point(479, 45);\n            checkAwakeBar.Margin = new Padding(5, 0, 5, 0);\n            checkAwakeBar.Name = \"checkAwakeBar\";\n            checkAwakeBar.Padding = new Padding(16, 3, 7, 3);\n            checkAwakeBar.Size = new Size(227, 43);\n            checkAwakeBar.TabIndex = 7;\n            checkAwakeBar.Text = Strings.Awake;\n            checkAwakeBar.UseVisualStyleBackColor = true;\n            // \n            // checkBootBar\n            // \n            checkBootBar.Dock = DockStyle.Fill;\n            checkBootBar.Location = new Point(479, 88);\n            checkBootBar.Margin = new Padding(5, 0, 5, 0);\n            checkBootBar.Name = \"checkBootBar\";\n            checkBootBar.Padding = new Padding(16, 3, 7, 3);\n            checkBootBar.Size = new Size(227, 43);\n            checkBootBar.TabIndex = 8;\n            checkBootBar.Text = Strings.Boot;\n            checkBootBar.UseVisualStyleBackColor = true;\n            // \n            // checkSleepBar\n            // \n            checkSleepBar.Dock = DockStyle.Fill;\n            checkSleepBar.Location = new Point(479, 131);\n            checkSleepBar.Margin = new Padding(5, 0, 5, 0);\n            checkSleepBar.Name = \"checkSleepBar\";\n            checkSleepBar.Padding = new Padding(16, 3, 7, 3);\n            checkSleepBar.Size = new Size(227, 43);\n            checkSleepBar.TabIndex = 9;\n            checkSleepBar.Text = Strings.Sleep;\n            checkSleepBar.UseVisualStyleBackColor = true;\n            // \n            // checkShutdownBar\n            // \n            checkShutdownBar.Dock = DockStyle.Fill;\n            checkShutdownBar.Location = new Point(479, 174);\n            checkShutdownBar.Margin = new Padding(5, 0, 5, 0);\n            checkShutdownBar.Name = \"checkShutdownBar\";\n            checkShutdownBar.Padding = new Padding(16, 3, 7, 3);\n            checkShutdownBar.Size = new Size(227, 43);\n            checkShutdownBar.TabIndex = 10;\n            checkShutdownBar.Text = Strings.Shutdown;\n            checkShutdownBar.UseVisualStyleBackColor = true;\n            // \n            // checkBatteryBar\n            // \n            checkBatteryBar.Dock = DockStyle.Fill;\n            checkBatteryBar.Location = new Point(479, 217);\n            checkBatteryBar.Margin = new Padding(5, 0, 5, 0);\n            checkBatteryBar.Name = \"checkBatteryBar\";\n            checkBatteryBar.Padding = new Padding(16, 3, 7, 3);\n            checkBatteryBar.Size = new Size(227, 43);\n            checkBatteryBar.TabIndex = 22;\n            checkBatteryBar.Text = \"Battery\";\n            checkBatteryBar.UseVisualStyleBackColor = true;\n            // \n            // labelBacklightLid\n            // \n            labelBacklightLid.Dock = DockStyle.Fill;\n            labelBacklightLid.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelBacklightLid.Location = new Point(716, 0);\n            labelBacklightLid.Margin = new Padding(5, 0, 5, 0);\n            labelBacklightLid.Name = \"labelBacklightLid\";\n            labelBacklightLid.Padding = new Padding(9, 5, 7, 5);\n            labelBacklightLid.Size = new Size(228, 45);\n            labelBacklightLid.TabIndex = 16;\n            labelBacklightLid.Text = \"Lid\";\n            // \n            // checkAwakeLid\n            // \n            checkAwakeLid.Dock = DockStyle.Fill;\n            checkAwakeLid.Location = new Point(716, 45);\n            checkAwakeLid.Margin = new Padding(5, 0, 5, 0);\n            checkAwakeLid.Name = \"checkAwakeLid\";\n            checkAwakeLid.Padding = new Padding(16, 3, 7, 3);\n            checkAwakeLid.Size = new Size(228, 43);\n            checkAwakeLid.TabIndex = 12;\n            checkAwakeLid.Text = Strings.Awake;\n            checkAwakeLid.UseVisualStyleBackColor = true;\n            // \n            // checkBootLid\n            // \n            checkBootLid.Dock = DockStyle.Fill;\n            checkBootLid.Location = new Point(716, 88);\n            checkBootLid.Margin = new Padding(5, 0, 5, 0);\n            checkBootLid.Name = \"checkBootLid\";\n            checkBootLid.Padding = new Padding(16, 3, 7, 3);\n            checkBootLid.Size = new Size(228, 43);\n            checkBootLid.TabIndex = 13;\n            checkBootLid.Text = Strings.Boot;\n            checkBootLid.UseVisualStyleBackColor = true;\n            // \n            // checkSleepLid\n            // \n            checkSleepLid.Dock = DockStyle.Fill;\n            checkSleepLid.Location = new Point(716, 131);\n            checkSleepLid.Margin = new Padding(5, 0, 5, 0);\n            checkSleepLid.Name = \"checkSleepLid\";\n            checkSleepLid.Padding = new Padding(16, 3, 7, 3);\n            checkSleepLid.Size = new Size(228, 43);\n            checkSleepLid.TabIndex = 14;\n            checkSleepLid.Text = Strings.Sleep;\n            checkSleepLid.UseVisualStyleBackColor = true;\n            // \n            // checkShutdownLid\n            // \n            checkShutdownLid.Dock = DockStyle.Fill;\n            checkShutdownLid.Location = new Point(716, 174);\n            checkShutdownLid.Margin = new Padding(5, 0, 5, 0);\n            checkShutdownLid.Name = \"checkShutdownLid\";\n            checkShutdownLid.Padding = new Padding(16, 3, 7, 3);\n            checkShutdownLid.Size = new Size(228, 43);\n            checkShutdownLid.TabIndex = 15;\n            checkShutdownLid.Text = Strings.Shutdown;\n            checkShutdownLid.UseVisualStyleBackColor = true;\n            // \n            // checkBatteryLid\n            // \n            checkBatteryLid.Dock = DockStyle.Fill;\n            checkBatteryLid.Location = new Point(716, 217);\n            checkBatteryLid.Margin = new Padding(5, 0, 5, 0);\n            checkBatteryLid.Name = \"checkBatteryLid\";\n            checkBatteryLid.Padding = new Padding(16, 3, 7, 3);\n            checkBatteryLid.Size = new Size(228, 43);\n            checkBatteryLid.TabIndex = 23;\n            checkBatteryLid.Text = \"Battery\";\n            checkBatteryLid.UseVisualStyleBackColor = true;\n            // \n            // panelSettingsHeader\n            // \n            panelSettingsHeader.AutoSize = true;\n            panelSettingsHeader.BackColor = SystemColors.ControlLight;\n            panelSettingsHeader.Controls.Add(pictureScan);\n            panelSettingsHeader.Controls.Add(pictureLog);\n            panelSettingsHeader.Controls.Add(pictureSettings);\n            panelSettingsHeader.Controls.Add(labelSettings);\n            panelSettingsHeader.Dock = DockStyle.Top;\n            panelSettingsHeader.Location = new Point(15, 956);\n            panelSettingsHeader.Name = \"panelSettingsHeader\";\n            panelSettingsHeader.Padding = new Padding(11, 5, 11, 5);\n            panelSettingsHeader.Size = new Size(949, 51);\n            panelSettingsHeader.TabIndex = 45;\n            // \n            // pictureScan\n            // \n            pictureScan.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            pictureScan.BackgroundImage = Resources.icons8_search_32;\n            pictureScan.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureScan.Cursor = Cursors.Hand;\n            pictureScan.Location = new Point(857, 11);\n            pictureScan.Margin = new Padding(5, 3, 5, 3);\n            pictureScan.Name = \"pictureScan\";\n            pictureScan.Size = new Size(32, 32);\n            pictureScan.TabIndex = 13;\n            pictureScan.TabStop = false;\n            pictureScan.Visible = false;\n            // \n            // pictureLog\n            // \n            pictureLog.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            pictureLog.BackgroundImage = Resources.icons8_log_32;\n            pictureLog.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureLog.Cursor = Cursors.Hand;\n            pictureLog.Location = new Point(897, 11);\n            pictureLog.Margin = new Padding(5, 3, 5, 3);\n            pictureLog.Name = \"pictureLog\";\n            pictureLog.Size = new Size(32, 32);\n            pictureLog.TabIndex = 12;\n            pictureLog.TabStop = false;\n            // \n            // pictureSettings\n            // \n            pictureSettings.BackgroundImage = Resources.icons8_settings_32;\n            pictureSettings.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureSettings.Location = new Point(21, 11);\n            pictureSettings.Name = \"pictureSettings\";\n            pictureSettings.Size = new Size(32, 32);\n            pictureSettings.TabIndex = 1;\n            pictureSettings.TabStop = false;\n            // \n            // labelSettings\n            // \n            labelSettings.AutoSize = true;\n            labelSettings.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelSettings.Location = new Point(56, 9);\n            labelSettings.Name = \"labelSettings\";\n            labelSettings.Size = new Size(78, 32);\n            labelSettings.TabIndex = 0;\n            labelSettings.Text = \"Other\";\n            // \n            // panelSettings\n            // \n            panelSettings.AccessibleRole = AccessibleRole.Grouping;\n            panelSettings.AutoSize = true;\n            panelSettings.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelSettings.Controls.Add(checkAutoToggleClamshellMode);\n            panelSettings.Controls.Add(checkBWIcon);\n            panelSettings.Controls.Add(checkTopmost);\n            panelSettings.Controls.Add(checkNoOverdrive);\n            panelSettings.Controls.Add(checkBootSound);\n            panelSettings.Controls.Add(checkUSBC);\n            panelSettings.Controls.Add(checkGpuApps);\n            panelSettings.Controls.Add(checkGPUFix);\n            panelSettings.Controls.Add(checkNVPlatform);\n            panelSettings.Controls.Add(checkStatusLed);\n            panelSettings.Controls.Add(checkPerKeyRGB);\n            panelSettings.Dock = DockStyle.Top;\n            panelSettings.Location = new Point(15, 1252);\n            panelSettings.Name = \"panelSettings\";\n            panelSettings.Padding = new Padding(21, 5, 11, 5);\n            panelSettings.Size = new Size(949, 472);\n            panelSettings.TabIndex = 3;\n            // \n            // checkAutoToggleClamshellMode\n            // \n            checkAutoToggleClamshellMode.AutoSize = true;\n            checkAutoToggleClamshellMode.Dock = DockStyle.Top;\n            checkAutoToggleClamshellMode.Location = new Point(21, 425);\n            checkAutoToggleClamshellMode.Name = \"checkAutoToggleClamshellMode\";\n            checkAutoToggleClamshellMode.Padding = new Padding(3);\n            checkAutoToggleClamshellMode.Size = new Size(917, 42);\n            checkAutoToggleClamshellMode.TabIndex = 8;\n            checkAutoToggleClamshellMode.Text = \"Auto Toggle Clamshell Mode\";\n            checkAutoToggleClamshellMode.UseVisualStyleBackColor = true;\n            // \n            // checkBWIcon\n            // \n            checkBWIcon.AutoSize = true;\n            checkBWIcon.Dock = DockStyle.Top;\n            checkBWIcon.Location = new Point(21, 383);\n            checkBWIcon.Margin = new Padding(5, 3, 5, 3);\n            checkBWIcon.Name = \"checkBWIcon\";\n            checkBWIcon.Padding = new Padding(3);\n            checkBWIcon.Size = new Size(917, 42);\n            checkBWIcon.TabIndex = 11;\n            checkBWIcon.Text = \"Black and white tray icon\";\n            checkBWIcon.UseVisualStyleBackColor = true;\n            // \n            // checkTopmost\n            // \n            checkTopmost.AutoSize = true;\n            checkTopmost.Dock = DockStyle.Top;\n            checkTopmost.Location = new Point(21, 341);\n            checkTopmost.Margin = new Padding(5, 3, 5, 3);\n            checkTopmost.Name = \"checkTopmost\";\n            checkTopmost.Padding = new Padding(3);\n            checkTopmost.Size = new Size(917, 42);\n            checkTopmost.TabIndex = 6;\n            checkTopmost.Text = Strings.WindowTop;\n            checkTopmost.UseVisualStyleBackColor = true;\n            // \n            // checkNoOverdrive\n            // \n            checkNoOverdrive.AutoSize = true;\n            checkNoOverdrive.Dock = DockStyle.Top;\n            checkNoOverdrive.Location = new Point(21, 299);\n            checkNoOverdrive.Margin = new Padding(5, 3, 5, 3);\n            checkNoOverdrive.Name = \"checkNoOverdrive\";\n            checkNoOverdrive.Padding = new Padding(3);\n            checkNoOverdrive.Size = new Size(917, 42);\n            checkNoOverdrive.TabIndex = 5;\n            checkNoOverdrive.Text = Strings.DisableOverdrive;\n            checkNoOverdrive.UseVisualStyleBackColor = true;\n            // \n            // checkBootSound\n            // \n            checkBootSound.AutoSize = true;\n            checkBootSound.Dock = DockStyle.Top;\n            checkBootSound.Location = new Point(21, 257);\n            checkBootSound.Margin = new Padding(5, 3, 5, 3);\n            checkBootSound.Name = \"checkBootSound\";\n            checkBootSound.Padding = new Padding(3);\n            checkBootSound.Size = new Size(917, 42);\n            checkBootSound.TabIndex = 10;\n            checkBootSound.Text = \"Boot Sound\";\n            checkBootSound.UseVisualStyleBackColor = true;\n            // \n            // checkUSBC\n            // \n            checkUSBC.AutoSize = true;\n            checkUSBC.Dock = DockStyle.Top;\n            checkUSBC.Location = new Point(21, 215);\n            checkUSBC.Margin = new Padding(5, 3, 5, 3);\n            checkUSBC.Name = \"checkUSBC\";\n            checkUSBC.Padding = new Padding(3);\n            checkUSBC.Size = new Size(917, 42);\n            checkUSBC.TabIndex = 4;\n            checkUSBC.Text = \"Keep GPU disabled on USB-C charger in Optimized mode\";\n            checkUSBC.UseVisualStyleBackColor = true;\n            // \n            // checkGpuApps\n            // \n            checkGpuApps.AutoSize = true;\n            checkGpuApps.Dock = DockStyle.Top;\n            checkGpuApps.Location = new Point(21, 173);\n            checkGpuApps.Margin = new Padding(5, 3, 5, 3);\n            checkGpuApps.Name = \"checkGpuApps\";\n            checkGpuApps.Padding = new Padding(3);\n            checkGpuApps.Size = new Size(917, 42);\n            checkGpuApps.TabIndex = 2;\n            checkGpuApps.Text = \"Stop all apps using GPU when switching to Eco\";\n            checkGpuApps.UseVisualStyleBackColor = true;\n            // \n            // checkGPUFix\n            // \n            checkGPUFix.AutoSize = true;\n            checkGPUFix.Dock = DockStyle.Top;\n            checkGPUFix.Location = new Point(21, 131);\n            checkGPUFix.Margin = new Padding(5, 3, 5, 3);\n            checkGPUFix.Name = \"checkGPUFix\";\n            checkGPUFix.Padding = new Padding(3);\n            checkGPUFix.Size = new Size(917, 42);\n            checkGPUFix.TabIndex = 9;\n            checkGPUFix.Text = \"Enable GPU on shutdown (prevents issue with Eco mode)\";\n            checkGPUFix.UseVisualStyleBackColor = true;\n            // \n            // checkNVPlatform\n            // \n            checkNVPlatform.AutoSize = true;\n            checkNVPlatform.Dock = DockStyle.Top;\n            checkNVPlatform.Location = new Point(21, 89);\n            checkNVPlatform.Margin = new Padding(5, 3, 5, 3);\n            checkNVPlatform.Name = \"checkNVPlatform\";\n            checkNVPlatform.Padding = new Padding(3);\n            checkNVPlatform.Size = new Size(917, 42);\n            checkNVPlatform.TabIndex = 15;\n            checkNVPlatform.Text = \"Stop/Start NVIDIA services based on dGPU state\";\n            checkNVPlatform.UseVisualStyleBackColor = true;\n            // \n            // checkStatusLed\n            // \n            checkStatusLed.AutoSize = true;\n            checkStatusLed.Dock = DockStyle.Top;\n            checkStatusLed.Location = new Point(21, 47);\n            checkStatusLed.Margin = new Padding(5, 3, 5, 3);\n            checkStatusLed.Name = \"checkStatusLed\";\n            checkStatusLed.Padding = new Padding(3);\n            checkStatusLed.Size = new Size(917, 42);\n            checkStatusLed.TabIndex = 12;\n            checkStatusLed.Text = \"LED Status Indicators\";\n            checkStatusLed.UseVisualStyleBackColor = true;\n            checkStatusLed.Visible = false;\n            // \n            // checkPerKeyRGB\n            // \n            checkPerKeyRGB.AutoSize = true;\n            checkPerKeyRGB.Dock = DockStyle.Top;\n            checkPerKeyRGB.Location = new Point(21, 5);\n            checkPerKeyRGB.Margin = new Padding(5, 3, 5, 3);\n            checkPerKeyRGB.Name = \"checkPerKeyRGB\";\n            checkPerKeyRGB.Padding = new Padding(3);\n            checkPerKeyRGB.Size = new Size(917, 42);\n            checkPerKeyRGB.TabIndex = 13;\n            checkPerKeyRGB.Text = \"Per-Key RGB Keyboard\";\n            checkPerKeyRGB.UseVisualStyleBackColor = true;\n            checkPerKeyRGB.Visible = false;\n            // \n            // panelPower\n            // \n            panelPower.Controls.Add(numericHibernateAfter);\n            panelPower.Controls.Add(labelHibernateAfter);\n            panelPower.Controls.Add(pictureHibernate);\n            panelPower.Dock = DockStyle.Top;\n            panelPower.Location = new Point(15, 1724);\n            panelPower.Name = \"panelPower\";\n            panelPower.Size = new Size(949, 54);\n            panelPower.TabIndex = 4;\n            // \n            // numericHibernateAfter\n            // \n            numericHibernateAfter.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            numericHibernateAfter.Increment = new decimal(new int[] { 10, 0, 0, 0 });\n            numericHibernateAfter.Location = new Point(776, 7);\n            numericHibernateAfter.Margin = new Padding(5, 3, 5, 3);\n            numericHibernateAfter.Maximum = new decimal(new int[] { 3000000, 0, 0, 0 });\n            numericHibernateAfter.Name = \"numericHibernateAfter\";\n            numericHibernateAfter.Size = new Size(152, 39);\n            numericHibernateAfter.TabIndex = 1;\n            numericHibernateAfter.Unit = \"min\";\n            numericHibernateAfter.UnitFirst = false;\n            // \n            // labelHibernateAfter\n            // \n            labelHibernateAfter.AutoSize = true;\n            labelHibernateAfter.Location = new Point(59, 10);\n            labelHibernateAfter.Margin = new Padding(5, 0, 5, 0);\n            labelHibernateAfter.Name = \"labelHibernateAfter\";\n            labelHibernateAfter.Size = new Size(457, 32);\n            labelHibernateAfter.TabIndex = 45;\n            labelHibernateAfter.Text = \"Minutes till Hibernation in sleep (0 - OFF)\";\n            // \n            // pictureHibernate\n            // \n            pictureHibernate.BackgroundImage = Resources.icons8_hibernate_32;\n            pictureHibernate.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureHibernate.Location = new Point(21, 10);\n            pictureHibernate.Name = \"pictureHibernate\";\n            pictureHibernate.Size = new Size(32, 32);\n            pictureHibernate.TabIndex = 22;\n            pictureHibernate.TabStop = false;\n            // \n            // panelAPU\n            // \n            panelAPU.AutoSize = true;\n            panelAPU.Controls.Add(comboAPU);\n            panelAPU.Controls.Add(pictureAPUMem);\n            panelAPU.Controls.Add(labelAPUMem);\n            panelAPU.Dock = DockStyle.Top;\n            panelAPU.Location = new Point(15, 1135);\n            panelAPU.Name = \"panelAPU\";\n            panelAPU.Padding = new Padding(11, 5, 11, 0);\n            panelAPU.Size = new Size(949, 57);\n            panelAPU.TabIndex = 46;\n            panelAPU.Visible = false;\n            panelAPU.Paint += panelAPU_Paint;\n            // \n            // comboAPU\n            // \n            comboAPU.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            comboAPU.BorderColor = Color.White;\n            comboAPU.ButtonColor = SystemColors.ControlLight;\n            comboAPU.FlatStyle = FlatStyle.Flat;\n            comboAPU.Font = new Font(\"Segoe UI\", 9F);\n            comboAPU.FormattingEnabled = true;\n            comboAPU.ItemHeight = 32;\n            comboAPU.Items.AddRange(new object[] { \"Auto\", \"1G\", \"2G\", \"3G\", \"4G\", \"5G\", \"6G\", \"7G\", \"8G\" });\n            comboAPU.Location = new Point(618, 8);\n            comboAPU.Margin = new Padding(5, 11, 5, 9);\n            comboAPU.Name = \"comboAPU\";\n            comboAPU.Size = new Size(309, 40);\n            comboAPU.TabIndex = 12;\n            comboAPU.TabStop = false;\n            // \n            // pictureAPUMem\n            // \n            pictureAPUMem.BackgroundImage = Resources.icons8_video_48;\n            pictureAPUMem.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureAPUMem.Location = new Point(21, 11);\n            pictureAPUMem.Name = \"pictureAPUMem\";\n            pictureAPUMem.Size = new Size(32, 32);\n            pictureAPUMem.TabIndex = 1;\n            pictureAPUMem.TabStop = false;\n            // \n            // labelAPUMem\n            // \n            labelAPUMem.AutoSize = true;\n            labelAPUMem.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelAPUMem.Location = new Point(64, 11);\n            labelAPUMem.Name = \"labelAPUMem\";\n            labelAPUMem.Size = new Size(309, 32);\n            labelAPUMem.TabIndex = 0;\n            labelAPUMem.Text = \"Memory Assigned to GPU\";\n            // \n            // panelCores\n            // \n            panelCores.AutoSize = true;\n            panelCores.Controls.Add(buttonCores);\n            panelCores.Controls.Add(comboCoresP);\n            panelCores.Controls.Add(comboCoresE);\n            panelCores.Controls.Add(pictureCores);\n            panelCores.Controls.Add(label1);\n            panelCores.Dock = DockStyle.Top;\n            panelCores.Location = new Point(15, 1076);\n            panelCores.Name = \"panelCores\";\n            panelCores.Padding = new Padding(11, 5, 11, 0);\n            panelCores.Size = new Size(949, 59);\n            panelCores.TabIndex = 47;\n            panelCores.Visible = false;\n            // \n            // buttonCores\n            // \n            buttonCores.Activated = false;\n            buttonCores.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            buttonCores.BackColor = SystemColors.ButtonHighlight;\n            buttonCores.BorderColor = Color.Transparent;\n            buttonCores.BorderRadius = 2;\n            buttonCores.FlatStyle = FlatStyle.Flat;\n            buttonCores.Location = new Point(831, 7);\n            buttonCores.Margin = new Padding(5, 3, 5, 3);\n            buttonCores.Name = \"buttonCores\";\n            buttonCores.Secondary = false;\n            buttonCores.Size = new Size(106, 44);\n            buttonCores.TabIndex = 20;\n            buttonCores.Text = \"Apply\";\n            buttonCores.UseVisualStyleBackColor = false;\n            // \n            // comboCoresP\n            // \n            comboCoresP.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            comboCoresP.BorderColor = Color.White;\n            comboCoresP.ButtonColor = SystemColors.ControlLight;\n            comboCoresP.FlatStyle = FlatStyle.Flat;\n            comboCoresP.Font = new Font(\"Segoe UI\", 9F);\n            comboCoresP.FormattingEnabled = true;\n            comboCoresP.ItemHeight = 32;\n            comboCoresP.Location = new Point(513, 10);\n            comboCoresP.Margin = new Padding(5, 11, 5, 9);\n            comboCoresP.Name = \"comboCoresP\";\n            comboCoresP.Size = new Size(150, 40);\n            comboCoresP.TabIndex = 13;\n            comboCoresP.TabStop = false;\n            // \n            // comboCoresE\n            // \n            comboCoresE.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            comboCoresE.BorderColor = Color.White;\n            comboCoresE.ButtonColor = SystemColors.ControlLight;\n            comboCoresE.FlatStyle = FlatStyle.Flat;\n            comboCoresE.Font = new Font(\"Segoe UI\", 9F);\n            comboCoresE.FormattingEnabled = true;\n            comboCoresE.ItemHeight = 32;\n            comboCoresE.Location = new Point(674, 10);\n            comboCoresE.Margin = new Padding(5, 11, 5, 9);\n            comboCoresE.Name = \"comboCoresE\";\n            comboCoresE.Size = new Size(150, 40);\n            comboCoresE.TabIndex = 12;\n            comboCoresE.TabStop = false;\n            // \n            // pictureCores\n            // \n            pictureCores.BackgroundImage = Resources.icons8_processor_32;\n            pictureCores.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureCores.Location = new Point(21, 15);\n            pictureCores.Name = \"pictureCores\";\n            pictureCores.Size = new Size(32, 32);\n            pictureCores.TabIndex = 1;\n            pictureCores.TabStop = false;\n            // \n            // label1\n            // \n            label1.AutoSize = true;\n            label1.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            label1.Location = new Point(64, 14);\n            label1.Name = \"label1\";\n            label1.Size = new Size(299, 32);\n            label1.TabIndex = 0;\n            label1.Text = \"CPU Cores Configuration\";\n            // \n            // panelACPI\n            // \n            panelACPI.AutoSize = true;\n            panelACPI.Controls.Add(textACPIParam);\n            panelACPI.Controls.Add(textACPICommand);\n            panelACPI.Controls.Add(buttonACPISend);\n            panelACPI.Controls.Add(pictureDebug);\n            panelACPI.Controls.Add(labelACPITitle);\n            panelACPI.Dock = DockStyle.Top;\n            panelACPI.Location = new Point(15, 1007);\n            panelACPI.Name = \"panelACPI\";\n            panelACPI.Padding = new Padding(11, 5, 11, 0);\n            panelACPI.Size = new Size(949, 69);\n            panelACPI.TabIndex = 48;\n            panelACPI.Visible = false;\n            // \n            // textACPIParam\n            // \n            textACPIParam.Location = new Point(717, 18);\n            textACPIParam.Margin = new Padding(5, 3, 5, 3);\n            textACPIParam.Name = \"textACPIParam\";\n            textACPIParam.PlaceholderText = \"Value\";\n            textACPIParam.Size = new Size(127, 39);\n            textACPIParam.TabIndex = 22;\n            textACPIParam.TabStop = false;\n            // \n            // textACPICommand\n            // \n            textACPICommand.Location = new Point(467, 18);\n            textACPICommand.Margin = new Padding(5, 3, 5, 3);\n            textACPICommand.Name = \"textACPICommand\";\n            textACPICommand.PlaceholderText = \"Address\";\n            textACPICommand.Size = new Size(242, 39);\n            textACPICommand.TabIndex = 21;\n            textACPICommand.TabStop = false;\n            // \n            // buttonACPISend\n            // \n            buttonACPISend.Activated = false;\n            buttonACPISend.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;\n            buttonACPISend.BackColor = SystemColors.ButtonHighlight;\n            buttonACPISend.BorderColor = Color.Transparent;\n            buttonACPISend.BorderRadius = 2;\n            buttonACPISend.FlatStyle = FlatStyle.Flat;\n            buttonACPISend.Location = new Point(855, 13);\n            buttonACPISend.Margin = new Padding(5, 3, 5, 3);\n            buttonACPISend.Name = \"buttonACPISend\";\n            buttonACPISend.Secondary = false;\n            buttonACPISend.Size = new Size(106, 46);\n            buttonACPISend.TabIndex = 20;\n            buttonACPISend.Text = \"Send\";\n            buttonACPISend.UseVisualStyleBackColor = false;\n            // \n            // pictureDebug\n            // \n            pictureDebug.BackgroundImage = Resources.icons8_heartbeat_32;\n            pictureDebug.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureDebug.Location = new Point(21, 21);\n            pictureDebug.Name = \"pictureDebug\";\n            pictureDebug.Size = new Size(32, 32);\n            pictureDebug.TabIndex = 1;\n            pictureDebug.TabStop = false;\n            // \n            // labelACPITitle\n            // \n            labelACPITitle.AutoSize = true;\n            labelACPITitle.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelACPITitle.Location = new Point(57, 21);\n            labelACPITitle.Name = \"labelACPITitle\";\n            labelACPITitle.Size = new Size(188, 32);\n            labelACPITitle.TabIndex = 0;\n            labelACPITitle.Text = \"ACPI DEVS Test\";\n            // \n            // panelOptimalBrightness\n            // \n            panelOptimalBrightness.AutoSize = true;\n            panelOptimalBrightness.Controls.Add(comboOptimalBrightness);\n            panelOptimalBrightness.Controls.Add(pictureOptimalBrightness);\n            panelOptimalBrightness.Controls.Add(labelOptimalBrightness);\n            panelOptimalBrightness.Dock = DockStyle.Top;\n            panelOptimalBrightness.Location = new Point(15, 1192);\n            panelOptimalBrightness.Name = \"panelOptimalBrightness\";\n            panelOptimalBrightness.Padding = new Padding(11, 5, 11, 0);\n            panelOptimalBrightness.Size = new Size(949, 60);\n            panelOptimalBrightness.TabIndex = 49;\n            panelOptimalBrightness.Visible = false;\n            // \n            // comboOptimalBrightness\n            // \n            comboOptimalBrightness.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            comboOptimalBrightness.BorderColor = Color.White;\n            comboOptimalBrightness.ButtonColor = SystemColors.ControlLight;\n            comboOptimalBrightness.FlatStyle = FlatStyle.Flat;\n            comboOptimalBrightness.Font = new Font(\"Segoe UI\", 9F);\n            comboOptimalBrightness.FormattingEnabled = true;\n            comboOptimalBrightness.ItemHeight = 32;\n            comboOptimalBrightness.Items.AddRange(new object[] { \"Off\", \"On Always\", \"On Battery\" });\n            comboOptimalBrightness.Location = new Point(618, 11);\n            comboOptimalBrightness.Margin = new Padding(5, 11, 5, 9);\n            comboOptimalBrightness.Name = \"comboOptimalBrightness\";\n            comboOptimalBrightness.Size = new Size(309, 40);\n            comboOptimalBrightness.TabIndex = 12;\n            comboOptimalBrightness.TabStop = false;\n            // \n            // pictureOptimalBrightness\n            // \n            pictureOptimalBrightness.BackgroundImage = Resources.icons8_brightness_32;\n            pictureOptimalBrightness.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureOptimalBrightness.Location = new Point(21, 11);\n            pictureOptimalBrightness.Name = \"pictureOptimalBrightness\";\n            pictureOptimalBrightness.Size = new Size(32, 32);\n            pictureOptimalBrightness.TabIndex = 1;\n            pictureOptimalBrightness.TabStop = false;\n            // \n            // labelOptimalBrightness\n            // \n            labelOptimalBrightness.AutoSize = true;\n            labelOptimalBrightness.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelOptimalBrightness.Location = new Point(64, 10);\n            labelOptimalBrightness.Name = \"labelOptimalBrightness\";\n            labelOptimalBrightness.Size = new Size(323, 32);\n            labelOptimalBrightness.TabIndex = 0;\n            labelOptimalBrightness.Text = \"Optimal Display Brightness\";\n            // \n            // Extra\n            // \n            AutoScaleDimensions = new SizeF(192F, 192F);\n            AutoScaleMode = AutoScaleMode.Dpi;\n            AutoScroll = true;\n            AutoSize = true;\n            AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            ClientSize = new Size(1013, 1759);\n            Controls.Add(panelServices);\n            Controls.Add(panelPower);\n            Controls.Add(panelSettings);\n            Controls.Add(panelOptimalBrightness);\n            Controls.Add(panelAPU);\n            Controls.Add(panelCores);\n            Controls.Add(panelACPI);\n            Controls.Add(panelSettingsHeader);\n            Controls.Add(panelBacklight);\n            Controls.Add(panelBacklightHeader);\n            Controls.Add(panelBindings);\n            Controls.Add(panelBindingsHeader);\n            FormBorderStyle = FormBorderStyle.FixedSingle;\n            Margin = new Padding(5, 3, 5, 3);\n            MaximizeBox = false;\n            MdiChildrenMinimizedAnchorBottom = false;\n            MinimizeBox = false;\n            MinimumSize = new Size(1033, 71);\n            Name = \"Extra\";\n            Padding = new Padding(15);\n            ShowIcon = false;\n            ShowInTaskbar = false;\n            Text = \"Extra Settings\";\n            panelServices.ResumeLayout(false);\n            panelServices.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureService).EndInit();\n            panelBindingsHeader.ResumeLayout(false);\n            panelBindingsHeader.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureBindings).EndInit();\n            ((System.ComponentModel.ISupportInitialize)pictureHelp).EndInit();\n            panelBindings.ResumeLayout(false);\n            panelBindings.PerformLayout();\n            tableBindings.ResumeLayout(false);\n            tableBindings.PerformLayout();\n            panelBacklightHeader.ResumeLayout(false);\n            panelBacklightHeader.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureBacklight).EndInit();\n            panelBacklight.ResumeLayout(false);\n            panelBacklight.PerformLayout();\n            panelBacklightExtra.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)numericBacklightPluggedTime).EndInit();\n            ((System.ComponentModel.ISupportInitialize)numericBacklightTime).EndInit();\n            panelXGM.ResumeLayout(false);\n            panelXGM.PerformLayout();\n            tableBacklight.ResumeLayout(false);\n            panelSettingsHeader.ResumeLayout(false);\n            panelSettingsHeader.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureScan).EndInit();\n            ((System.ComponentModel.ISupportInitialize)pictureLog).EndInit();\n            ((System.ComponentModel.ISupportInitialize)pictureSettings).EndInit();\n            panelSettings.ResumeLayout(false);\n            panelSettings.PerformLayout();\n            panelPower.ResumeLayout(false);\n            panelPower.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)numericHibernateAfter).EndInit();\n            ((System.ComponentModel.ISupportInitialize)pictureHibernate).EndInit();\n            panelAPU.ResumeLayout(false);\n            panelAPU.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureAPUMem).EndInit();\n            panelCores.ResumeLayout(false);\n            panelCores.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureCores).EndInit();\n            panelACPI.ResumeLayout(false);\n            panelACPI.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureDebug).EndInit();\n            panelOptimalBrightness.ResumeLayout(false);\n            panelOptimalBrightness.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureOptimalBrightness).EndInit();\n            ResumeLayout(false);\n            PerformLayout();\n        }\n\n        #endregion\n        private Panel panelServices;\n        private RButton buttonServices;\n        private Label labelServices;\n        private Panel panelBindingsHeader;\n        private Panel panelBindings;\n        private TableLayoutPanel tableBindings;\n        private Label labelFNC;\n        private Label labelFNV;\n        private TextBox textM2;\n        private TextBox textM1;\n        private RComboBox comboM1;\n        private Label labelM1;\n        private RComboBox comboM4;\n        private RComboBox comboM3;\n        private TextBox textM4;\n        private TextBox textM3;\n        private Label labelM4;\n        private Label labelM3;\n        private Label labelM2;\n        private RComboBox comboM2;\n        private Label labelFNF4;\n        private RComboBox comboFNF4;\n        private TextBox textFNF4;\n        private RComboBox comboFNC;\n        private RComboBox comboFNV;\n        private TextBox textFNC;\n        private TextBox textFNV;\n        private PictureBox pictureHelp;\n        private TableLayoutPanel tableKeys;\n        private PictureBox pictureBindings;\n        private Label labelBindings;\n        private Panel panelBacklightHeader;\n        private Panel panelBacklight;\n        private Panel panelBacklightExtra;\n        private NumericUpDownWithUnit numericBacklightPluggedTime;\n        private NumericUpDownWithUnit numericBacklightTime;\n        private Label labelBacklightTimeout;\n        private Label labelSpeed;\n        private RComboBox comboKeyboardSpeed;\n        private Panel panelXGM;\n        private CheckBox checkXGM;\n        private TableLayoutPanel tableBacklight;\n        private Label labelBacklightKeyboard;\n        private CheckBox checkAwake;\n        private CheckBox checkBoot;\n        private CheckBox checkSleep;\n        private CheckBox checkShutdown;\n        private Label labelBacklightLogo;\n        private CheckBox checkAwakeLogo;\n        private CheckBox checkBootLogo;\n        private CheckBox checkSleepLogo;\n        private CheckBox checkShutdownLogo;\n        private Label labelBacklightBar;\n        private CheckBox checkAwakeBar;\n        private CheckBox checkBootBar;\n        private CheckBox checkSleepBar;\n        private CheckBox checkShutdownBar;\n        private Label labelBacklightLid;\n        private CheckBox checkAwakeLid;\n        private CheckBox checkBootLid;\n        private CheckBox checkSleepLid;\n        private CheckBox checkShutdownLid;\n        private Panel panelSettingsHeader;\n        private PictureBox pictureSettings;\n        private Label labelSettings;\n        private Panel panelSettings;\n        private CheckBox checkTopmost;\n        private CheckBox checkNoOverdrive;\n        private CheckBox checkUSBC;\n        private CheckBox checkGpuApps;\n        private PictureBox pictureBacklight;\n        private Label labelBacklightTitle;\n        private PictureBox pictureService;\n        private Slider sliderBrightness;\n        private PictureBox pictureLog;\n        private CheckBox checkAutoToggleClamshellMode;\n        private Label labelFNE;\n        private RComboBox comboFNE;\n        private TextBox textFNE;\n        private Slider slider1;\n        private Panel panelPower;\n        private PictureBox pictureHibernate;\n        private Label labelHibernateAfter;\n        private NumericUpDownWithUnit numericHibernateAfter;\n        private CheckBox checkGPUFix;\n        private ToolTip toolTip;\n        private CheckBox checkBootSound;\n        private Panel panelAPU;\n        private PictureBox pictureAPUMem;\n        private Label labelAPUMem;\n        private RComboBox comboAPU;\n        private PictureBox pictureScan;\n        private Panel panelCores;\n        private RComboBox comboCoresE;\n        private PictureBox pictureCores;\n        private Label label1;\n        private RComboBox comboCoresP;\n        private RButton buttonCores;\n        private Panel panelACPI;\n        private TextBox textACPIParam;\n        private TextBox textACPICommand;\n        private RButton buttonACPISend;\n        private PictureBox pictureDebug;\n        private Label labelACPITitle;\n        private CheckBox checkBWIcon;\n        private CheckBox checkStatusLed;\n        private CheckBox checkPerKeyRGB;\n        private CheckBox checkBatteryLogo;\n        private CheckBox checkBattery;\n        private CheckBox checkBatteryLid;\n        private CheckBox checkBatteryBar;\n        private CheckBox checkNVPlatform;\n        private Panel panelOptimalBrightness;\n        private RComboBox comboOptimalBrightness;\n        private PictureBox pictureOptimalBrightness;\n        private Label labelOptimalBrightness;\n    }\n}"
  },
  {
    "path": "app/Extra.cs",
    "content": "﻿using GHelper.Display;\nusing GHelper.Gpu.AMD;\nusing GHelper.Helpers;\nusing GHelper.Input;\nusing GHelper.Mode;\nusing GHelper.UI;\nusing GHelper.USB;\nusing System.Diagnostics;\n\nnamespace GHelper\n{\n    public partial class Extra : RForm\n    {\n\n        ClamshellModeControl clamshellControl = new ClamshellModeControl();\n\n        const string EMPTY = \"--------------\";\n\n\n        private void SetKeyCombo(ComboBox combo, TextBox txbox, string name)\n        {\n\n            Dictionary<string, string> customActions = new Dictionary<string, string>\n            {\n              {\"\", EMPTY},\n              {\"mute\", Properties.Strings.VolumeMute},\n              {\"screenshot\", Properties.Strings.PrintScreen},\n              {\"play\", Properties.Strings.PlayPause},\n              {\"aura\", Properties.Strings.ToggleAura},\n              {\"performance\", Properties.Strings.PerformanceMode},\n              {\"screen\", Properties.Strings.ToggleScreen},\n              {\"lock\", Properties.Strings.LockScreen},\n              {\"miniled\", Properties.Strings.ToggleMiniled},\n              {\"fnlock\", Properties.Strings.ToggleFnLock},\n              {\"brightness_down\", Properties.Strings.BrightnessDown},\n              {\"brightness_up\", Properties.Strings.BrightnessUp},\n              {\"visual\", Properties.Strings.VisualMode},\n              {\"touchscreen\", Properties.Strings.ToggleTouchscreen },\n              {\"micmute\", Properties.Strings.MuteMic},\n              {\"ghelper\", Properties.Strings.OpenGHelper},\n              {\"custom\", Properties.Strings.Custom}\n            };\n\n            if (AppConfig.IsDUO())\n            {\n                customActions.Add(\"screenpad_down\", Properties.Strings.ScreenPadDown);\n                customActions.Add(\"screenpad_up\", Properties.Strings.ScreenPadUp);\n            }\n\n            if (AppConfig.IsAlly())\n            {\n                customActions.Add(\"controller\", \"Controller Mode\");\n            }\n\n            switch (name)\n            {\n                case \"m1\":\n                    customActions[\"\"] = Properties.Strings.VolumeDown;\n                    break;\n                case \"m2\":\n                    customActions[\"\"] = Properties.Strings.VolumeUp;\n                    break;\n                case \"m3\":\n                    customActions[\"\"] = Properties.Strings.MuteMic;\n                    customActions.Remove(\"micmute\");\n                    break;\n                case \"m4\":\n                    customActions[\"\"] = Properties.Strings.OpenGHelper;\n                    customActions.Remove(\"ghelper\");\n                    break;\n                case \"fnf4\":\n                    customActions[\"\"] = Properties.Strings.ToggleAura;\n                    customActions.Remove(\"aura\");\n                    break;\n                case \"fnc\":\n                    customActions[\"\"] = Properties.Strings.ToggleFnLock;\n                    customActions.Remove(\"fnlock\");\n                    break;\n                case \"fnv\":\n                    customActions[\"\"] = Properties.Strings.VisualMode;\n                    customActions.Remove(\"visual\");\n                    break;\n                case \"fne\":\n                    customActions[\"\"] = \"Calculator\";\n                    break;\n                case \"paddle\":\n                    customActions[\"\"] = EMPTY;\n                    break;\n                case \"cc\":\n                    customActions[\"\"] = EMPTY;\n                    break;\n            }\n\n            combo.DropDownStyle = ComboBoxStyle.DropDownList;\n            combo.DataSource = new BindingSource(customActions, null);\n            combo.DisplayMember = \"Value\";\n            combo.ValueMember = \"Key\";\n\n            string action = AppConfig.GetString(name);\n\n            combo.SelectedValue = (action is not null) ? action : \"\";\n            if (combo.SelectedValue is null) combo.SelectedValue = \"\";\n\n            combo.SelectedValueChanged += delegate\n            {\n                if (combo.SelectedValue is not null)\n                    AppConfig.Set(name, combo.SelectedValue.ToString());\n\n                if (name == \"m1\" || name == \"m2\")\n                    Program.inputDispatcher.RegisterKeys();\n\n            };\n\n            txbox.Text = AppConfig.GetString(name + \"_custom\");\n            txbox.TextChanged += delegate\n            {\n                AppConfig.Set(name + \"_custom\", txbox.Text);\n            };\n        }\n\n        public Extra()\n        {\n            InitializeComponent();\n\n            labelBindings.Text = Properties.Strings.KeyBindings;\n            labelBacklightTitle.Text = Properties.Strings.LaptopBacklight;\n            labelSettings.Text = Properties.Strings.Other;\n\n            checkAwake.Text = Properties.Strings.Awake;\n            checkSleep.Text = Properties.Strings.Sleep;\n            checkBoot.Text = Properties.Strings.Boot;\n            checkShutdown.Text = Properties.Strings.Shutdown;\n            checkBootSound.Text = Properties.Strings.BootSound;\n            checkStatusLed.Text = Properties.Strings.LEDStatusIndicators;\n\n            labelSpeed.Text = Properties.Strings.AnimationSpeed;\n            //labelBrightness.Text = Properties.Strings.Brightness;\n\n            labelBacklightTimeout.Text = Properties.Strings.BacklightTimeout;\n            //labelBacklightTimeoutPlugged.Text = Properties.Strings.BacklightTimeoutPlugged;\n\n            checkGPUFix.Text = Properties.Strings.EnableGPUOnShutdown;\n            checkNoOverdrive.Text = Properties.Strings.DisableOverdrive;\n            checkTopmost.Text = Properties.Strings.WindowTop;\n            checkUSBC.Text = Properties.Strings.OptimizedUSBC;\n            checkAutoToggleClamshellMode.Text = Properties.Strings.ToggleClamshellMode;\n\n            labelBacklightKeyboard.Text = Properties.Strings.Keyboard;\n            labelBacklightBar.Text = Properties.Strings.Lightbar;\n            labelBacklightLid.Text = Properties.Strings.Lid;\n            labelBacklightLogo.Text = Properties.Strings.Logo;\n\n            checkGpuApps.Text = Properties.Strings.KillGpuApps;\n            checkBWIcon.Text = Properties.Strings.BWTrayIcon;\n            labelHibernateAfter.Text = Properties.Strings.HibernateAfter;\n\n            labelAPUMem.Text = Properties.Strings.APUMemory;\n\n            Text = Properties.Strings.ExtraSettings;\n\n            // Accessible Labels\n\n            panelServices.AccessibleName = Properties.Strings.AsusServicesRunning;\n            panelBindings.AccessibleName = Properties.Strings.KeyBindings;\n            tableBindings.AccessibleName = Properties.Strings.KeyBindings;\n\n            comboM1.AccessibleName = \"M1 Action\";\n            comboM2.AccessibleName = \"M2 Action\";\n            comboM3.AccessibleName = \"M3 Action\";\n            comboM4.AccessibleName = \"M4 Action\";\n            comboFNF4.AccessibleName = \"Fn+F4 Action\";\n            comboFNC.AccessibleName = \"Fn+C Action\";\n            comboFNV.AccessibleName = \"Fn+V Action\";\n            comboFNE.AccessibleName = \"Fn+Numpad Action\";\n\n            numericBacklightPluggedTime.AccessibleName = Properties.Strings.BacklightTimeoutPlugged;\n            numericBacklightTime.AccessibleName = Properties.Strings.BacklightTimeoutBattery;\n\n            comboKeyboardSpeed.AccessibleName = Properties.Strings.LaptopBacklight + \" \" + Properties.Strings.AnimationSpeed;\n            comboAPU.AccessibleName = Properties.Strings.LaptopBacklight + \" \" + Properties.Strings.AnimationSpeed;\n\n            checkBoot.AccessibleName = Properties.Strings.Boot + \" \" + Properties.Strings.LaptopBacklight;\n            checkAwake.AccessibleName = Properties.Strings.Awake + \" \" + Properties.Strings.LaptopBacklight;\n            checkSleep.AccessibleName = Properties.Strings.Sleep + \" \" + Properties.Strings.LaptopBacklight;\n            checkShutdown.AccessibleName = Properties.Strings.Shutdown + \" \" + Properties.Strings.LaptopBacklight;\n\n            panelSettings.AccessibleName = Properties.Strings.ExtraSettings;\n            numericHibernateAfter.AccessibleName = Properties.Strings.HibernateAfter;\n\n            if (AppConfig.IsARCNM())\n            {\n                labelM3.Text = \"FN+F6\";\n                labelM1.Visible = comboM1.Visible = textM1.Visible = false;\n                labelM2.Visible = comboM2.Visible = textM2.Visible = false;\n                labelM4.Visible = comboM4.Visible = textM4.Visible = false;\n                labelFNF4.Visible = comboFNF4.Visible = textFNF4.Visible = false;\n            }\n\n            if (AppConfig.NoMKeys())\n            {\n                labelM1.Text = \"FN+F2\";\n                labelM2.Text = \"FN+F3\";\n                labelM3.Text = \"FN+F4\";\n                labelM4.Visible = comboM4.Visible = textM4.Visible = AppConfig.IsM4Button();\n                labelFNF4.Visible = comboFNF4.Visible = textFNF4.Visible = false;\n            }\n\n            if (AppConfig.IsVivoZenPro())\n            {\n                labelM1.Visible = comboM1.Visible = textM1.Visible = false;\n                labelM2.Visible = comboM2.Visible = textM2.Visible = false;\n                labelM3.Visible = comboM3.Visible = textM3.Visible = false;\n                labelFNF4.Visible = comboFNF4.Visible = textFNF4.Visible = false;\n                labelM4.Text = \"FN+F12\";\n            }\n\n            if (AppConfig.MediaKeys())\n            {\n                labelFNF4.Visible = comboFNF4.Visible = textFNF4.Visible = false;\n            }\n\n            if (!AppConfig.IsTUF())\n            {\n                labelFNE.Visible = comboFNE.Visible = textFNE.Visible = false;\n            }\n\n            if (AppConfig.IsNoFNV())\n            {\n                labelFNV.Visible = comboFNV.Visible = textFNV.Visible = false;\n            }\n\n            if (Program.acpi.DeviceGet(AsusACPI.GPUEco) < 0)\n            {\n                checkGpuApps.Visible = false;\n                checkUSBC.Visible = false;\n            }\n\n            checkNoOverdrive.Visible = Program.acpi.IsOverdriveSupported();\n\n            // Change text and hide irrelevant options on the ROG Ally,\n            // which is a bit of a special case piece of hardware.\n            if (AppConfig.IsAlly())\n            {\n                labelM1.Visible = comboM1.Visible = textM1.Visible = false;\n                labelM2.Visible = comboM2.Visible = textM2.Visible = false;\n\n                // Re-label M3 and M4 and FNF4 to match the front labels.\n                labelM3.Text = \"Cmd Center\";\n                labelM4.Text = \"ROG\";\n                labelFNF4.Text = \"Back Paddles\";\n\n                // Hide all of the FN options, as the Ally has no special keyboard FN key.\n                labelFNC.Visible = false;\n                comboFNC.Visible = false;\n                textFNC.Visible = false;\n\n                labelFNV.Visible = false;\n                comboFNV.Visible = false;\n                textFNV.Visible = false;\n\n                SetKeyCombo(comboM3, textM3, \"cc\");\n                SetKeyCombo(comboM4, textM4, \"m4\");\n                SetKeyCombo(comboFNF4, textFNF4, \"paddle\");\n\n                checkGpuApps.Visible = false;\n                checkUSBC.Visible = false;\n                checkAutoToggleClamshellMode.Visible = false;\n\n                int apuMem = Program.acpi.GetAPUMem();\n                if (apuMem >= 0)\n                {\n                    panelAPU.Visible = true;\n                    comboAPU.DropDownStyle = ComboBoxStyle.DropDownList;\n                    comboAPU.SelectedIndex = apuMem;\n                }\n\n                comboAPU.SelectedIndexChanged += ComboAPU_SelectedIndexChanged;\n\n            }\n            else\n            {\n                SetKeyCombo(comboM1, textM1, \"m1\");\n                SetKeyCombo(comboM2, textM2, \"m2\");\n\n                SetKeyCombo(comboM3, textM3, \"m3\");\n                SetKeyCombo(comboM4, textM4, \"m4\");\n                SetKeyCombo(comboFNF4, textFNF4, \"fnf4\");\n\n                SetKeyCombo(comboFNC, textFNC, \"fnc\");\n                SetKeyCombo(comboFNV, textFNV, \"fnv\");\n                SetKeyCombo(comboFNE, textFNE, \"fne\");\n            }\n\n            if (AppConfig.IsStrix())\n            {\n                labelM4.Text = \"M5/ROG\";\n            }\n\n\n            InitTheme();\n            Shown += Keyboard_Shown;\n\n            comboKeyboardSpeed.DropDownStyle = ComboBoxStyle.DropDownList;\n            comboKeyboardSpeed.DataSource = new BindingSource(Aura.GetSpeeds(), null);\n            comboKeyboardSpeed.DisplayMember = \"Value\";\n            comboKeyboardSpeed.ValueMember = \"Key\";\n            comboKeyboardSpeed.SelectedValue = Aura.Speed;\n            comboKeyboardSpeed.SelectedValueChanged += ComboKeyboardSpeed_SelectedValueChanged;\n\n            // Keyboard\n            checkAwake.Checked = AppConfig.IsNotFalse(\"keyboard_awake\");\n            checkBattery.Checked = AppConfig.IsOnBattery(\"keyboard_awake\");\n            checkBoot.Checked = AppConfig.IsNotFalse(\"keyboard_boot\");\n            checkSleep.Checked = AppConfig.IsNotFalse(\"keyboard_sleep\");\n            checkShutdown.Checked = AppConfig.IsNotFalse(\"keyboard_shutdown\");\n\n            // Lightbar\n            checkAwakeBar.Checked = AppConfig.IsNotFalse(\"keyboard_awake_bar\");\n            checkBatteryBar.Checked = AppConfig.IsOnBattery(\"keyboard_awake_bar\");\n            checkBootBar.Checked = AppConfig.IsNotFalse(\"keyboard_boot_bar\");\n            checkSleepBar.Checked = AppConfig.IsNotFalse(\"keyboard_sleep_bar\");\n            checkShutdownBar.Checked = AppConfig.IsNotFalse(\"keyboard_shutdown_bar\");\n\n            // Lid\n            checkAwakeLid.Checked = AppConfig.IsNotFalse(\"keyboard_awake_lid\");\n            checkBatteryLid.Checked = AppConfig.IsOnBattery(\"keyboard_awake_lid\");\n            checkBootLid.Checked = AppConfig.IsNotFalse(\"keyboard_boot_lid\");\n            checkSleepLid.Checked = AppConfig.IsNotFalse(\"keyboard_sleep_lid\");\n            checkShutdownLid.Checked = AppConfig.IsNotFalse(\"keyboard_shutdown_lid\");\n\n            // Logo\n            checkAwakeLogo.Checked = AppConfig.IsNotFalse(\"keyboard_awake_logo\");\n            checkBatteryLogo.Checked = AppConfig.IsOnBattery(\"keyboard_awake_logo\");\n            checkBootLogo.Checked = AppConfig.IsNotFalse(\"keyboard_boot_logo\");\n            checkSleepLogo.Checked = AppConfig.IsNotFalse(\"keyboard_sleep_logo\");\n            checkShutdownLogo.Checked = AppConfig.IsNotFalse(\"keyboard_shutdown_logo\");\n\n            checkAwake.CheckedChanged += CheckPower_CheckedChanged;\n            checkBattery.CheckedChanged += CheckPower_CheckedChanged;\n            checkBoot.CheckedChanged += CheckPower_CheckedChanged;\n            checkSleep.CheckedChanged += CheckPower_CheckedChanged;\n            checkShutdown.CheckedChanged += CheckPower_CheckedChanged;\n\n            checkAwakeBar.CheckedChanged += CheckPower_CheckedChanged;\n            checkBatteryBar.CheckedChanged += CheckPower_CheckedChanged;\n            checkBootBar.CheckedChanged += CheckPower_CheckedChanged;\n            checkSleepBar.CheckedChanged += CheckPower_CheckedChanged;\n            checkShutdownBar.CheckedChanged += CheckPower_CheckedChanged;\n\n            checkAwakeLid.CheckedChanged += CheckPower_CheckedChanged;\n            checkBatteryLid.CheckedChanged += CheckPower_CheckedChanged;\n            checkBootLid.CheckedChanged += CheckPower_CheckedChanged;\n            checkSleepLid.CheckedChanged += CheckPower_CheckedChanged;\n            checkShutdownLid.CheckedChanged += CheckPower_CheckedChanged;\n\n            checkAwakeLogo.CheckedChanged += CheckPower_CheckedChanged;\n            checkBatteryLogo.CheckedChanged += CheckPower_CheckedChanged;\n            checkBootLogo.CheckedChanged += CheckPower_CheckedChanged;\n            checkSleepLogo.CheckedChanged += CheckPower_CheckedChanged;\n            checkShutdownLogo.CheckedChanged += CheckPower_CheckedChanged;\n\n            if (!AppConfig.IsBacklightZones() || AppConfig.IsStrixLimitedRGB() || AppConfig.IsARCNM())\n            {\n\n                if (!AppConfig.IsStrixLimitedRGB())\n                {\n                    labelBacklightBar.Visible = false;\n                    checkAwakeBar.Visible = false;\n                    checkBatteryBar.Visible = false;\n                    checkBootBar.Visible = false;\n                    checkSleepBar.Visible = false;\n                    checkShutdownBar.Visible = false;\n\n                    labelBacklightKeyboard.Visible = false;\n                    checkBattery.Visible = false;\n                }\n\n                labelBacklightLid.Visible = false;\n                checkAwakeLid.Visible = false;\n                checkBatteryLid.Visible = false;\n                checkBootLid.Visible = false;\n                checkSleepLid.Visible = false;\n                checkShutdownLid.Visible = false;\n\n                labelBacklightLogo.Visible = false;\n                checkAwakeLogo.Visible = false;\n                checkBatteryLogo.Visible = false;\n                checkBootLogo.Visible = false;\n                checkSleepLogo.Visible = false;\n                checkShutdownLogo.Visible = false;\n            }\n\n            if (AppConfig.IsZ13())\n            {\n                labelBacklightBar.Visible = false;\n                checkAwakeBar.Visible = false;\n                checkBatteryBar.Visible = false;\n                checkBootBar.Visible = false;\n                checkSleepBar.Visible = false;\n                checkShutdownBar.Visible = false;\n\n                labelBacklightLid.Visible = false;\n                checkAwakeLid.Visible = false;\n                checkBatteryLid.Visible = false;\n                checkBootLid.Visible = false;\n                checkSleepLid.Visible = false;\n                checkShutdownLid.Visible = false;\n            }\n\n            //checkAutoToggleClamshellMode.Visible = clamshellControl.IsExternalDisplayConnected();\n            checkAutoToggleClamshellMode.Checked = AppConfig.Is(\"toggle_clamshell_mode\");\n            checkAutoToggleClamshellMode.CheckedChanged += checkAutoToggleClamshellMode_CheckedChanged;\n\n            checkTopmost.Checked = AppConfig.Is(\"topmost\");\n            checkTopmost.CheckedChanged += CheckTopmost_CheckedChanged; ;\n\n            checkNoOverdrive.Checked = AppConfig.IsNoOverdrive();\n            checkNoOverdrive.CheckedChanged += CheckNoOverdrive_CheckedChanged;\n\n            checkUSBC.Checked = AppConfig.Is(\"optimized_usbc\");\n            checkUSBC.CheckedChanged += CheckUSBC_CheckedChanged;\n\n            sliderBrightness.Value = InputDispatcher.GetBacklight();\n            sliderBrightness.ValueChanged += SliderBrightness_ValueChanged;\n\n            panelXGM.Visible = XGM.IsConnected();\n            checkXGM.Checked = !(AppConfig.Get(\"xmg_light\") == 0);\n            checkXGM.CheckedChanged += CheckXGM_CheckedChanged;\n\n            numericBacklightTime.Value = AppConfig.Get(\"keyboard_timeout\", 60);\n            numericBacklightPluggedTime.Value = AppConfig.Get(\"keyboard_ac_timeout\", 0);\n\n            numericBacklightTime.ValueChanged += NumericBacklightTime_ValueChanged;\n            numericBacklightPluggedTime.ValueChanged += NumericBacklightTime_ValueChanged;\n\n            checkGpuApps.Checked = AppConfig.Is(\"kill_gpu_apps\");\n            checkGpuApps.CheckedChanged += CheckGpuApps_CheckedChanged;\n\n            int bootSound = Program.acpi.DeviceGet(AsusACPI.BootSound);\n            if (bootSound < 0 || bootSound > UInt16.MaxValue) bootSound = AppConfig.Get(\"boot_sound\", 0);\n\n            checkBootSound.Checked = (bootSound == 1);\n            checkBootSound.CheckedChanged += CheckBootSound_CheckedChanged;\n\n            var statusLed = Program.acpi.DeviceGet(AsusACPI.StatusLed);\n            checkStatusLed.Visible = statusLed >= 0;\n            checkStatusLed.Checked = (statusLed > 0);\n            checkStatusLed.CheckedChanged += CheckLEDStatus_CheckedChanged;\n\n            var optimalBrightness = ScreenControl.GetOptimalBrightness();\n            if (optimalBrightness >= 0)\n            {\n                panelOptimalBrightness.Visible = true;\n                comboOptimalBrightness.DropDownStyle = ComboBoxStyle.DropDownList;\n                comboOptimalBrightness.SelectedIndex = AppConfig.Get(\"optimal_brightness\", optimalBrightness);\n                comboOptimalBrightness.SelectedIndexChanged += OptimalBrightness_Changed;\n            }\n\n            checkBWIcon.Checked = AppConfig.IsBWIcon();\n            checkBWIcon.CheckedChanged += CheckBWIcon_CheckedChanged;\n\n            pictureHelp.Click += PictureHelp_Click;\n            buttonServices.Click += ButtonServices_Click;\n\n            pictureLog.Click += PictureLog_Click;\n\n            checkGPUFix.Visible = Program.acpi.IsNVidiaGPU();\n            checkGPUFix.Checked = AppConfig.IsGPUFix();\n            checkGPUFix.CheckedChanged += CheckGPUFix_CheckedChanged;\n\n            checkNVPlatform.Visible = Program.acpi.IsNVidiaGPU();\n            checkNVPlatform.Checked = AppConfig.IsNVPlatform();\n            checkNVPlatform.CheckedChanged += CheckNVPlatform_CheckedChanged;\n\n\n            checkPerKeyRGB.Visible = AppConfig.IsPossible4ZoneRGB();\n            checkPerKeyRGB.Checked = AppConfig.Is(\"per_key_rgb\");\n            checkPerKeyRGB.CheckedChanged += CheckPerKeyRGB_CheckedChanged;\n\n            toolTip.SetToolTip(checkAutoToggleClamshellMode, \"Disable sleep on lid close when plugged in and external monitor is connected\");\n            toolTip.SetToolTip(checkNVPlatform, \"Stops NVIDIA services when the discrete GPU is disabled\\nand restarts them automatically when the GPU is enabled\");\n\n            InitCores();\n            InitServices();\n            InitHibernate();\n\n            InitACPITesting();\n\n        }\n\n        private void CheckNVPlatform_CheckedChanged(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"nv_platform\", (checkNVPlatform.Checked ? 1 : 0));\n        }\n\n        private void OptimalBrightness_Changed(object? sender, EventArgs e)\n        {\n            ScreenControl.SetOptimalBrightness(comboOptimalBrightness.SelectedIndex);\n        }\n\n        private void CheckPerKeyRGB_CheckedChanged(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"per_key_rgb\", (checkPerKeyRGB.Checked ? 1 : 0));\n        }\n\n        private void CheckLEDStatus_CheckedChanged(object? sender, EventArgs e)\n        {\n            InputDispatcher.SetStatusLED(checkStatusLed.Checked);\n        }\n\n        private void CheckBWIcon_CheckedChanged(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"bw_icon\", (checkBWIcon.Checked ? 1 : 0));\n            Program.settingsForm.VisualiseIcon();\n        }\n\n        private void InitACPITesting()\n        {\n            if (!AppConfig.Is(\"debug\")) return;\n\n            pictureScan.Visible = true;\n            panelACPI.Visible = true;\n\n            textACPICommand.Text = \"120098\";\n            textACPIParam.Text = \"25\";\n\n            buttonACPISend.Click += ButtonACPISend_Click;\n            pictureScan.Click += PictureScan_Click;\n        }\n\n        private void ButtonACPISend_Click(object? sender, EventArgs e)\n        {\n            try\n            {\n                int deviceID = Convert.ToInt32(textACPICommand.Text, 16);\n                int status = Convert.ToInt32(textACPIParam.Text, textACPIParam.Text.Contains(\"x\") ? 16 : 10);\n                int result = Program.acpi.DeviceSet((uint)deviceID, status, \"TestACPI \" + deviceID.ToString(\"X8\") + \" \" + status.ToString(\"X4\"));\n                labelACPITitle.Text = \"ACPI DEVS Test : \" + result.ToString();\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine(ex.Message);\n            }\n        }\n\n        private void InitCores()\n        {\n            (int eCores, int pCores) = Program.acpi.GetCores();\n            (int eCoresMax, int pCoresMax) = Program.acpi.GetCores(true);\n\n            if (eCores < 0 || pCores < 0 || eCoresMax < 0 || pCoresMax < 0)\n            {\n                panelCores.Visible = false;\n                return;\n            }\n\n            if (eCoresMax == 0) eCoresMax = 8;\n            if (pCoresMax == 0) pCoresMax = 6;\n\n            if (AppConfig.Is8Ecores()) eCoresMax = Math.Max(8, eCoresMax);\n\n            eCoresMax = Math.Max(4, eCoresMax);\n            pCoresMax = Math.Max(6, pCoresMax);\n\n            panelCores.Visible = true;\n\n            comboCoresE.DropDownStyle = ComboBoxStyle.DropDownList;\n            comboCoresP.DropDownStyle = ComboBoxStyle.DropDownList;\n\n            for (int i = AsusACPI.PCoreMin; i <= pCoresMax; i++) comboCoresP.Items.Add(i.ToString() + \" Pcores\");\n            for (int i = AsusACPI.ECoreMin; i <= eCoresMax; i++) comboCoresE.Items.Add(i.ToString() + \" Ecores\");\n\n            comboCoresP.SelectedIndex = Math.Max(Math.Min(pCores - AsusACPI.PCoreMin, comboCoresP.Items.Count - 1), 0);\n            comboCoresE.SelectedIndex = Math.Max(Math.Min(eCores - AsusACPI.ECoreMin, comboCoresE.Items.Count - 1), 0);\n\n            buttonCores.Click += ButtonCores_Click;\n\n        }\n\n        private void ButtonCores_Click(object? sender, EventArgs e)\n        {\n            DialogResult dialogResult = MessageBox.Show(Properties.Strings.AlertAPUMemoryRestart, Properties.Strings.AlertAPUMemoryRestartTitle, MessageBoxButtons.YesNo);\n\n            if (dialogResult == DialogResult.Yes)\n            {\n                Program.acpi.SetCores(AsusACPI.ECoreMin + comboCoresE.SelectedIndex, AsusACPI.PCoreMin + comboCoresP.SelectedIndex);\n                Process.Start(\"shutdown\", \"/r /t 1\");\n            }\n        }\n\n\n        private void PictureScan_Click(object? sender, EventArgs e)\n        {\n            string logFile = Program.acpi.ScanRange();\n            new Process\n            {\n                StartInfo = new ProcessStartInfo(logFile)\n                {\n                    UseShellExecute = true\n                }\n            }.Start();\n        }\n\n        private void ComboAPU_SelectedIndexChanged(object? sender, EventArgs e)\n        {\n            int mem = comboAPU.SelectedIndex;\n            Program.acpi.SetAPUMem(mem);\n\n            DialogResult dialogResult = MessageBox.Show(Properties.Strings.AlertAPUMemoryRestart, Properties.Strings.AlertAPUMemoryRestartTitle, MessageBoxButtons.YesNo);\n            if (dialogResult == DialogResult.Yes)\n            {\n                Process.Start(\"shutdown\", \"/r /t 1\");\n            }\n\n        }\n\n        private void CheckBootSound_CheckedChanged(object? sender, EventArgs e)\n        {\n            int bootSound = checkBootSound.Checked ? 1 : 0;\n            Program.acpi.DeviceSet(AsusACPI.BootSound, bootSound, \"BootSound\");\n            AppConfig.Set(\"boot_sound\", bootSound);\n        }\n\n        private void CheckGPUFix_CheckedChanged(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"gpu_fix\", (checkGPUFix.Checked ? 1 : 0));\n        }\n\n        private void InitHibernate()\n        {\n            try\n            {\n                int hibernate = PowerNative.GetHibernateAfter();\n                if (hibernate < 0 || hibernate > numericHibernateAfter.Maximum) hibernate = 0;\n                numericHibernateAfter.Value = hibernate;\n                numericHibernateAfter.ValueChanged += NumericHibernateAfter_ValueChanged;\n\n            }\n            catch (Exception ex)\n            {\n                panelPower.Visible = false;\n                Logger.WriteLine(ex.ToString());\n            }\n\n        }\n\n        private void NumericHibernateAfter_ValueChanged(object? sender, EventArgs e)\n        {\n            PowerNative.SetHibernateAfter((int)numericHibernateAfter.Value);\n        }\n\n        private void PictureLog_Click(object? sender, EventArgs e)\n        {\n            new Process\n            {\n                StartInfo = new ProcessStartInfo(Logger.logFile)\n                {\n                    UseShellExecute = true\n                }\n            }.Start();\n        }\n\n        private void SliderBrightness_ValueChanged(object? sender, EventArgs e)\n        {\n            bool onBattery = SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Online;\n\n            if (onBattery)\n                AppConfig.Set(\"keyboard_brightness_ac\", sliderBrightness.Value);\n            else\n                AppConfig.Set(\"keyboard_brightness\", sliderBrightness.Value);\n\n            Aura.ApplyBrightness(sliderBrightness.Value, \"Slider\");\n        }\n\n        private void InitServices()\n        {\n\n            int servicesCount = AsusService.GetRunningCount();\n\n            if (servicesCount > 0)\n            {\n                buttonServices.Text = Properties.Strings.Stop;\n                labelServices.ForeColor = colorTurbo;\n            }\n            else\n            {\n                buttonServices.Text = Properties.Strings.Start;\n                labelServices.ForeColor = colorStandard;\n            }\n\n            labelServices.Text = Properties.Strings.AsusServicesRunning + \":  \" + servicesCount;\n            buttonServices.Enabled = true;\n\n        }\n\n        public void ServiesToggle()\n        {\n            buttonServices.Enabled = false;\n\n            if (AsusService.GetRunningCount() > 0)\n            {\n                labelServices.Text = Properties.Strings.StoppingServices + \" ...\";\n                Task.Run(() =>\n                {\n                    AsusService.StopAsusServices();\n                    BeginInvoke(delegate\n                    {\n                        InitServices();\n                    });\n                    Program.inputDispatcher.Init();\n                });\n            }\n            else\n            {\n                labelServices.Text = Properties.Strings.StartingServices + \" ...\";\n                Task.Run(() =>\n                {\n                    AsusService.StartAsusServices();\n                    BeginInvoke(delegate\n                    {\n                        InitServices();\n                    });\n                });\n            }\n        }\n\n        private void ButtonServices_Click(object? sender, EventArgs e)\n        {\n            if (ProcessHelper.IsUserAdministrator())\n                ServiesToggle();\n            else\n                ProcessHelper.RunAsAdmin(\"services\");\n        }\n\n        private void CheckGpuApps_CheckedChanged(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"kill_gpu_apps\", (checkGpuApps.Checked ? 1 : 0));\n        }\n\n        private void NumericBacklightTime_ValueChanged(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"keyboard_timeout\", (int)numericBacklightTime.Value);\n            AppConfig.Set(\"keyboard_ac_timeout\", (int)numericBacklightPluggedTime.Value);\n            Program.inputDispatcher.InitBacklightTimer();\n        }\n\n        private void CheckXGM_CheckedChanged(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"xmg_light\", (checkXGM.Checked ? 1 : 0));\n            XGM.Light(checkXGM.Checked);\n        }\n\n        private void CheckUSBC_CheckedChanged(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"optimized_usbc\", (checkUSBC.Checked ? 1 : 0));\n        }\n\n        private void PictureHelp_Click(object? sender, EventArgs e)\n        {\n            Process.Start(new ProcessStartInfo(\"https://github.com/seerge/g-helper/wiki/Power-user-settings#custom-hotkey-actions\") { UseShellExecute = true });\n        }\n\n        private void CheckNoOverdrive_CheckedChanged(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"no_overdrive\", (checkNoOverdrive.Checked ? 1 : 0));\n            ScreenControl.AutoScreen(true);\n        }\n\n\n        private void CheckTopmost_CheckedChanged(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"topmost\", (checkTopmost.Checked ? 1 : 0));\n            Program.settingsForm.TopMost = checkTopmost.Checked;\n        }\n\n        private void CheckPower_CheckedChanged(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"keyboard_awake\", (checkAwake.Checked ? 1 : 0));\n            AppConfig.Set(\"keyboard_boot\", (checkBoot.Checked ? 1 : 0));\n            AppConfig.Set(\"keyboard_sleep\", (checkSleep.Checked ? 1 : 0));\n            AppConfig.Set(\"keyboard_shutdown\", (checkShutdown.Checked ? 1 : 0));\n\n            AppConfig.Set(\"keyboard_awake_bar\", (checkAwakeBar.Checked ? 1 : 0));\n            AppConfig.Set(\"keyboard_boot_bar\", (checkBootBar.Checked ? 1 : 0));\n            AppConfig.Set(\"keyboard_sleep_bar\", (checkSleepBar.Checked ? 1 : 0));\n            AppConfig.Set(\"keyboard_shutdown_bar\", (checkShutdownBar.Checked ? 1 : 0));\n\n            AppConfig.Set(\"keyboard_awake_lid\", (checkAwakeLid.Checked ? 1 : 0));\n            AppConfig.Set(\"keyboard_boot_lid\", (checkBootLid.Checked ? 1 : 0));\n            AppConfig.Set(\"keyboard_sleep_lid\", (checkSleepLid.Checked ? 1 : 0));\n            AppConfig.Set(\"keyboard_shutdown_lid\", (checkShutdownLid.Checked ? 1 : 0));\n\n            AppConfig.Set(\"keyboard_awake_logo\", (checkAwakeLogo.Checked ? 1 : 0));\n            AppConfig.Set(\"keyboard_boot_logo\", (checkBootLogo.Checked ? 1 : 0));\n            AppConfig.Set(\"keyboard_sleep_logo\", (checkSleepLogo.Checked ? 1 : 0));\n            AppConfig.Set(\"keyboard_shutdown_logo\", (checkShutdownLogo.Checked ? 1 : 0));\n\n            if (AppConfig.IsBacklightZones())\n            {\n                AppConfig.Set(\"keyboard_awake_bat\", (checkBattery.Checked ? 1 : 0));\n                AppConfig.Set(\"keyboard_awake_bar_bat\", (checkBatteryBar.Checked ? 1 : 0));\n                AppConfig.Set(\"keyboard_awake_lid_bat\", (checkBatteryLid.Checked ? 1 : 0));\n                AppConfig.Set(\"keyboard_awake_logo_bat\", (checkBatteryLogo.Checked ? 1 : 0));\n            }\n\n            Aura.ApplyPower();\n\n        }\n\n        private void ComboKeyboardSpeed_SelectedValueChanged(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"aura_speed\", (int)comboKeyboardSpeed.SelectedValue);\n            Aura.ApplyAura();\n        }\n\n\n        private void Keyboard_Shown(object? sender, EventArgs e)\n        {\n            if (Height > Program.settingsForm.Height)\n            {\n                var top = Program.settingsForm.Top + Program.settingsForm.Height - Height;\n\n                if (top < 0)\n                {\n                    MaximumSize = new Size(Width, Program.settingsForm.Height);\n                    Top = Program.settingsForm.Top;\n                }\n                else\n                {\n                    Top = top;\n                }\n\n            }\n            else\n            {\n                Top = Program.settingsForm.Top;\n            }\n\n            Left = Program.settingsForm.Left - Width - 5;\n        }\n\n\n        private void checkAutoToggleClamshellMode_CheckedChanged(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"toggle_clamshell_mode\", checkAutoToggleClamshellMode.Checked ? 1 : 0);\n\n            if (checkAutoToggleClamshellMode.Checked)\n            {\n                clamshellControl.ToggleLidAction();\n            }\n            else\n            {\n                ClamshellModeControl.DisableClamshellMode();\n            }\n\n        }\n\n        private void panelAPU_Paint(object sender, PaintEventArgs e)\n        {\n\n        }\n    }\n}\n"
  },
  {
    "path": "app/Extra.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!--\n    Microsoft ResX Schema\n\n    Version 2.0\n\n    The primary goals of this format is to allow a simple XML format\n    that is mostly human readable. The generation and parsing of the\n    various data types are done through the TypeConverter classes\n    associated with the data types.\n\n    Example:\n\n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n\n    There are any number of \"resheader\" rows that contain simple\n    name/value pairs.\n\n    Each data row contains a name, and value. The row also contains a\n    type or mimetype. Type corresponds to a .NET class that support\n    text/value conversion through the TypeConverter architecture.\n    Classes that don't support this are serialized and stored with the\n    mimetype set.\n\n    The mimetype is used for serialized objects, and tells the\n    ResXResourceReader how to depersist the object. This is currently not\n    extensible. For a given mimetype the value must be set accordingly:\n\n    Note - application/x-microsoft.net.object.binary.base64 is the format\n    that the ResXResourceWriter will generate, however the reader can\n    read any of the formats listed below.\n\n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array\n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"toolTip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <metadata name=\"$this.TrayHeight\" type=\"System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>73</value>\n  </metadata>\n</root>"
  },
  {
    "path": "app/Fan/FanSensorControl.cs",
    "content": "﻿using GHelper.Mode;\n\nnamespace GHelper.Fan\n{\n    public class FanSensorControl\n    {\n        public const int DEFAULT_FAN_MIN = 18;\n        public const int DEFAULT_FAN_MAX = 58;\n\n        public const int XGM_FAN_MAX = 72;\n\n        public const int INADEQUATE_MAX = 104;\n\n        const int FAN_COUNT = 3;\n\n        Fans fansForm;\n        ModeControl modeControl = Program.modeControl;\n\n        static int[] measuredMax;\n        static int sameCount = 0;\n\n        static System.Timers.Timer timer = default!;\n\n        static int[] _fanMax = InitFanMax();\n        static int[] _fanMin = GetDefaultMin();\n        static bool _fanRpm = AppConfig.IsNotFalse(\"fan_rpm\");\n\n        public FanSensorControl(Fans fansForm)\n        {\n            this.fansForm = fansForm;\n            timer = new System.Timers.Timer(1000);\n            timer.Elapsed += Timer_Elapsed;\n        }\n\n        static int[] InitFanMax()\n        {\n            int[] defaultMax = GetDefaultMax();\n\n            return new int[3] {\n                AppConfig.Get(\"fan_max_\" + (int)AsusFan.CPU, defaultMax[(int)AsusFan.CPU]),\n                AppConfig.Get(\"fan_max_\" + (int)AsusFan.GPU, defaultMax[(int)AsusFan.GPU]),\n                AppConfig.Get(\"fan_max_\" + (int)AsusFan.Mid, defaultMax[(int)AsusFan.Mid])\n            };\n        }\n\n\n        static int[] GetDefaultMax()\n        {\n            if (AppConfig.ContainsModel(\"GA401I\")) return new int[3] { 78, 76, DEFAULT_FAN_MAX };\n            if (AppConfig.ContainsModel(\"GA401\")) return new int[3] { 71, 73, DEFAULT_FAN_MAX };\n            if (AppConfig.ContainsModel(\"GA402\")) return new int[3] { 55, 56, DEFAULT_FAN_MAX };\n\n            if (AppConfig.ContainsModel(\"G513R\")) return new int[3] { 58, 60, DEFAULT_FAN_MAX };\n            if (AppConfig.ContainsModel(\"G513Q\")) return new int[3] { 69, 69, DEFAULT_FAN_MAX };\n            if (AppConfig.ContainsModel(\"GA503\")) return new int[3] { 64, 64, DEFAULT_FAN_MAX };\n\n            if (AppConfig.ContainsModel(\"GU603\")) return new int[3] { 62, 64, DEFAULT_FAN_MAX };\n\n            if (AppConfig.ContainsModel(\"FA507R\")) return new int[3] { 63, 57, DEFAULT_FAN_MAX };\n            if (AppConfig.ContainsModel(\"FA507X\")) return new int[3] { 63, 68, DEFAULT_FAN_MAX };\n\n            if (AppConfig.ContainsModel(\"FX607J\")) return new int[3] { 74, 72, DEFAULT_FAN_MAX };\n\n            if (AppConfig.ContainsModel(\"GX650\")) return new int[3] { 62, 62, DEFAULT_FAN_MAX };\n\n            if (AppConfig.ContainsModel(\"G732\")) return new int[3] { 61, 60, DEFAULT_FAN_MAX };\n            if (AppConfig.ContainsModel(\"G713\")) return new int[3] { 56, 60, DEFAULT_FAN_MAX };\n\n            if (AppConfig.ContainsModel(\"Z301\")) return new int[3] { 72, 64, DEFAULT_FAN_MAX };\n\n            if (AppConfig.ContainsModel(\"GV601\")) return new int[3] { 78, 59, 85 };\n\n            if (AppConfig.ContainsModel(\"GA403\")) return new int[3] { 68, 68, 80 };\n            if (AppConfig.ContainsModel(\"GU605\")) return new int[3] { 62, 62, 92 };\n\n            return new int[3] { DEFAULT_FAN_MAX, DEFAULT_FAN_MAX, DEFAULT_FAN_MAX };\n        }\n\n        static int[] GetDefaultMin()\n        {\n            if (AppConfig.ContainsModel(\"GA403\")) return new int[3] { 22, 22, 22 };\n            if (AppConfig.ContainsModel(\"GU605\")) return new int[3] { 22, 22, 22 };\n            return new int[3] { DEFAULT_FAN_MIN, DEFAULT_FAN_MIN, DEFAULT_FAN_MIN };\n        }\n\n        public static int GetFanMax(AsusFan device)\n        {\n            if (device == AsusFan.XGM) return XGM_FAN_MAX;\n\n            if (_fanMax[(int)device] < 0 || _fanMax[(int)device] > INADEQUATE_MAX)\n                SetFanMax(device, DEFAULT_FAN_MAX);\n\n            return _fanMax[(int)device];\n        }\n\n        public static int GetFanMin(AsusFan device)\n        {\n            if (device == AsusFan.XGM) return DEFAULT_FAN_MIN;\n            return _fanMin[(int)device];\n        }\n\n        public static void SetFanMax(AsusFan device, int value)\n        {\n            _fanMax[(int)device] = value;\n            AppConfig.Set(\"fan_max_\" + (int)device, value);\n        }\n\n        public static bool fanRpm\n        {\n            get\n            {\n                return _fanRpm;\n            }\n            set\n            {\n                AppConfig.Set(\"fan_rpm\", value ? 1 : 0);\n                _fanRpm = value;\n            }\n        }\n\n        public static string FormatFan(AsusFan device, int value)\n        {\n            if (value < 0) return null;\n\n            if (value > GetFanMax(device) && value <= INADEQUATE_MAX) SetFanMax(device, value);\n\n            if (fanRpm)\n                return Properties.Strings.FanSpeed + \": \" + (value * 100).ToString() + \"RPM\";\n            else\n                return Properties.Strings.FanSpeed + \": \" + Math.Min(Math.Round((float)value / GetFanMax(device) * 100), 100).ToString() + \"%\"; // relatively to max RPM\n        }\n\n        public void StartCalibration()\n        {\n\n            measuredMax = new int[] { 0, 0, 0 };\n            timer.Enabled = true;\n\n            for (int i = 0; i < FAN_COUNT; i++)\n                AppConfig.Remove(\"fan_max_\" + i);\n\n            Program.acpi.DeviceSet(AsusACPI.PerformanceMode, AsusACPI.PerformanceTurbo, \"ModeCalibration\");\n\n            for (int i = 0; i < FAN_COUNT; i++)\n                Program.acpi.SetFanCurve((AsusFan)i, new byte[] { 20, 30, 40, 50, 60, 70, 80, 90, 100, 100, 100, 100, 100, 100, 100, 100 });\n\n        }\n\n        private void Timer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)\n        {\n            int fan;\n            bool same = true;\n\n            for (int i = 0; i < FAN_COUNT; i++)\n            {\n                fan = Program.acpi.GetFan((AsusFan)i);\n                if (fan > measuredMax[i])\n                {\n                    measuredMax[i] = fan;\n                    same = false;\n                }\n            }\n\n            if (same) sameCount++;\n            else sameCount = 0;\n\n            string label = \"Measuring Max Speed - CPU: \" + measuredMax[(int)AsusFan.CPU] * 100 + \", GPU: \" + measuredMax[(int)AsusFan.GPU] * 100;\n            if (measuredMax[(int)AsusFan.Mid] > 10) label = label + \", Mid: \" + measuredMax[(int)AsusFan.Mid] * 100;\n            label = label + \" (\" + sameCount + \"s)\";\n\n            fansForm.LabelFansResult(label);\n\n            if (sameCount >= 15)\n            {\n                for (int i = 0; i < FAN_COUNT; i++)\n                {\n                    if (measuredMax[i] > 30 && measuredMax[i] < INADEQUATE_MAX) SetFanMax((AsusFan)i, measuredMax[i]);\n                }\n\n                sameCount = 0;\n                FinishCalibration();\n            }\n\n        }\n\n        private void FinishCalibration()\n        {\n\n            timer.Enabled = false;\n            modeControl.SetPerformanceMode();\n\n            string label = \"Measured - CPU: \" + AppConfig.Get(\"fan_max_\" + (int)AsusFan.CPU) * 100;\n\n            if (AppConfig.Get(\"fan_max_\" + (int)AsusFan.GPU) > 0)\n                label = label + \", GPU: \" + AppConfig.Get(\"fan_max_\" + (int)AsusFan.GPU) * 100;\n\n            if (AppConfig.Get(\"fan_max_\" + (int)AsusFan.Mid) > 0)\n                label = label + \", Mid: \" + AppConfig.Get(\"fan_max_\" + (int)AsusFan.Mid) * 100;\n\n            fansForm.LabelFansResult(label);\n            fansForm.InitAxis();\n        }\n    }\n}\n"
  },
  {
    "path": "app/Fans.Designer.cs",
    "content": "﻿using GHelper.UI;\nusing System.Windows.Forms.DataVisualization.Charting;\n\nnamespace GHelper\n{\n    partial class Fans\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            ChartArea chartArea1 = new ChartArea();\n            Title title1 = new Title();\n            ChartArea chartArea2 = new ChartArea();\n            Title title2 = new Title();\n            ChartArea chartArea3 = new ChartArea();\n            Title title3 = new Title();\n            ChartArea chartArea4 = new ChartArea();\n            Title title4 = new Title();\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Fans));\n            panelFans = new Panel();\n            checkFanClamp = new RCheckBox();\n            labelTip = new Label();\n            tableFanCharts = new TableLayoutPanel();\n            chartGPU = new Chart();\n            chartCPU = new Chart();\n            chartXGM = new Chart();\n            chartMid = new Chart();\n            panelTitleFans = new Panel();\n            tableLayoutModes = new TableLayoutPanel();\n            buttonRemove = new RButton();\n            buttonAdd = new RButton();\n            buttonRename = new RButton();\n            comboModes = new RComboBox();\n            picturePerf = new PictureBox();\n            labelFans = new Label();\n            panelApplyFans = new Panel();\n            buttonCalibrate = new RButton();\n            labelFansResult = new Label();\n            checkApplyFans = new RCheckBox();\n            buttonReset = new RButton();\n            comboBoost = new RComboBox();\n            panelSliders = new Panel();\n            panelAdvanced = new Panel();\n            panelAdvancedAlways = new Panel();\n            checkApplyUV = new RCheckBox();\n            panelAdvancedApply = new Panel();\n            buttonApplyAdvanced = new RButton();\n            labelRisky = new Label();\n            panelUViGPU = new Panel();\n            labelUViGPU = new Label();\n            labelLeftUViGPU = new Label();\n            trackUViGPU = new TrackBar();\n            panelUV = new Panel();\n            labelUV = new Label();\n            labelLeftUV = new Label();\n            trackUV = new TrackBar();\n            panelTitleAdvanced = new Panel();\n            pictureUV = new PictureBox();\n            labelTitleUV = new Label();\n            panelTemperature = new Panel();\n            labelTemp = new Label();\n            labelLeftTemp = new Label();\n            trackTemp = new TrackBar();\n            panelTitleTemp = new Panel();\n            pictureTemp = new PictureBox();\n            labelTempLimit = new Label();\n            panelDownload = new Panel();\n            buttonDownload = new RButton();\n            panelPower = new Panel();\n            panelApplyPower = new Panel();\n            checkApplyPower = new RCheckBox();\n            panelCPU = new Panel();\n            labelCPU = new Label();\n            labelLeftCPU = new Label();\n            trackCPU = new TrackBar();\n            panelFast = new Panel();\n            labelFast = new Label();\n            labelLeftFast = new Label();\n            trackFast = new TrackBar();\n            panelSlow = new Panel();\n            labelSlow = new Label();\n            labelLeftSlow = new Label();\n            trackSlow = new TrackBar();\n            panelTotal = new Panel();\n            labelTotal = new Label();\n            labelLeftTotal = new Label();\n            trackTotal = new TrackBar();\n            panelTitleCPU = new Panel();\n            pictureBoxCPU = new PictureBox();\n            labelPowerLimits = new Label();\n            panelBoost = new Panel();\n            panelBoostTitle = new Panel();\n            pictureBoost = new PictureBox();\n            labelBoost = new Label();\n            panelPowerMode = new Panel();\n            comboPowerMode = new RComboBox();\n            panelPowerModeTItle = new Panel();\n            picturePowerMode = new PictureBox();\n            labelPowerModeTitle = new Label();\n            panelGPU = new Panel();\n            panelGPUTemp = new Panel();\n            labelGPUTemp = new Label();\n            labelGPUTempTitle = new Label();\n            trackGPUTemp = new TrackBar();\n            panelGPUBoost = new Panel();\n            labelGPUBoost = new Label();\n            labelGPUBoostTitle = new Label();\n            trackGPUBoost = new TrackBar();\n            panelGPUPower = new Panel();\n            labelGPUPower = new Label();\n            labelGPUPowerTitle = new Label();\n            trackGPUPower = new TrackBar();\n            panelGPUMemory = new Panel();\n            labelGPUMemory = new Label();\n            labelGPUMemoryTitle = new Label();\n            trackGPUMemory = new TrackBar();\n            panelGPUCore = new Panel();\n            labelGPUCore = new Label();\n            trackGPUCore = new TrackBar();\n            labelGPUCoreTitle = new Label();\n            panelGPUClockLimit = new Panel();\n            labelGPUClockLimit = new Label();\n            trackGPUClockLimit = new TrackBar();\n            labelGPUClockLimitTitle = new Label();\n            panelTitleGPU = new Panel();\n            pictureGPU = new PictureBox();\n            labelGPU = new Label();\n            panelNav = new Panel();\n            tableNav = new TableLayoutPanel();\n            buttonAdvanced = new RButton();\n            buttonGPU = new RButton();\n            buttonCPU = new RButton();\n            panelFans.SuspendLayout();\n            tableFanCharts.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)chartGPU).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)chartCPU).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)chartXGM).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)chartMid).BeginInit();\n            panelTitleFans.SuspendLayout();\n            tableLayoutModes.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)picturePerf).BeginInit();\n            panelApplyFans.SuspendLayout();\n            panelSliders.SuspendLayout();\n            panelAdvanced.SuspendLayout();\n            panelAdvancedAlways.SuspendLayout();\n            panelAdvancedApply.SuspendLayout();\n            panelUViGPU.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)trackUViGPU).BeginInit();\n            panelUV.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)trackUV).BeginInit();\n            panelTitleAdvanced.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureUV).BeginInit();\n            panelTemperature.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)trackTemp).BeginInit();\n            panelTitleTemp.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureTemp).BeginInit();\n            panelDownload.SuspendLayout();\n            panelPower.SuspendLayout();\n            panelApplyPower.SuspendLayout();\n            panelCPU.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)trackCPU).BeginInit();\n            panelFast.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)trackFast).BeginInit();\n            panelSlow.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)trackSlow).BeginInit();\n            panelTotal.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)trackTotal).BeginInit();\n            panelTitleCPU.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureBoxCPU).BeginInit();\n            panelBoost.SuspendLayout();\n            panelBoostTitle.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureBoost).BeginInit();\n            panelPowerMode.SuspendLayout();\n            panelPowerModeTItle.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)picturePowerMode).BeginInit();\n            panelGPU.SuspendLayout();\n            panelGPUTemp.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)trackGPUTemp).BeginInit();\n            panelGPUBoost.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)trackGPUBoost).BeginInit();\n            panelGPUPower.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)trackGPUPower).BeginInit();\n            panelGPUMemory.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)trackGPUMemory).BeginInit();\n            panelGPUCore.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)trackGPUCore).BeginInit();\n            panelGPUClockLimit.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)trackGPUClockLimit).BeginInit();\n            panelTitleGPU.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureGPU).BeginInit();\n            panelNav.SuspendLayout();\n            tableNav.SuspendLayout();\n            SuspendLayout();\n            // \n            // panelFans\n            // \n            panelFans.AutoSize = true;\n            panelFans.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelFans.Controls.Add(checkFanClamp);\n            panelFans.Controls.Add(labelTip);\n            panelFans.Controls.Add(tableFanCharts);\n            panelFans.Controls.Add(panelTitleFans);\n            panelFans.Controls.Add(panelApplyFans);\n            panelFans.Dock = DockStyle.Fill;\n            panelFans.Location = new Point(530, 0);\n            panelFans.Margin = new Padding(0);\n            panelFans.MinimumSize = new Size(816, 0);\n            panelFans.Name = \"panelFans\";\n            panelFans.Padding = new Padding(0, 0, 10, 0);\n            panelFans.Size = new Size(820, 1100);\n            panelFans.TabIndex = 12;\n            // \n            // checkFanClamp\n            // \n            checkFanClamp.AutoSize = true;\n            checkFanClamp.Font = new Font(\"Segoe UI\", 8F, FontStyle.Regular, GraphicsUnit.Point, 0);\n            checkFanClamp.Location = new Point(18, 80);\n            checkFanClamp.Name = \"checkFanClamp\";\n            checkFanClamp.Padding = new Padding(8, 1, 2, 1);\n            checkFanClamp.Size = new Size(193, 44);\n            checkFanClamp.TabIndex = 44;\n            checkFanClamp.TabStop = false;\n            checkFanClamp.Text = \"Clamp to Grid\";\n            checkFanClamp.UseVisualStyleBackColor = false;\n            // \n            // labelTip\n            // \n            labelTip.AutoSize = true;\n            labelTip.BackColor = SystemColors.ControlLightLight;\n            labelTip.Location = new Point(684, 92);\n            labelTip.Margin = new Padding(4, 0, 4, 0);\n            labelTip.Name = \"labelTip\";\n            labelTip.Padding = new Padding(4);\n            labelTip.Size = new Size(105, 40);\n            labelTip.TabIndex = 40;\n            labelTip.Text = \"500,300\";\n            // \n            // tableFanCharts\n            // \n            tableFanCharts.AutoSize = true;\n            tableFanCharts.ColumnCount = 1;\n            tableFanCharts.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));\n            tableFanCharts.Controls.Add(chartGPU, 0, 1);\n            tableFanCharts.Controls.Add(chartCPU, 0, 0);\n            tableFanCharts.Controls.Add(chartXGM, 0, 2);\n            tableFanCharts.Controls.Add(chartMid, 0, 2);\n            tableFanCharts.Dock = DockStyle.Fill;\n            tableFanCharts.Location = new Point(0, 66);\n            tableFanCharts.Margin = new Padding(4);\n            tableFanCharts.Name = \"tableFanCharts\";\n            tableFanCharts.Padding = new Padding(10, 0, 10, 5);\n            tableFanCharts.RowCount = 2;\n            tableFanCharts.RowStyles.Add(new RowStyle(SizeType.Percent, 25F));\n            tableFanCharts.RowStyles.Add(new RowStyle(SizeType.Percent, 25F));\n            tableFanCharts.RowStyles.Add(new RowStyle(SizeType.Percent, 25F));\n            tableFanCharts.RowStyles.Add(new RowStyle(SizeType.Percent, 25F));\n            tableFanCharts.Size = new Size(810, 918);\n            tableFanCharts.TabIndex = 36;\n            // \n            // chartGPU\n            // \n            chartArea1.Name = \"ChartArea1\";\n            chartGPU.ChartAreas.Add(chartArea1);\n            chartGPU.Dock = DockStyle.Fill;\n            chartGPU.Location = new Point(12, 238);\n            chartGPU.Margin = new Padding(2, 10, 2, 10);\n            chartGPU.Name = \"chartGPU\";\n            chartGPU.Size = new Size(786, 208);\n            chartGPU.TabIndex = 17;\n            chartGPU.Text = \"chartGPU\";\n            title1.Name = \"Title1\";\n            chartGPU.Titles.Add(title1);\n            // \n            // chartCPU\n            // \n            chartArea2.Name = \"ChartArea1\";\n            chartCPU.ChartAreas.Add(chartArea2);\n            chartCPU.Dock = DockStyle.Fill;\n            chartCPU.Location = new Point(12, 10);\n            chartCPU.Margin = new Padding(2, 10, 2, 10);\n            chartCPU.Name = \"chartCPU\";\n            chartCPU.Size = new Size(786, 208);\n            chartCPU.TabIndex = 14;\n            chartCPU.Text = \"chartCPU\";\n            title2.Name = \"Title1\";\n            chartCPU.Titles.Add(title2);\n            // \n            // chartXGM\n            // \n            chartArea3.Name = \"ChartAreaXGM\";\n            chartXGM.ChartAreas.Add(chartArea3);\n            chartXGM.Dock = DockStyle.Fill;\n            chartXGM.Location = new Point(12, 694);\n            chartXGM.Margin = new Padding(2, 10, 2, 10);\n            chartXGM.Name = \"chartXGM\";\n            chartXGM.Size = new Size(786, 209);\n            chartXGM.TabIndex = 14;\n            chartXGM.Text = \"chartXGM\";\n            title3.Name = \"Title4\";\n            chartXGM.Titles.Add(title3);\n            chartXGM.Visible = false;\n            // \n            // chartMid\n            // \n            chartArea4.Name = \"ChartArea3\";\n            chartMid.ChartAreas.Add(chartArea4);\n            chartMid.Dock = DockStyle.Fill;\n            chartMid.Location = new Point(12, 466);\n            chartMid.Margin = new Padding(2, 10, 2, 10);\n            chartMid.Name = \"chartMid\";\n            chartMid.Size = new Size(786, 208);\n            chartMid.TabIndex = 14;\n            chartMid.Text = \"chartMid\";\n            title4.Name = \"Title3\";\n            chartMid.Titles.Add(title4);\n            chartMid.Visible = false;\n            // \n            // panelTitleFans\n            // \n            panelTitleFans.Controls.Add(tableLayoutModes);\n            panelTitleFans.Controls.Add(picturePerf);\n            panelTitleFans.Controls.Add(labelFans);\n            panelTitleFans.Dock = DockStyle.Top;\n            panelTitleFans.Location = new Point(0, 0);\n            panelTitleFans.Margin = new Padding(4);\n            panelTitleFans.Name = \"panelTitleFans\";\n            panelTitleFans.Size = new Size(810, 66);\n            panelTitleFans.TabIndex = 42;\n            // \n            // tableLayoutModes\n            // \n            tableLayoutModes.ColumnCount = 4;\n            tableLayoutModes.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 60F));\n            tableLayoutModes.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 60F));\n            tableLayoutModes.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));\n            tableLayoutModes.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 60F));\n            tableLayoutModes.Controls.Add(buttonRemove, 0, 0);\n            tableLayoutModes.Controls.Add(buttonAdd, 3, 0);\n            tableLayoutModes.Controls.Add(buttonRename, 1, 0);\n            tableLayoutModes.Controls.Add(comboModes, 2, 0);\n            tableLayoutModes.Dock = DockStyle.Right;\n            tableLayoutModes.Location = new Point(330, 0);\n            tableLayoutModes.Margin = new Padding(0);\n            tableLayoutModes.Name = \"tableLayoutModes\";\n            tableLayoutModes.Padding = new Padding(0, 10, 4, 10);\n            tableLayoutModes.RowCount = 1;\n            tableLayoutModes.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));\n            tableLayoutModes.Size = new Size(480, 66);\n            tableLayoutModes.TabIndex = 1;\n            // \n            // buttonRemove\n            // \n            buttonRemove.Activated = false;\n            buttonRemove.BackColor = SystemColors.ControlLight;\n            buttonRemove.BorderColor = Color.Transparent;\n            buttonRemove.BorderRadius = 2;\n            buttonRemove.Dock = DockStyle.Fill;\n            buttonRemove.FlatStyle = FlatStyle.Flat;\n            buttonRemove.Image = Properties.Resources.icons8_remove_64;\n            buttonRemove.Location = new Point(0, 10);\n            buttonRemove.Margin = new Padding(0, 0, 6, 0);\n            buttonRemove.Name = \"buttonRemove\";\n            buttonRemove.Secondary = true;\n            buttonRemove.Size = new Size(54, 46);\n            buttonRemove.TabIndex = 44;\n            buttonRemove.UseVisualStyleBackColor = false;\n            // \n            // buttonAdd\n            // \n            buttonAdd.Activated = false;\n            buttonAdd.BackColor = SystemColors.ControlLight;\n            buttonAdd.BorderColor = Color.Transparent;\n            buttonAdd.BorderRadius = 2;\n            buttonAdd.Dock = DockStyle.Fill;\n            buttonAdd.FlatStyle = FlatStyle.Flat;\n            buttonAdd.Image = Properties.Resources.icons8_add_64;\n            buttonAdd.Location = new Point(416, 10);\n            buttonAdd.Margin = new Padding(0, 0, 6, 0);\n            buttonAdd.Name = \"buttonAdd\";\n            buttonAdd.Secondary = true;\n            buttonAdd.Size = new Size(54, 46);\n            buttonAdd.TabIndex = 43;\n            buttonAdd.UseVisualStyleBackColor = false;\n            // \n            // buttonRename\n            // \n            buttonRename.Activated = false;\n            buttonRename.BackColor = SystemColors.ControlLight;\n            buttonRename.BorderColor = Color.Transparent;\n            buttonRename.BorderRadius = 2;\n            buttonRename.Dock = DockStyle.Fill;\n            buttonRename.FlatStyle = FlatStyle.Flat;\n            buttonRename.Image = Properties.Resources.icons8_edit_32;\n            buttonRename.Location = new Point(60, 10);\n            buttonRename.Margin = new Padding(0, 0, 6, 0);\n            buttonRename.Name = \"buttonRename\";\n            buttonRename.Secondary = true;\n            buttonRename.Size = new Size(54, 46);\n            buttonRename.TabIndex = 45;\n            buttonRename.UseVisualStyleBackColor = false;\n            // \n            // comboModes\n            // \n            comboModes.BorderColor = Color.White;\n            comboModes.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboModes.Dock = DockStyle.Top;\n            comboModes.FlatStyle = FlatStyle.Flat;\n            comboModes.FormattingEnabled = true;\n            comboModes.Location = new Point(120, 14);\n            comboModes.Margin = new Padding(0, 4, 6, 4);\n            comboModes.Name = \"comboModes\";\n            comboModes.Size = new Size(290, 40);\n            comboModes.TabIndex = 42;\n            // \n            // picturePerf\n            // \n            picturePerf.BackgroundImage = Properties.Resources.icons8_fan_32;\n            picturePerf.BackgroundImageLayout = ImageLayout.Zoom;\n            picturePerf.InitialImage = null;\n            picturePerf.Location = new Point(18, 18);\n            picturePerf.Margin = new Padding(4, 2, 4, 2);\n            picturePerf.Name = \"picturePerf\";\n            picturePerf.Size = new Size(32, 32);\n            picturePerf.TabIndex = 41;\n            picturePerf.TabStop = false;\n            // \n            // labelFans\n            // \n            labelFans.AutoSize = true;\n            labelFans.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelFans.Location = new Point(53, 17);\n            labelFans.Margin = new Padding(4, 0, 4, 0);\n            labelFans.Name = \"labelFans\";\n            labelFans.Size = new Size(90, 32);\n            labelFans.TabIndex = 40;\n            labelFans.Text = \"Profile\";\n            // \n            // panelApplyFans\n            // \n            panelApplyFans.Controls.Add(buttonCalibrate);\n            panelApplyFans.Controls.Add(labelFansResult);\n            panelApplyFans.Controls.Add(checkApplyFans);\n            panelApplyFans.Controls.Add(buttonReset);\n            panelApplyFans.Dock = DockStyle.Bottom;\n            panelApplyFans.Location = new Point(0, 984);\n            panelApplyFans.Margin = new Padding(4);\n            panelApplyFans.Name = \"panelApplyFans\";\n            panelApplyFans.Size = new Size(810, 116);\n            panelApplyFans.TabIndex = 43;\n            // \n            // buttonCalibrate\n            // \n            buttonCalibrate.Activated = false;\n            buttonCalibrate.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;\n            buttonCalibrate.BackColor = SystemColors.ControlLight;\n            buttonCalibrate.BorderColor = Color.Transparent;\n            buttonCalibrate.BorderRadius = 2;\n            buttonCalibrate.FlatStyle = FlatStyle.Flat;\n            buttonCalibrate.Location = new Point(275, 40);\n            buttonCalibrate.Margin = new Padding(4, 2, 4, 2);\n            buttonCalibrate.Name = \"buttonCalibrate\";\n            buttonCalibrate.Secondary = true;\n            buttonCalibrate.Size = new Size(141, 50);\n            buttonCalibrate.TabIndex = 43;\n            buttonCalibrate.Text = \"Calibrate\";\n            buttonCalibrate.UseVisualStyleBackColor = false;\n            // \n            // labelFansResult\n            // \n            labelFansResult.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;\n            labelFansResult.ForeColor = Color.Red;\n            labelFansResult.Location = new Point(18, 2);\n            labelFansResult.Margin = new Padding(4, 0, 4, 0);\n            labelFansResult.Name = \"labelFansResult\";\n            labelFansResult.Size = new Size(771, 32);\n            labelFansResult.TabIndex = 42;\n            labelFansResult.Visible = false;\n            // \n            // checkApplyFans\n            // \n            checkApplyFans.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;\n            checkApplyFans.AutoSize = true;\n            checkApplyFans.BackColor = SystemColors.ControlLight;\n            checkApplyFans.Location = new Point(454, 42);\n            checkApplyFans.Margin = new Padding(0);\n            checkApplyFans.Name = \"checkApplyFans\";\n            checkApplyFans.Padding = new Padding(16, 6, 16, 6);\n            checkApplyFans.Size = new Size(341, 48);\n            checkApplyFans.TabIndex = 19;\n            checkApplyFans.Text = Properties.Strings.ApplyFanCurve;\n            checkApplyFans.UseVisualStyleBackColor = false;\n            // \n            // buttonReset\n            // \n            buttonReset.Activated = false;\n            buttonReset.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;\n            buttonReset.BackColor = SystemColors.ControlLight;\n            buttonReset.BorderColor = Color.Transparent;\n            buttonReset.BorderRadius = 2;\n            buttonReset.FlatStyle = FlatStyle.Flat;\n            buttonReset.Location = new Point(15, 40);\n            buttonReset.Margin = new Padding(4, 2, 4, 2);\n            buttonReset.Name = \"buttonReset\";\n            buttonReset.Secondary = true;\n            buttonReset.Size = new Size(252, 50);\n            buttonReset.TabIndex = 18;\n            buttonReset.Text = Properties.Strings.FactoryDefaults;\n            buttonReset.UseVisualStyleBackColor = false;\n            // \n            // comboBoost\n            // \n            comboBoost.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;\n            comboBoost.BorderColor = Color.White;\n            comboBoost.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboBoost.DropDownStyle = ComboBoxStyle.DropDownList;\n            comboBoost.FormattingEnabled = true;\n            comboBoost.Items.AddRange(new object[] { \"Disabled\", \"Enabled\", \"Aggressive\", \"Efficient Enabled\", \"Efficient Aggressive\", \"Aggressive at Guaranteed\", \"Efficient at Guaranteed\" });\n            comboBoost.Location = new Point(13, 12);\n            comboBoost.Margin = new Padding(4);\n            comboBoost.Name = \"comboBoost\";\n            comboBoost.Size = new Size(329, 40);\n            comboBoost.TabIndex = 42;\n            // \n            // panelSliders\n            // \n            panelSliders.Controls.Add(panelAdvanced);\n            panelSliders.Controls.Add(panelPower);\n            panelSliders.Controls.Add(panelGPU);\n            panelSliders.Controls.Add(panelNav);\n            panelSliders.Dock = DockStyle.Left;\n            panelSliders.Location = new Point(0, 0);\n            panelSliders.Margin = new Padding(0);\n            panelSliders.MinimumSize = new Size(530, 0);\n            panelSliders.Name = \"panelSliders\";\n            panelSliders.Padding = new Padding(10, 0, 0, 0);\n            panelSliders.Size = new Size(530, 1100);\n            panelSliders.TabIndex = 13;\n            // \n            // panelAdvanced\n            // \n            panelAdvanced.AutoSize = true;\n            panelAdvanced.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelAdvanced.Controls.Add(panelAdvancedAlways);\n            panelAdvanced.Controls.Add(panelAdvancedApply);\n            panelAdvanced.Controls.Add(labelRisky);\n            panelAdvanced.Controls.Add(panelUViGPU);\n            panelAdvanced.Controls.Add(panelUV);\n            panelAdvanced.Controls.Add(panelTitleAdvanced);\n            panelAdvanced.Controls.Add(panelTemperature);\n            panelAdvanced.Controls.Add(panelTitleTemp);\n            panelAdvanced.Controls.Add(panelDownload);\n            panelAdvanced.Dock = DockStyle.Top;\n            panelAdvanced.Location = new Point(10, 1768);\n            panelAdvanced.Name = \"panelAdvanced\";\n            panelAdvanced.Size = new Size(520, 992);\n            panelAdvanced.TabIndex = 14;\n            panelAdvanced.Visible = false;\n            // \n            // panelAdvancedAlways\n            // \n            panelAdvancedAlways.AutoSize = true;\n            panelAdvancedAlways.Controls.Add(checkApplyUV);\n            panelAdvancedAlways.Dock = DockStyle.Top;\n            panelAdvancedAlways.Location = new Point(0, 931);\n            panelAdvancedAlways.Name = \"panelAdvancedAlways\";\n            panelAdvancedAlways.Padding = new Padding(16, 0, 16, 15);\n            panelAdvancedAlways.Size = new Size(520, 61);\n            panelAdvancedAlways.TabIndex = 46;\n            // \n            // checkApplyUV\n            // \n            checkApplyUV.BackColor = SystemColors.ControlLight;\n            checkApplyUV.Dock = DockStyle.Top;\n            checkApplyUV.Enabled = false;\n            checkApplyUV.Location = new Point(16, 0);\n            checkApplyUV.Margin = new Padding(15, 15, 0, 0);\n            checkApplyUV.Name = \"checkApplyUV\";\n            checkApplyUV.Padding = new Padding(16, 6, 16, 6);\n            checkApplyUV.Size = new Size(488, 46);\n            checkApplyUV.TabIndex = 51;\n            checkApplyUV.Text = \"Auto Apply\";\n            checkApplyUV.TextAlign = ContentAlignment.MiddleCenter;\n            checkApplyUV.UseVisualStyleBackColor = false;\n            // \n            // panelAdvancedApply\n            // \n            panelAdvancedApply.AutoSize = true;\n            panelAdvancedApply.Controls.Add(buttonApplyAdvanced);\n            panelAdvancedApply.Dock = DockStyle.Top;\n            panelAdvancedApply.Location = new Point(0, 851);\n            panelAdvancedApply.Name = \"panelAdvancedApply\";\n            panelAdvancedApply.Padding = new Padding(15);\n            panelAdvancedApply.Size = new Size(520, 80);\n            panelAdvancedApply.TabIndex = 47;\n            // \n            // buttonApplyAdvanced\n            // \n            buttonApplyAdvanced.Activated = false;\n            buttonApplyAdvanced.BackColor = SystemColors.ControlLight;\n            buttonApplyAdvanced.BorderColor = Color.Transparent;\n            buttonApplyAdvanced.BorderRadius = 2;\n            buttonApplyAdvanced.Dock = DockStyle.Top;\n            buttonApplyAdvanced.FlatStyle = FlatStyle.Flat;\n            buttonApplyAdvanced.Location = new Point(15, 15);\n            buttonApplyAdvanced.Margin = new Padding(4, 2, 15, 15);\n            buttonApplyAdvanced.Name = \"buttonApplyAdvanced\";\n            buttonApplyAdvanced.Secondary = true;\n            buttonApplyAdvanced.Size = new Size(490, 50);\n            buttonApplyAdvanced.TabIndex = 49;\n            buttonApplyAdvanced.Text = \"Apply\";\n            buttonApplyAdvanced.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonApplyAdvanced.UseVisualStyleBackColor = false;\n            // \n            // labelRisky\n            // \n            labelRisky.BackColor = Color.IndianRed;\n            labelRisky.Dock = DockStyle.Top;\n            labelRisky.ForeColor = SystemColors.ControlLightLight;\n            labelRisky.Location = new Point(0, 608);\n            labelRisky.Margin = new Padding(0);\n            labelRisky.Name = \"labelRisky\";\n            labelRisky.Padding = new Padding(10, 10, 10, 5);\n            labelRisky.Size = new Size(520, 243);\n            labelRisky.TabIndex = 46;\n            labelRisky.Text = resources.GetString(\"labelRisky.Text\");\n            // \n            // panelUViGPU\n            // \n            panelUViGPU.AutoSize = true;\n            panelUViGPU.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelUViGPU.Controls.Add(labelUViGPU);\n            panelUViGPU.Controls.Add(labelLeftUViGPU);\n            panelUViGPU.Controls.Add(trackUViGPU);\n            panelUViGPU.Dock = DockStyle.Top;\n            panelUViGPU.Location = new Point(0, 484);\n            panelUViGPU.Margin = new Padding(4);\n            panelUViGPU.MaximumSize = new Size(0, 124);\n            panelUViGPU.Name = \"panelUViGPU\";\n            panelUViGPU.Size = new Size(520, 124);\n            panelUViGPU.TabIndex = 49;\n            // \n            // labelUViGPU\n            // \n            labelUViGPU.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelUViGPU.Location = new Point(347, 9);\n            labelUViGPU.Margin = new Padding(4, 0, 4, 0);\n            labelUViGPU.Name = \"labelUViGPU\";\n            labelUViGPU.Size = new Size(148, 32);\n            labelUViGPU.TabIndex = 13;\n            labelUViGPU.Text = \"UV\";\n            labelUViGPU.TextAlign = ContentAlignment.TopRight;\n            // \n            // labelLeftUViGPU\n            // \n            labelLeftUViGPU.AutoSize = true;\n            labelLeftUViGPU.Location = new Point(10, 10);\n            labelLeftUViGPU.Margin = new Padding(4, 0, 4, 0);\n            labelLeftUViGPU.Name = \"labelLeftUViGPU\";\n            labelLeftUViGPU.Size = new Size(65, 32);\n            labelLeftUViGPU.TabIndex = 12;\n            labelLeftUViGPU.Text = \"iGPU\";\n            // \n            // trackUViGPU\n            // \n            trackUViGPU.Location = new Point(6, 48);\n            trackUViGPU.Margin = new Padding(4, 2, 4, 2);\n            trackUViGPU.Maximum = 0;\n            trackUViGPU.Minimum = -40;\n            trackUViGPU.Name = \"trackUViGPU\";\n            trackUViGPU.Size = new Size(508, 90);\n            trackUViGPU.TabIndex = 11;\n            trackUViGPU.TickFrequency = 5;\n            trackUViGPU.TickStyle = TickStyle.TopLeft;\n            // \n            // panelUV\n            // \n            panelUV.AutoSize = true;\n            panelUV.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelUV.Controls.Add(labelUV);\n            panelUV.Controls.Add(labelLeftUV);\n            panelUV.Controls.Add(trackUV);\n            panelUV.Dock = DockStyle.Top;\n            panelUV.Location = new Point(0, 360);\n            panelUV.Margin = new Padding(4);\n            panelUV.MaximumSize = new Size(0, 124);\n            panelUV.Name = \"panelUV\";\n            panelUV.Size = new Size(520, 124);\n            panelUV.TabIndex = 46;\n            // \n            // labelUV\n            // \n            labelUV.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelUV.Location = new Point(347, 13);\n            labelUV.Margin = new Padding(4, 0, 4, 0);\n            labelUV.Name = \"labelUV\";\n            labelUV.Size = new Size(148, 32);\n            labelUV.TabIndex = 13;\n            labelUV.Text = \"UV\";\n            labelUV.TextAlign = ContentAlignment.TopRight;\n            // \n            // labelLeftUV\n            // \n            labelLeftUV.AutoSize = true;\n            labelLeftUV.Location = new Point(10, 10);\n            labelLeftUV.Margin = new Padding(4, 0, 4, 0);\n            labelLeftUV.Name = \"labelLeftUV\";\n            labelLeftUV.Size = new Size(58, 32);\n            labelLeftUV.TabIndex = 12;\n            labelLeftUV.Text = \"CPU\";\n            // \n            // trackUV\n            // \n            trackUV.Location = new Point(6, 48);\n            trackUV.Margin = new Padding(4, 2, 4, 2);\n            trackUV.Maximum = 0;\n            trackUV.Minimum = -40;\n            trackUV.Name = \"trackUV\";\n            trackUV.Size = new Size(508, 90);\n            trackUV.TabIndex = 11;\n            trackUV.TickFrequency = 5;\n            trackUV.TickStyle = TickStyle.TopLeft;\n            // \n            // panelTitleAdvanced\n            // \n            panelTitleAdvanced.Controls.Add(pictureUV);\n            panelTitleAdvanced.Controls.Add(labelTitleUV);\n            panelTitleAdvanced.Dock = DockStyle.Top;\n            panelTitleAdvanced.Location = new Point(0, 294);\n            panelTitleAdvanced.Name = \"panelTitleAdvanced\";\n            panelTitleAdvanced.Size = new Size(520, 66);\n            panelTitleAdvanced.TabIndex = 48;\n            // \n            // pictureUV\n            // \n            pictureUV.BackgroundImage = Properties.Resources.icons8_voltage_32;\n            pictureUV.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureUV.InitialImage = null;\n            pictureUV.Location = new Point(10, 18);\n            pictureUV.Margin = new Padding(4, 2, 4, 10);\n            pictureUV.Name = \"pictureUV\";\n            pictureUV.Size = new Size(32, 32);\n            pictureUV.TabIndex = 48;\n            pictureUV.TabStop = false;\n            // \n            // labelTitleUV\n            // \n            labelTitleUV.AutoSize = true;\n            labelTitleUV.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelTitleUV.Location = new Point(43, 17);\n            labelTitleUV.Margin = new Padding(4, 0, 4, 0);\n            labelTitleUV.Name = \"labelTitleUV\";\n            labelTitleUV.Size = new Size(166, 32);\n            labelTitleUV.TabIndex = 47;\n            labelTitleUV.Text = \"Undervolting\";\n            // \n            // panelTemperature\n            // \n            panelTemperature.AutoSize = true;\n            panelTemperature.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelTemperature.Controls.Add(labelTemp);\n            panelTemperature.Controls.Add(labelLeftTemp);\n            panelTemperature.Controls.Add(trackTemp);\n            panelTemperature.Dock = DockStyle.Top;\n            panelTemperature.Location = new Point(0, 170);\n            panelTemperature.Margin = new Padding(4);\n            panelTemperature.MaximumSize = new Size(0, 124);\n            panelTemperature.Name = \"panelTemperature\";\n            panelTemperature.Size = new Size(520, 124);\n            panelTemperature.TabIndex = 51;\n            // \n            // labelTemp\n            // \n            labelTemp.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelTemp.Location = new Point(347, 13);\n            labelTemp.Margin = new Padding(4, 0, 4, 0);\n            labelTemp.Name = \"labelTemp\";\n            labelTemp.Size = new Size(148, 32);\n            labelTemp.TabIndex = 13;\n            labelTemp.Text = \"T\";\n            labelTemp.TextAlign = ContentAlignment.TopRight;\n            // \n            // labelLeftTemp\n            // \n            labelLeftTemp.AutoSize = true;\n            labelLeftTemp.Location = new Point(10, 10);\n            labelLeftTemp.Margin = new Padding(4, 0, 4, 0);\n            labelLeftTemp.Name = \"labelLeftTemp\";\n            labelLeftTemp.Size = new Size(183, 32);\n            labelLeftTemp.TabIndex = 12;\n            labelLeftTemp.Text = \"CPU Temp Limit\";\n            // \n            // trackTemp\n            // \n            trackTemp.Location = new Point(6, 48);\n            trackTemp.Margin = new Padding(4, 2, 4, 2);\n            trackTemp.Maximum = 0;\n            trackTemp.Minimum = -40;\n            trackTemp.Name = \"trackTemp\";\n            trackTemp.Size = new Size(508, 90);\n            trackTemp.TabIndex = 11;\n            trackTemp.TickFrequency = 5;\n            trackTemp.TickStyle = TickStyle.TopLeft;\n            // \n            // panelTitleTemp\n            // \n            panelTitleTemp.Controls.Add(pictureTemp);\n            panelTitleTemp.Controls.Add(labelTempLimit);\n            panelTitleTemp.Dock = DockStyle.Top;\n            panelTitleTemp.Location = new Point(0, 104);\n            panelTitleTemp.Name = \"panelTitleTemp\";\n            panelTitleTemp.Size = new Size(520, 66);\n            panelTitleTemp.TabIndex = 50;\n            // \n            // pictureTemp\n            // \n            pictureTemp.BackgroundImage = Properties.Resources.icons8_temperature_32;\n            pictureTemp.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureTemp.InitialImage = null;\n            pictureTemp.Location = new Point(10, 18);\n            pictureTemp.Margin = new Padding(4, 2, 4, 10);\n            pictureTemp.Name = \"pictureTemp\";\n            pictureTemp.Size = new Size(32, 32);\n            pictureTemp.TabIndex = 48;\n            pictureTemp.TabStop = false;\n            // \n            // labelTempLimit\n            // \n            labelTempLimit.AutoSize = true;\n            labelTempLimit.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelTempLimit.Location = new Point(46, 17);\n            labelTempLimit.Margin = new Padding(4, 0, 4, 0);\n            labelTempLimit.Name = \"labelTempLimit\";\n            labelTempLimit.Size = new Size(140, 32);\n            labelTempLimit.TabIndex = 47;\n            labelTempLimit.Text = \"Temp Limit\";\n            // \n            // panelDownload\n            // \n            panelDownload.AutoSize = true;\n            panelDownload.Controls.Add(buttonDownload);\n            panelDownload.Dock = DockStyle.Top;\n            panelDownload.Location = new Point(0, 0);\n            panelDownload.Name = \"panelDownload\";\n            panelDownload.Padding = new Padding(20);\n            panelDownload.Size = new Size(520, 104);\n            panelDownload.TabIndex = 52;\n            panelDownload.Visible = false;\n            // \n            // buttonDownload\n            // \n            buttonDownload.Activated = false;\n            buttonDownload.AutoSize = true;\n            buttonDownload.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            buttonDownload.BackColor = SystemColors.ControlLight;\n            buttonDownload.BorderColor = Color.Transparent;\n            buttonDownload.BorderRadius = 2;\n            buttonDownload.Dock = DockStyle.Top;\n            buttonDownload.FlatStyle = FlatStyle.Flat;\n            buttonDownload.Location = new Point(20, 20);\n            buttonDownload.Margin = new Padding(20);\n            buttonDownload.Name = \"buttonDownload\";\n            buttonDownload.Padding = new Padding(10);\n            buttonDownload.Secondary = true;\n            buttonDownload.Size = new Size(480, 64);\n            buttonDownload.TabIndex = 19;\n            buttonDownload.Text = \"Download Advanced Settings Plugin\";\n            buttonDownload.UseVisualStyleBackColor = false;\n            // \n            // panelPower\n            // \n            panelPower.AutoSize = true;\n            panelPower.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelPower.Controls.Add(panelApplyPower);\n            panelPower.Controls.Add(panelCPU);\n            panelPower.Controls.Add(panelFast);\n            panelPower.Controls.Add(panelSlow);\n            panelPower.Controls.Add(panelTotal);\n            panelPower.Controls.Add(panelTitleCPU);\n            panelPower.Controls.Add(panelBoost);\n            panelPower.Controls.Add(panelBoostTitle);\n            panelPower.Controls.Add(panelPowerMode);\n            panelPower.Controls.Add(panelPowerModeTItle);\n            panelPower.Dock = DockStyle.Top;\n            panelPower.Location = new Point(10, 888);\n            panelPower.Margin = new Padding(4);\n            panelPower.Name = \"panelPower\";\n            panelPower.Size = new Size(520, 880);\n            panelPower.TabIndex = 43;\n            // \n            // panelApplyPower\n            // \n            panelApplyPower.AutoSize = true;\n            panelApplyPower.Controls.Add(checkApplyPower);\n            panelApplyPower.Dock = DockStyle.Top;\n            panelApplyPower.Location = new Point(0, 804);\n            panelApplyPower.Name = \"panelApplyPower\";\n            panelApplyPower.Padding = new Padding(15);\n            panelApplyPower.Size = new Size(520, 76);\n            panelApplyPower.TabIndex = 47;\n            // \n            // checkApplyPower\n            // \n            checkApplyPower.BackColor = SystemColors.ControlLight;\n            checkApplyPower.Dock = DockStyle.Top;\n            checkApplyPower.Location = new Point(15, 15);\n            checkApplyPower.Margin = new Padding(0);\n            checkApplyPower.Name = \"checkApplyPower\";\n            checkApplyPower.Padding = new Padding(16, 6, 16, 6);\n            checkApplyPower.Size = new Size(490, 46);\n            checkApplyPower.TabIndex = 45;\n            checkApplyPower.Text = \"Apply Power Limits\";\n            checkApplyPower.UseVisualStyleBackColor = false;\n            // \n            // panelCPU\n            // \n            panelCPU.AutoSize = true;\n            panelCPU.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelCPU.Controls.Add(labelCPU);\n            panelCPU.Controls.Add(labelLeftCPU);\n            panelCPU.Controls.Add(trackCPU);\n            panelCPU.Dock = DockStyle.Top;\n            panelCPU.Location = new Point(0, 680);\n            panelCPU.Margin = new Padding(4);\n            panelCPU.MaximumSize = new Size(0, 124);\n            panelCPU.Name = \"panelCPU\";\n            panelCPU.Size = new Size(520, 124);\n            panelCPU.TabIndex = 41;\n            // \n            // labelCPU\n            // \n            labelCPU.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelCPU.Location = new Point(398, 8);\n            labelCPU.Margin = new Padding(4, 0, 4, 0);\n            labelCPU.Name = \"labelCPU\";\n            labelCPU.Size = new Size(116, 32);\n            labelCPU.TabIndex = 13;\n            labelCPU.Text = \"CPU\";\n            labelCPU.TextAlign = ContentAlignment.TopRight;\n            // \n            // labelLeftCPU\n            // \n            labelLeftCPU.AutoSize = true;\n            labelLeftCPU.Location = new Point(10, 8);\n            labelLeftCPU.Margin = new Padding(4, 0, 4, 0);\n            labelLeftCPU.Name = \"labelLeftCPU\";\n            labelLeftCPU.Size = new Size(58, 32);\n            labelLeftCPU.TabIndex = 12;\n            labelLeftCPU.Text = \"CPU\";\n            // \n            // trackCPU\n            // \n            trackCPU.Location = new Point(6, 44);\n            trackCPU.Margin = new Padding(4, 2, 4, 2);\n            trackCPU.Maximum = 85;\n            trackCPU.Minimum = 5;\n            trackCPU.Name = \"trackCPU\";\n            trackCPU.Size = new Size(508, 90);\n            trackCPU.TabIndex = 11;\n            trackCPU.TickFrequency = 5;\n            trackCPU.TickStyle = TickStyle.TopLeft;\n            trackCPU.Value = 80;\n            // \n            // panelFast\n            // \n            panelFast.AutoSize = true;\n            panelFast.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelFast.Controls.Add(labelFast);\n            panelFast.Controls.Add(labelLeftFast);\n            panelFast.Controls.Add(trackFast);\n            panelFast.Dock = DockStyle.Top;\n            panelFast.Location = new Point(0, 556);\n            panelFast.Margin = new Padding(4);\n            panelFast.MaximumSize = new Size(0, 124);\n            panelFast.Name = \"panelFast\";\n            panelFast.Size = new Size(520, 124);\n            panelFast.TabIndex = 45;\n            // \n            // labelFast\n            // \n            labelFast.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelFast.Location = new Point(396, 8);\n            labelFast.Margin = new Padding(4, 0, 4, 0);\n            labelFast.Name = \"labelFast\";\n            labelFast.Size = new Size(114, 32);\n            labelFast.TabIndex = 13;\n            labelFast.Text = \"FPPT\";\n            labelFast.TextAlign = ContentAlignment.TopRight;\n            // \n            // labelLeftFast\n            // \n            labelLeftFast.AutoSize = true;\n            labelLeftFast.Location = new Point(10, 8);\n            labelLeftFast.Margin = new Padding(4, 0, 4, 0);\n            labelLeftFast.Name = \"labelLeftFast\";\n            labelLeftFast.Size = new Size(65, 32);\n            labelLeftFast.TabIndex = 12;\n            labelLeftFast.Text = \"FPPT\";\n            // \n            // trackFast\n            // \n            trackFast.Location = new Point(6, 48);\n            trackFast.Margin = new Padding(4, 2, 4, 2);\n            trackFast.Maximum = 85;\n            trackFast.Minimum = 5;\n            trackFast.Name = \"trackFast\";\n            trackFast.Size = new Size(508, 90);\n            trackFast.TabIndex = 11;\n            trackFast.TickFrequency = 5;\n            trackFast.TickStyle = TickStyle.TopLeft;\n            trackFast.Value = 80;\n            // \n            // panelSlow\n            // \n            panelSlow.AutoSize = true;\n            panelSlow.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelSlow.Controls.Add(labelSlow);\n            panelSlow.Controls.Add(labelLeftSlow);\n            panelSlow.Controls.Add(trackSlow);\n            panelSlow.Dock = DockStyle.Top;\n            panelSlow.Location = new Point(0, 432);\n            panelSlow.Margin = new Padding(4);\n            panelSlow.MaximumSize = new Size(0, 124);\n            panelSlow.Name = \"panelSlow\";\n            panelSlow.Size = new Size(520, 124);\n            panelSlow.TabIndex = 51;\n            // \n            // labelSlow\n            // \n            labelSlow.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelSlow.Location = new Point(396, 10);\n            labelSlow.Margin = new Padding(4, 0, 4, 0);\n            labelSlow.Name = \"labelSlow\";\n            labelSlow.Size = new Size(116, 32);\n            labelSlow.TabIndex = 12;\n            labelSlow.Text = \"SPPT\";\n            labelSlow.TextAlign = ContentAlignment.TopRight;\n            // \n            // labelLeftSlow\n            // \n            labelLeftSlow.AutoSize = true;\n            labelLeftSlow.Location = new Point(10, 10);\n            labelLeftSlow.Margin = new Padding(4, 0, 4, 0);\n            labelLeftSlow.Name = \"labelLeftSlow\";\n            labelLeftSlow.Size = new Size(66, 32);\n            labelLeftSlow.TabIndex = 11;\n            labelLeftSlow.Text = \"SPPT\";\n            // \n            // trackSlow\n            // \n            trackSlow.Location = new Point(6, 48);\n            trackSlow.Margin = new Padding(4, 2, 4, 2);\n            trackSlow.Maximum = 180;\n            trackSlow.Minimum = 10;\n            trackSlow.Name = \"trackSlow\";\n            trackSlow.Size = new Size(508, 90);\n            trackSlow.TabIndex = 10;\n            trackSlow.TickFrequency = 5;\n            trackSlow.TickStyle = TickStyle.TopLeft;\n            trackSlow.Value = 125;\n            // \n            // panelTotal\n            // \n            panelTotal.AutoSize = true;\n            panelTotal.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelTotal.Controls.Add(labelTotal);\n            panelTotal.Controls.Add(labelLeftTotal);\n            panelTotal.Controls.Add(trackTotal);\n            panelTotal.Dock = DockStyle.Top;\n            panelTotal.Location = new Point(0, 308);\n            panelTotal.Margin = new Padding(4);\n            panelTotal.MaximumSize = new Size(0, 124);\n            panelTotal.Name = \"panelTotal\";\n            panelTotal.Size = new Size(520, 124);\n            panelTotal.TabIndex = 40;\n            // \n            // labelTotal\n            // \n            labelTotal.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelTotal.Location = new Point(396, 10);\n            labelTotal.Margin = new Padding(4, 0, 4, 0);\n            labelTotal.Name = \"labelTotal\";\n            labelTotal.Size = new Size(116, 32);\n            labelTotal.TabIndex = 12;\n            labelTotal.Text = \"SPL\";\n            labelTotal.TextAlign = ContentAlignment.TopRight;\n            // \n            // labelLeftTotal\n            // \n            labelLeftTotal.AutoSize = true;\n            labelLeftTotal.Location = new Point(10, 10);\n            labelLeftTotal.Margin = new Padding(4, 0, 4, 0);\n            labelLeftTotal.Name = \"labelLeftTotal\";\n            labelLeftTotal.Size = new Size(51, 32);\n            labelLeftTotal.TabIndex = 11;\n            labelLeftTotal.Text = \"SPL\";\n            // \n            // trackTotal\n            // \n            trackTotal.Location = new Point(6, 48);\n            trackTotal.Margin = new Padding(4, 2, 4, 2);\n            trackTotal.Maximum = 180;\n            trackTotal.Minimum = 10;\n            trackTotal.Name = \"trackTotal\";\n            trackTotal.Size = new Size(508, 90);\n            trackTotal.TabIndex = 10;\n            trackTotal.TickFrequency = 5;\n            trackTotal.TickStyle = TickStyle.TopLeft;\n            trackTotal.Value = 125;\n            // \n            // panelTitleCPU\n            // \n            panelTitleCPU.AutoSize = true;\n            panelTitleCPU.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelTitleCPU.Controls.Add(pictureBoxCPU);\n            panelTitleCPU.Controls.Add(labelPowerLimits);\n            panelTitleCPU.Dock = DockStyle.Top;\n            panelTitleCPU.Location = new Point(0, 248);\n            panelTitleCPU.Margin = new Padding(4);\n            panelTitleCPU.Name = \"panelTitleCPU\";\n            panelTitleCPU.Size = new Size(520, 60);\n            panelTitleCPU.TabIndex = 42;\n            // \n            // pictureBoxCPU\n            // \n            pictureBoxCPU.BackgroundImage = Properties.Resources.icons8_processor_32;\n            pictureBoxCPU.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureBoxCPU.InitialImage = null;\n            pictureBoxCPU.Location = new Point(10, 18);\n            pictureBoxCPU.Margin = new Padding(4, 2, 4, 10);\n            pictureBoxCPU.Name = \"pictureBoxCPU\";\n            pictureBoxCPU.Size = new Size(32, 32);\n            pictureBoxCPU.TabIndex = 40;\n            pictureBoxCPU.TabStop = false;\n            // \n            // labelPowerLimits\n            // \n            labelPowerLimits.AutoSize = true;\n            labelPowerLimits.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelPowerLimits.Location = new Point(46, 16);\n            labelPowerLimits.Margin = new Padding(4, 0, 4, 0);\n            labelPowerLimits.Name = \"labelPowerLimits\";\n            labelPowerLimits.Size = new Size(160, 32);\n            labelPowerLimits.TabIndex = 39;\n            labelPowerLimits.Text = \"Power Limits\";\n            // \n            // panelBoost\n            // \n            panelBoost.Controls.Add(comboBoost);\n            panelBoost.Dock = DockStyle.Top;\n            panelBoost.Location = new Point(0, 184);\n            panelBoost.Margin = new Padding(4);\n            panelBoost.Name = \"panelBoost\";\n            panelBoost.Size = new Size(520, 64);\n            panelBoost.TabIndex = 13;\n            // \n            // panelBoostTitle\n            // \n            panelBoostTitle.AutoSize = true;\n            panelBoostTitle.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelBoostTitle.Controls.Add(pictureBoost);\n            panelBoostTitle.Controls.Add(labelBoost);\n            panelBoostTitle.Dock = DockStyle.Top;\n            panelBoostTitle.Location = new Point(0, 124);\n            panelBoostTitle.Margin = new Padding(4);\n            panelBoostTitle.Name = \"panelBoostTitle\";\n            panelBoostTitle.Size = new Size(520, 60);\n            panelBoostTitle.TabIndex = 48;\n            // \n            // pictureBoost\n            // \n            pictureBoost.BackgroundImage = Properties.Resources.icons8_rocket_32;\n            pictureBoost.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureBoost.InitialImage = null;\n            pictureBoost.Location = new Point(10, 18);\n            pictureBoost.Margin = new Padding(4, 2, 4, 10);\n            pictureBoost.Name = \"pictureBoost\";\n            pictureBoost.Size = new Size(32, 32);\n            pictureBoost.TabIndex = 40;\n            pictureBoost.TabStop = false;\n            // \n            // labelBoost\n            // \n            labelBoost.AutoSize = true;\n            labelBoost.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelBoost.Location = new Point(46, 18);\n            labelBoost.Margin = new Padding(4, 0, 4, 0);\n            labelBoost.Name = \"labelBoost\";\n            labelBoost.Size = new Size(133, 32);\n            labelBoost.TabIndex = 39;\n            labelBoost.Text = \"CPU Boost\";\n            // \n            // panelPowerMode\n            // \n            panelPowerMode.Controls.Add(comboPowerMode);\n            panelPowerMode.Dock = DockStyle.Top;\n            panelPowerMode.Location = new Point(0, 60);\n            panelPowerMode.Margin = new Padding(4);\n            panelPowerMode.Name = \"panelPowerMode\";\n            panelPowerMode.Size = new Size(520, 64);\n            panelPowerMode.TabIndex = 49;\n            // \n            // comboPowerMode\n            // \n            comboPowerMode.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;\n            comboPowerMode.BorderColor = Color.White;\n            comboPowerMode.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboPowerMode.DropDownStyle = ComboBoxStyle.DropDownList;\n            comboPowerMode.FormattingEnabled = true;\n            comboPowerMode.Items.AddRange(new object[] { \"Disabled\", \"Enabled\", \"Aggressive\", \"Efficient Enabled\", \"Efficient Aggressive\", \"Aggressive at Guaranteed\", \"Efficient at Guaranteed\" });\n            comboPowerMode.Location = new Point(13, 12);\n            comboPowerMode.Margin = new Padding(4);\n            comboPowerMode.Name = \"comboPowerMode\";\n            comboPowerMode.Size = new Size(329, 40);\n            comboPowerMode.TabIndex = 42;\n            // \n            // panelPowerModeTItle\n            // \n            panelPowerModeTItle.AutoSize = true;\n            panelPowerModeTItle.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelPowerModeTItle.Controls.Add(picturePowerMode);\n            panelPowerModeTItle.Controls.Add(labelPowerModeTitle);\n            panelPowerModeTItle.Dock = DockStyle.Top;\n            panelPowerModeTItle.Location = new Point(0, 0);\n            panelPowerModeTItle.Margin = new Padding(4);\n            panelPowerModeTItle.Name = \"panelPowerModeTItle\";\n            panelPowerModeTItle.Size = new Size(520, 60);\n            panelPowerModeTItle.TabIndex = 50;\n            // \n            // picturePowerMode\n            // \n            picturePowerMode.BackgroundImage = Properties.Resources.icons8_gauge_32;\n            picturePowerMode.BackgroundImageLayout = ImageLayout.Zoom;\n            picturePowerMode.InitialImage = null;\n            picturePowerMode.Location = new Point(10, 18);\n            picturePowerMode.Margin = new Padding(4, 2, 4, 10);\n            picturePowerMode.Name = \"picturePowerMode\";\n            picturePowerMode.Size = new Size(32, 32);\n            picturePowerMode.TabIndex = 40;\n            picturePowerMode.TabStop = false;\n            // \n            // labelPowerModeTitle\n            // \n            labelPowerModeTitle.AutoSize = true;\n            labelPowerModeTitle.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelPowerModeTitle.Location = new Point(46, 18);\n            labelPowerModeTitle.Margin = new Padding(4, 0, 4, 0);\n            labelPowerModeTitle.Name = \"labelPowerModeTitle\";\n            labelPowerModeTitle.Size = new Size(271, 32);\n            labelPowerModeTitle.TabIndex = 39;\n            labelPowerModeTitle.Text = \"Windows Power Mode\";\n            // \n            // panelGPU\n            // \n            panelGPU.AutoSize = true;\n            panelGPU.Controls.Add(panelGPUTemp);\n            panelGPU.Controls.Add(panelGPUBoost);\n            panelGPU.Controls.Add(panelGPUPower);\n            panelGPU.Controls.Add(panelGPUMemory);\n            panelGPU.Controls.Add(panelGPUCore);\n            panelGPU.Controls.Add(panelGPUClockLimit);\n            panelGPU.Controls.Add(panelTitleGPU);\n            panelGPU.Dock = DockStyle.Top;\n            panelGPU.Location = new Point(10, 66);\n            panelGPU.Margin = new Padding(4);\n            panelGPU.Name = \"panelGPU\";\n            panelGPU.Padding = new Padding(0, 0, 0, 18);\n            panelGPU.Size = new Size(520, 822);\n            panelGPU.TabIndex = 44;\n            panelGPU.Visible = false;\n            // \n            // panelGPUTemp\n            // \n            panelGPUTemp.AutoSize = true;\n            panelGPUTemp.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelGPUTemp.Controls.Add(labelGPUTemp);\n            panelGPUTemp.Controls.Add(labelGPUTempTitle);\n            panelGPUTemp.Controls.Add(trackGPUTemp);\n            panelGPUTemp.Dock = DockStyle.Top;\n            panelGPUTemp.Location = new Point(0, 680);\n            panelGPUTemp.Margin = new Padding(4);\n            panelGPUTemp.MaximumSize = new Size(0, 124);\n            panelGPUTemp.Name = \"panelGPUTemp\";\n            panelGPUTemp.Size = new Size(520, 124);\n            panelGPUTemp.TabIndex = 47;\n            // \n            // labelGPUTemp\n            // \n            labelGPUTemp.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelGPUTemp.Location = new Point(378, 14);\n            labelGPUTemp.Margin = new Padding(4, 0, 4, 0);\n            labelGPUTemp.Name = \"labelGPUTemp\";\n            labelGPUTemp.Size = new Size(124, 32);\n            labelGPUTemp.TabIndex = 44;\n            labelGPUTemp.Text = \"87C\";\n            labelGPUTemp.TextAlign = ContentAlignment.TopRight;\n            // \n            // labelGPUTempTitle\n            // \n            labelGPUTempTitle.AutoSize = true;\n            labelGPUTempTitle.Location = new Point(10, 14);\n            labelGPUTempTitle.Margin = new Padding(4, 0, 4, 0);\n            labelGPUTempTitle.Name = \"labelGPUTempTitle\";\n            labelGPUTempTitle.Size = new Size(173, 32);\n            labelGPUTempTitle.TabIndex = 43;\n            labelGPUTempTitle.Text = \"Thermal Target\";\n            // \n            // trackGPUTemp\n            // \n            trackGPUTemp.Location = new Point(6, 56);\n            trackGPUTemp.Margin = new Padding(4, 2, 4, 2);\n            trackGPUTemp.Maximum = 87;\n            trackGPUTemp.Minimum = 75;\n            trackGPUTemp.Name = \"trackGPUTemp\";\n            trackGPUTemp.Size = new Size(496, 90);\n            trackGPUTemp.TabIndex = 42;\n            trackGPUTemp.TickFrequency = 5;\n            trackGPUTemp.TickStyle = TickStyle.TopLeft;\n            trackGPUTemp.Value = 87;\n            // \n            // panelGPUBoost\n            // \n            panelGPUBoost.AutoSize = true;\n            panelGPUBoost.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelGPUBoost.Controls.Add(labelGPUBoost);\n            panelGPUBoost.Controls.Add(labelGPUBoostTitle);\n            panelGPUBoost.Controls.Add(trackGPUBoost);\n            panelGPUBoost.Dock = DockStyle.Top;\n            panelGPUBoost.Location = new Point(0, 556);\n            panelGPUBoost.Margin = new Padding(4);\n            panelGPUBoost.MaximumSize = new Size(0, 124);\n            panelGPUBoost.Name = \"panelGPUBoost\";\n            panelGPUBoost.Size = new Size(520, 124);\n            panelGPUBoost.TabIndex = 46;\n            // \n            // labelGPUBoost\n            // \n            labelGPUBoost.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelGPUBoost.Location = new Point(374, 14);\n            labelGPUBoost.Margin = new Padding(4, 0, 4, 0);\n            labelGPUBoost.Name = \"labelGPUBoost\";\n            labelGPUBoost.Size = new Size(124, 32);\n            labelGPUBoost.TabIndex = 44;\n            labelGPUBoost.Text = \"25W\";\n            labelGPUBoost.TextAlign = ContentAlignment.TopRight;\n            // \n            // labelGPUBoostTitle\n            // \n            labelGPUBoostTitle.AutoSize = true;\n            labelGPUBoostTitle.Location = new Point(10, 14);\n            labelGPUBoostTitle.Margin = new Padding(4, 0, 4, 0);\n            labelGPUBoostTitle.Name = \"labelGPUBoostTitle\";\n            labelGPUBoostTitle.Size = new Size(174, 32);\n            labelGPUBoostTitle.TabIndex = 43;\n            labelGPUBoostTitle.Text = \"Dynamic Boost\";\n            // \n            // trackGPUBoost\n            // \n            trackGPUBoost.Location = new Point(6, 48);\n            trackGPUBoost.Margin = new Padding(4, 2, 4, 2);\n            trackGPUBoost.Maximum = 25;\n            trackGPUBoost.Minimum = 5;\n            trackGPUBoost.Name = \"trackGPUBoost\";\n            trackGPUBoost.Size = new Size(496, 90);\n            trackGPUBoost.TabIndex = 42;\n            trackGPUBoost.TickFrequency = 5;\n            trackGPUBoost.TickStyle = TickStyle.TopLeft;\n            trackGPUBoost.Value = 25;\n            // \n            // panelGPUPower\n            // \n            panelGPUPower.AutoSize = true;\n            panelGPUPower.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelGPUPower.Controls.Add(labelGPUPower);\n            panelGPUPower.Controls.Add(labelGPUPowerTitle);\n            panelGPUPower.Controls.Add(trackGPUPower);\n            panelGPUPower.Dock = DockStyle.Top;\n            panelGPUPower.Location = new Point(0, 432);\n            panelGPUPower.Margin = new Padding(4);\n            panelGPUPower.MaximumSize = new Size(0, 124);\n            panelGPUPower.Name = \"panelGPUPower\";\n            panelGPUPower.Size = new Size(520, 124);\n            panelGPUPower.TabIndex = 49;\n            // \n            // labelGPUPower\n            // \n            labelGPUPower.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelGPUPower.Location = new Point(374, 14);\n            labelGPUPower.Margin = new Padding(4, 0, 4, 0);\n            labelGPUPower.Name = \"labelGPUPower\";\n            labelGPUPower.Size = new Size(124, 32);\n            labelGPUPower.TabIndex = 44;\n            labelGPUPower.Text = \"105W\";\n            labelGPUPower.TextAlign = ContentAlignment.TopRight;\n            // \n            // labelGPUPowerTitle\n            // \n            labelGPUPowerTitle.AutoSize = true;\n            labelGPUPowerTitle.Location = new Point(10, 14);\n            labelGPUPowerTitle.Margin = new Padding(4, 0, 4, 0);\n            labelGPUPowerTitle.Name = \"labelGPUPowerTitle\";\n            labelGPUPowerTitle.Size = new Size(130, 32);\n            labelGPUPowerTitle.TabIndex = 43;\n            labelGPUPowerTitle.Text = \"GPU Power\";\n            // \n            // trackGPUPower\n            // \n            trackGPUPower.Location = new Point(6, 48);\n            trackGPUPower.Margin = new Padding(4, 2, 4, 2);\n            trackGPUPower.Maximum = 25;\n            trackGPUPower.Minimum = 5;\n            trackGPUPower.Name = \"trackGPUPower\";\n            trackGPUPower.Size = new Size(496, 90);\n            trackGPUPower.TabIndex = 42;\n            trackGPUPower.TickFrequency = 5;\n            trackGPUPower.TickStyle = TickStyle.TopLeft;\n            trackGPUPower.Value = 25;\n            // \n            // panelGPUMemory\n            // \n            panelGPUMemory.AutoSize = true;\n            panelGPUMemory.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelGPUMemory.Controls.Add(labelGPUMemory);\n            panelGPUMemory.Controls.Add(labelGPUMemoryTitle);\n            panelGPUMemory.Controls.Add(trackGPUMemory);\n            panelGPUMemory.Dock = DockStyle.Top;\n            panelGPUMemory.Location = new Point(0, 308);\n            panelGPUMemory.Margin = new Padding(4);\n            panelGPUMemory.MaximumSize = new Size(0, 124);\n            panelGPUMemory.Name = \"panelGPUMemory\";\n            panelGPUMemory.Size = new Size(520, 124);\n            panelGPUMemory.TabIndex = 45;\n            // \n            // labelGPUMemory\n            // \n            labelGPUMemory.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelGPUMemory.Location = new Point(344, 14);\n            labelGPUMemory.Margin = new Padding(4, 0, 4, 0);\n            labelGPUMemory.Name = \"labelGPUMemory\";\n            labelGPUMemory.Size = new Size(160, 32);\n            labelGPUMemory.TabIndex = 44;\n            labelGPUMemory.Text = \"2000 MHz\";\n            labelGPUMemory.TextAlign = ContentAlignment.TopRight;\n            // \n            // labelGPUMemoryTitle\n            // \n            labelGPUMemoryTitle.AutoSize = true;\n            labelGPUMemoryTitle.Location = new Point(10, 14);\n            labelGPUMemoryTitle.Margin = new Padding(4, 0, 4, 0);\n            labelGPUMemoryTitle.Name = \"labelGPUMemoryTitle\";\n            labelGPUMemoryTitle.Size = new Size(241, 32);\n            labelGPUMemoryTitle.TabIndex = 43;\n            labelGPUMemoryTitle.Text = \"Memory Clock Offset\";\n            // \n            // trackGPUMemory\n            // \n            trackGPUMemory.LargeChange = 100;\n            trackGPUMemory.Location = new Point(6, 48);\n            trackGPUMemory.Margin = new Padding(4, 2, 4, 2);\n            trackGPUMemory.Maximum = 300;\n            trackGPUMemory.Name = \"trackGPUMemory\";\n            trackGPUMemory.Size = new Size(496, 90);\n            trackGPUMemory.SmallChange = 10;\n            trackGPUMemory.TabIndex = 42;\n            trackGPUMemory.TickFrequency = 50;\n            trackGPUMemory.TickStyle = TickStyle.TopLeft;\n            // \n            // panelGPUCore\n            // \n            panelGPUCore.AutoSize = true;\n            panelGPUCore.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelGPUCore.Controls.Add(labelGPUCore);\n            panelGPUCore.Controls.Add(trackGPUCore);\n            panelGPUCore.Controls.Add(labelGPUCoreTitle);\n            panelGPUCore.Dock = DockStyle.Top;\n            panelGPUCore.Location = new Point(0, 184);\n            panelGPUCore.Margin = new Padding(4);\n            panelGPUCore.MaximumSize = new Size(0, 124);\n            panelGPUCore.Name = \"panelGPUCore\";\n            panelGPUCore.Size = new Size(520, 124);\n            panelGPUCore.TabIndex = 44;\n            // \n            // labelGPUCore\n            // \n            labelGPUCore.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelGPUCore.Location = new Point(326, 16);\n            labelGPUCore.Margin = new Padding(4, 0, 4, 0);\n            labelGPUCore.Name = \"labelGPUCore\";\n            labelGPUCore.Size = new Size(176, 32);\n            labelGPUCore.TabIndex = 29;\n            labelGPUCore.Text = \"1500 MHz\";\n            labelGPUCore.TextAlign = ContentAlignment.TopRight;\n            // \n            // trackGPUCore\n            // \n            trackGPUCore.LargeChange = 100;\n            trackGPUCore.Location = new Point(6, 48);\n            trackGPUCore.Margin = new Padding(4, 2, 4, 2);\n            trackGPUCore.Maximum = 300;\n            trackGPUCore.Name = \"trackGPUCore\";\n            trackGPUCore.RightToLeft = RightToLeft.No;\n            trackGPUCore.Size = new Size(496, 90);\n            trackGPUCore.SmallChange = 10;\n            trackGPUCore.TabIndex = 18;\n            trackGPUCore.TickFrequency = 50;\n            trackGPUCore.TickStyle = TickStyle.TopLeft;\n            // \n            // labelGPUCoreTitle\n            // \n            labelGPUCoreTitle.AutoSize = true;\n            labelGPUCoreTitle.Location = new Point(10, 16);\n            labelGPUCoreTitle.Margin = new Padding(4, 0, 4, 0);\n            labelGPUCoreTitle.Name = \"labelGPUCoreTitle\";\n            labelGPUCoreTitle.Size = new Size(201, 32);\n            labelGPUCoreTitle.TabIndex = 17;\n            labelGPUCoreTitle.Text = \"Core Clock Offset\";\n            // \n            // panelGPUClockLimit\n            // \n            panelGPUClockLimit.AutoSize = true;\n            panelGPUClockLimit.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelGPUClockLimit.Controls.Add(labelGPUClockLimit);\n            panelGPUClockLimit.Controls.Add(trackGPUClockLimit);\n            panelGPUClockLimit.Controls.Add(labelGPUClockLimitTitle);\n            panelGPUClockLimit.Dock = DockStyle.Top;\n            panelGPUClockLimit.Location = new Point(0, 60);\n            panelGPUClockLimit.Margin = new Padding(4);\n            panelGPUClockLimit.MaximumSize = new Size(0, 124);\n            panelGPUClockLimit.Name = \"panelGPUClockLimit\";\n            panelGPUClockLimit.Size = new Size(520, 124);\n            panelGPUClockLimit.TabIndex = 48;\n            // \n            // labelGPUClockLimit\n            // \n            labelGPUClockLimit.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelGPUClockLimit.Location = new Point(326, 16);\n            labelGPUClockLimit.Margin = new Padding(4, 0, 4, 0);\n            labelGPUClockLimit.Name = \"labelGPUClockLimit\";\n            labelGPUClockLimit.Size = new Size(176, 32);\n            labelGPUClockLimit.TabIndex = 29;\n            labelGPUClockLimit.Text = \"1500 MHz\";\n            labelGPUClockLimit.TextAlign = ContentAlignment.TopRight;\n            // \n            // trackGPUClockLimit\n            // \n            trackGPUClockLimit.LargeChange = 100;\n            trackGPUClockLimit.Location = new Point(6, 48);\n            trackGPUClockLimit.Margin = new Padding(4, 2, 4, 2);\n            trackGPUClockLimit.Maximum = 3000;\n            trackGPUClockLimit.Name = \"trackGPUClockLimit\";\n            trackGPUClockLimit.RightToLeft = RightToLeft.No;\n            trackGPUClockLimit.Size = new Size(496, 90);\n            trackGPUClockLimit.SmallChange = 10;\n            trackGPUClockLimit.TabIndex = 18;\n            trackGPUClockLimit.TickFrequency = 50;\n            trackGPUClockLimit.TickStyle = TickStyle.TopLeft;\n            // \n            // labelGPUClockLimitTitle\n            // \n            labelGPUClockLimitTitle.AutoSize = true;\n            labelGPUClockLimitTitle.Location = new Point(10, 16);\n            labelGPUClockLimitTitle.Margin = new Padding(4, 0, 4, 0);\n            labelGPUClockLimitTitle.Name = \"labelGPUClockLimitTitle\";\n            labelGPUClockLimitTitle.Size = new Size(188, 32);\n            labelGPUClockLimitTitle.TabIndex = 17;\n            labelGPUClockLimitTitle.Text = \"Core Clock Limit\";\n            // \n            // panelTitleGPU\n            // \n            panelTitleGPU.AutoSize = true;\n            panelTitleGPU.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelTitleGPU.Controls.Add(pictureGPU);\n            panelTitleGPU.Controls.Add(labelGPU);\n            panelTitleGPU.Dock = DockStyle.Top;\n            panelTitleGPU.Location = new Point(0, 0);\n            panelTitleGPU.Margin = new Padding(4);\n            panelTitleGPU.Name = \"panelTitleGPU\";\n            panelTitleGPU.Size = new Size(520, 60);\n            panelTitleGPU.TabIndex = 43;\n            // \n            // pictureGPU\n            // \n            pictureGPU.BackgroundImage = Properties.Resources.icons8_video_card_32;\n            pictureGPU.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureGPU.ErrorImage = null;\n            pictureGPU.InitialImage = null;\n            pictureGPU.Location = new Point(10, 18);\n            pictureGPU.Margin = new Padding(4, 2, 4, 10);\n            pictureGPU.Name = \"pictureGPU\";\n            pictureGPU.Size = new Size(32, 32);\n            pictureGPU.TabIndex = 41;\n            pictureGPU.TabStop = false;\n            // \n            // labelGPU\n            // \n            labelGPU.AutoSize = true;\n            labelGPU.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelGPU.Location = new Point(45, 17);\n            labelGPU.Margin = new Padding(4, 0, 4, 0);\n            labelGPU.Name = \"labelGPU\";\n            labelGPU.Size = new Size(162, 32);\n            labelGPU.TabIndex = 40;\n            labelGPU.Text = \"GPU Settings\";\n            // \n            // panelNav\n            // \n            panelNav.AutoSize = true;\n            panelNav.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelNav.Controls.Add(tableNav);\n            panelNav.Dock = DockStyle.Top;\n            panelNav.Location = new Point(10, 0);\n            panelNav.Margin = new Padding(4);\n            panelNav.Name = \"panelNav\";\n            panelNav.Size = new Size(520, 66);\n            panelNav.TabIndex = 45;\n            // \n            // tableNav\n            // \n            tableNav.ColumnCount = 3;\n            tableNav.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33.3333321F));\n            tableNav.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33.3333321F));\n            tableNav.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33.3333321F));\n            tableNav.Controls.Add(buttonAdvanced, 0, 0);\n            tableNav.Controls.Add(buttonGPU, 0, 0);\n            tableNav.Controls.Add(buttonCPU, 0, 0);\n            tableNav.Dock = DockStyle.Top;\n            tableNav.Location = new Point(0, 0);\n            tableNav.MinimumSize = new Size(0, 62);\n            tableNav.Name = \"tableNav\";\n            tableNav.Padding = new Padding(0, 3, 0, 1);\n            tableNav.RowCount = 1;\n            tableNav.RowStyles.Add(new RowStyle());\n            tableNav.Size = new Size(520, 66);\n            tableNav.TabIndex = 42;\n            // \n            // buttonAdvanced\n            // \n            buttonAdvanced.Activated = false;\n            buttonAdvanced.BackColor = SystemColors.ControlLight;\n            buttonAdvanced.BorderColor = Color.Transparent;\n            buttonAdvanced.BorderRadius = 2;\n            buttonAdvanced.Dock = DockStyle.Fill;\n            buttonAdvanced.FlatStyle = FlatStyle.Flat;\n            buttonAdvanced.Location = new Point(350, 5);\n            buttonAdvanced.Margin = new Padding(4, 2, 4, 2);\n            buttonAdvanced.Name = \"buttonAdvanced\";\n            buttonAdvanced.Secondary = true;\n            buttonAdvanced.Size = new Size(166, 58);\n            buttonAdvanced.TabIndex = 51;\n            buttonAdvanced.Text = \"Advanced\";\n            buttonAdvanced.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonAdvanced.UseVisualStyleBackColor = false;\n            // \n            // buttonGPU\n            // \n            buttonGPU.Activated = false;\n            buttonGPU.BackColor = SystemColors.ControlLight;\n            buttonGPU.BorderColor = Color.Transparent;\n            buttonGPU.BorderRadius = 2;\n            buttonGPU.Dock = DockStyle.Fill;\n            buttonGPU.FlatStyle = FlatStyle.Flat;\n            buttonGPU.Location = new Point(177, 5);\n            buttonGPU.Margin = new Padding(4, 2, 4, 2);\n            buttonGPU.Name = \"buttonGPU\";\n            buttonGPU.Secondary = true;\n            buttonGPU.Size = new Size(165, 58);\n            buttonGPU.TabIndex = 52;\n            buttonGPU.Text = \"GPU\";\n            buttonGPU.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonGPU.UseVisualStyleBackColor = false;\n            // \n            // buttonCPU\n            // \n            buttonCPU.Activated = false;\n            buttonCPU.BackColor = SystemColors.ControlLight;\n            buttonCPU.BorderColor = Color.Transparent;\n            buttonCPU.BorderRadius = 2;\n            buttonCPU.Dock = DockStyle.Fill;\n            buttonCPU.FlatStyle = FlatStyle.Flat;\n            buttonCPU.Location = new Point(4, 5);\n            buttonCPU.Margin = new Padding(4, 2, 4, 2);\n            buttonCPU.Name = \"buttonCPU\";\n            buttonCPU.Secondary = true;\n            buttonCPU.Size = new Size(165, 58);\n            buttonCPU.TabIndex = 50;\n            buttonCPU.Text = \"CPU\";\n            buttonCPU.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonCPU.UseVisualStyleBackColor = false;\n            // \n            // Fans\n            // \n            AutoScaleDimensions = new SizeF(192F, 192F);\n            AutoScaleMode = AutoScaleMode.Dpi;\n            AutoSize = true;\n            AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            ClientSize = new Size(1350, 1100);\n            Controls.Add(panelFans);\n            Controls.Add(panelSliders);\n            Margin = new Padding(4, 2, 4, 2);\n            MinimizeBox = false;\n            MinimumSize = new Size(26, 1100);\n            Name = \"Fans\";\n            ShowIcon = false;\n            ShowInTaskbar = false;\n            StartPosition = FormStartPosition.Manual;\n            Text = \"Fans and Power\";\n            panelFans.ResumeLayout(false);\n            panelFans.PerformLayout();\n            tableFanCharts.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)chartGPU).EndInit();\n            ((System.ComponentModel.ISupportInitialize)chartCPU).EndInit();\n            ((System.ComponentModel.ISupportInitialize)chartXGM).EndInit();\n            ((System.ComponentModel.ISupportInitialize)chartMid).EndInit();\n            panelTitleFans.ResumeLayout(false);\n            panelTitleFans.PerformLayout();\n            tableLayoutModes.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)picturePerf).EndInit();\n            panelApplyFans.ResumeLayout(false);\n            panelApplyFans.PerformLayout();\n            panelSliders.ResumeLayout(false);\n            panelSliders.PerformLayout();\n            panelAdvanced.ResumeLayout(false);\n            panelAdvanced.PerformLayout();\n            panelAdvancedAlways.ResumeLayout(false);\n            panelAdvancedApply.ResumeLayout(false);\n            panelUViGPU.ResumeLayout(false);\n            panelUViGPU.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)trackUViGPU).EndInit();\n            panelUV.ResumeLayout(false);\n            panelUV.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)trackUV).EndInit();\n            panelTitleAdvanced.ResumeLayout(false);\n            panelTitleAdvanced.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureUV).EndInit();\n            panelTemperature.ResumeLayout(false);\n            panelTemperature.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)trackTemp).EndInit();\n            panelTitleTemp.ResumeLayout(false);\n            panelTitleTemp.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureTemp).EndInit();\n            panelDownload.ResumeLayout(false);\n            panelDownload.PerformLayout();\n            panelPower.ResumeLayout(false);\n            panelPower.PerformLayout();\n            panelApplyPower.ResumeLayout(false);\n            panelCPU.ResumeLayout(false);\n            panelCPU.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)trackCPU).EndInit();\n            panelFast.ResumeLayout(false);\n            panelFast.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)trackFast).EndInit();\n            panelSlow.ResumeLayout(false);\n            panelSlow.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)trackSlow).EndInit();\n            panelTotal.ResumeLayout(false);\n            panelTotal.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)trackTotal).EndInit();\n            panelTitleCPU.ResumeLayout(false);\n            panelTitleCPU.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureBoxCPU).EndInit();\n            panelBoost.ResumeLayout(false);\n            panelBoostTitle.ResumeLayout(false);\n            panelBoostTitle.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureBoost).EndInit();\n            panelPowerMode.ResumeLayout(false);\n            panelPowerModeTItle.ResumeLayout(false);\n            panelPowerModeTItle.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)picturePowerMode).EndInit();\n            panelGPU.ResumeLayout(false);\n            panelGPU.PerformLayout();\n            panelGPUTemp.ResumeLayout(false);\n            panelGPUTemp.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)trackGPUTemp).EndInit();\n            panelGPUBoost.ResumeLayout(false);\n            panelGPUBoost.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)trackGPUBoost).EndInit();\n            panelGPUPower.ResumeLayout(false);\n            panelGPUPower.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)trackGPUPower).EndInit();\n            panelGPUMemory.ResumeLayout(false);\n            panelGPUMemory.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)trackGPUMemory).EndInit();\n            panelGPUCore.ResumeLayout(false);\n            panelGPUCore.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)trackGPUCore).EndInit();\n            panelGPUClockLimit.ResumeLayout(false);\n            panelGPUClockLimit.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)trackGPUClockLimit).EndInit();\n            panelTitleGPU.ResumeLayout(false);\n            panelTitleGPU.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureGPU).EndInit();\n            panelNav.ResumeLayout(false);\n            tableNav.ResumeLayout(false);\n            ResumeLayout(false);\n            PerformLayout();\n        }\n\n        #endregion\n        private Panel panelFans;\n        private Panel panelSliders;\n        private TableLayoutPanel tableFanCharts;\n        private Chart chartGPU;\n        private Chart chartCPU;\n        private Chart chartMid;\n        private Chart chartXGM;\n        private Label labelTip;\n        private Panel panelPower;\n        private Panel panelCPU;\n        private Label labelCPU;\n        private Label labelLeftCPU;\n        private TrackBar trackCPU;\n        private Panel panelTotal;\n        private Label labelTotal;\n        private Label labelLeftTotal;\n        private TrackBar trackTotal;\n        private Panel panelTitleCPU;\n        private PictureBox pictureBoxCPU;\n        private Label labelPowerLimits;\n        private Panel panelGPU;\n        private Panel panelGPUMemory;\n        private Label labelGPUMemory;\n        private Label labelGPUMemoryTitle;\n        private TrackBar trackGPUMemory;\n        private Panel panelGPUCore;\n        private Label labelGPUCore;\n        private TrackBar trackGPUCore;\n        private Label labelGPUCoreTitle;\n        private Panel panelTitleGPU;\n        private PictureBox pictureGPU;\n        private Label labelGPU;\n        private RCheckBox checkApplyPower;\n        private Panel panelGPUBoost;\n        private Label labelGPUBoost;\n        private Label labelGPUBoostTitle;\n        private TrackBar trackGPUBoost;\n        private Panel panelGPUTemp;\n        private Label labelGPUTemp;\n        private Label labelGPUTempTitle;\n        private TrackBar trackGPUTemp;\n        private Panel panelTitleFans;\n        private Panel panelApplyFans;\n        private Label labelFansResult;\n        private RCheckBox checkApplyFans;\n        private RButton buttonReset;\n        private Label labelBoost;\n        private RComboBox comboBoost;\n        private PictureBox picturePerf;\n        private Label labelFans;\n        private Panel panelFast;\n        private Label labelFast;\n        private Label labelLeftFast;\n        private TrackBar trackFast;\n        private Panel panelBoost;\n        private RComboBox comboModes;\n        private RButton buttonAdd;\n        private RButton buttonRemove;\n        private RButton buttonRename;\n        private Panel panelUV;\n        private Label labelUV;\n        private Label labelLeftUV;\n        private TrackBar trackUV;\n        private PictureBox pictureUV;\n        private Label labelTitleUV;\n        private RButton buttonApplyAdvanced;\n        private Panel panelApplyPower;\n        private Panel panelAdvanced;\n        private Panel panelAdvancedApply;\n        private Panel panelTitleAdvanced;\n        private Panel panelUViGPU;\n        private Label labelUViGPU;\n        private Label labelLeftUViGPU;\n        private TrackBar trackUViGPU;\n        private Panel panelNav;\n        private TableLayoutPanel tableNav;\n        private RButton buttonCPU;\n        private RButton buttonGPU;\n        private RButton buttonAdvanced;\n        private Panel panelBoostTitle;\n        private PictureBox pictureBoost;\n        private Label labelBoostTitle;\n        private Label labelRisky;\n        private Panel panelTitleTemp;\n        private PictureBox pictureTemp;\n        private Label labelTempLimit;\n        private Panel panelTemperature;\n        private Label labelTemp;\n        private Label labelLeftTemp;\n        private TrackBar trackTemp;\n        private Panel panelAdvancedAlways;\n        private RCheckBox checkApplyUV;\n        private Panel panelPowerMode;\n        private RComboBox comboPowerMode;\n        private Panel panelPowerModeTItle;\n        private PictureBox picturePowerMode;\n        private Label labelPowerModeTitle;\n        private Panel panelGPUClockLimit;\n        private Label labelGPUClockLimit;\n        private TrackBar trackGPUClockLimit;\n        private Label labelGPUClockLimitTitle;\n        private RButton buttonCalibrate;\n        private Panel panelSlow;\n        private Label labelSlow;\n        private Label labelLeftSlow;\n        private TrackBar trackSlow;\n        private Panel panelDownload;\n        private RButton buttonDownload;\n        private Panel panelGPUPower;\n        private Label labelGPUPower;\n        private Label labelGPUPowerTitle;\n        private TrackBar trackGPUPower;\n        private TableLayoutPanel tableLayoutModes;\n        private RCheckBox checkFanClamp;\n    }\n}"
  },
  {
    "path": "app/Fans.cs",
    "content": "﻿using GHelper.Fan;\nusing GHelper.Gpu.NVidia;\nusing GHelper.Mode;\nusing GHelper.UI;\nusing GHelper.USB;\nusing Ryzen;\nusing System.Diagnostics;\nusing System.Management;\nusing System.Windows.Forms.DataVisualization.Charting;\n\nnamespace GHelper\n{\n    public partial class Fans : RForm\n    {\n\n        int curIndex = -1;\n        DataPoint? curPoint = null;\n\n        Series seriesCPU;\n        Series seriesGPU;\n        Series seriesMid;\n        Series seriesXGM;\n\n        static bool gpuVisible = true;\n        static bool fanRpm = true;\n\n        const int tempMin = 20;\n        const int tempMax = 110;\n\n        const int fansMax = 100;\n\n        NvidiaGpuControl? nvControl = null;\n        ModeControl modeControl = Program.modeControl;\n\n        FanSensorControl fanSensorControl;\n\n        static int gpuPowerBase = 0;\n        static bool isGPUPower => gpuPowerBase > 0;\n        static bool clampFanDots = AppConfig.IsClampFanDots();\n\n        public Fans()\n        {\n\n            InitializeComponent();\n\n            fanSensorControl = new FanSensorControl(this);\n\n            //float dpi = ControlHelper.GetDpiScale(this).Value;\n            //comboModes.Size = new Size(comboModes.Width, (int)dpi * 18);\n            comboModes.ClientSize = new Size(comboModes.Width, comboModes.Height - 4);\n\n            Text = Properties.Strings.FansAndPower;\n            labelPowerLimits.Text = Properties.Strings.PowerLimits;\n            checkApplyPower.Text = Properties.Strings.ApplyPowerLimits;\n\n            labelFans.Text = \"BIOS \" + Properties.Strings.FanCurves;\n            labelBoost.Text = Properties.Strings.CPUBoost;\n            buttonReset.Text = Properties.Strings.FactoryDefaults;\n            checkApplyFans.Text = Properties.Strings.ApplyFanCurve;\n\n            labelGPU.Text = Properties.Strings.GPUSettings;\n\n            labelGPUCoreTitle.Text = Properties.Strings.GPUCoreClockOffset;\n            labelGPUMemoryTitle.Text = Properties.Strings.GPUMemoryClockOffset;\n            labelGPUBoostTitle.Text = Properties.Strings.GPUBoost;\n            labelGPUTempTitle.Text = Properties.Strings.GPUTempTarget;\n            labelGPUPowerTitle.Text = Properties.Strings.GPUPower;\n\n            labelRisky.Text = Properties.Strings.UndervoltingRisky;\n            buttonApplyAdvanced.Text = Properties.Strings.Apply;\n            checkApplyUV.Text = Properties.Strings.AutoApply;\n\n            buttonCalibrate.Text = Properties.Strings.Calibrate;\n\n            InitTheme(true);\n\n            labelTip.Visible = false;\n            labelTip.BackColor = Color.Transparent;\n\n            seriesCPU = chartCPU.Series.Add(\"CPU\");\n            seriesGPU = chartGPU.Series.Add(\"GPU\");\n            seriesMid = chartMid.Series.Add(\"Mid\");\n            seriesXGM = chartXGM.Series.Add(\"XGM\");\n\n            seriesCPU.Color = colorStandard;\n            seriesGPU.Color = colorTurbo;\n            seriesMid.Color = colorEco;\n            seriesXGM.Color = Color.Orange;\n\n            chartCPU.MouseMove += (sender, e) => ChartCPU_MouseMove(sender, e, AsusFan.CPU);\n            chartCPU.MouseUp += ChartCPU_MouseUp;\n            chartCPU.MouseLeave += ChartCPU_MouseLeave;\n\n            chartGPU.MouseMove += (sender, e) => ChartCPU_MouseMove(sender, e, AsusFan.GPU);\n            chartGPU.MouseUp += ChartCPU_MouseUp;\n            chartGPU.MouseLeave += ChartCPU_MouseLeave;\n\n            chartMid.MouseMove += (sender, e) => ChartCPU_MouseMove(sender, e, AsusFan.Mid);\n            chartMid.MouseUp += ChartCPU_MouseUp;\n            chartMid.MouseLeave += ChartCPU_MouseLeave;\n\n            chartXGM.MouseMove += (sender, e) => ChartCPU_MouseMove(sender, e, AsusFan.XGM);\n            chartXGM.MouseUp += ChartCPU_MouseUp;\n            chartXGM.MouseLeave += ChartCPU_MouseLeave;\n\n            chartCPU.MouseClick += ChartCPU_MouseClick;\n            chartGPU.MouseClick += ChartCPU_MouseClick;\n            chartMid.MouseClick += ChartCPU_MouseClick;\n            chartXGM.MouseClick += ChartCPU_MouseClick;\n\n            buttonReset.Click += ButtonReset_Click;\n\n            trackTotal.Maximum = AsusACPI.MaxTotal;\n            trackTotal.Minimum = AsusACPI.MinTotal;\n\n            trackSlow.Maximum = AsusACPI.MaxTotal;\n            trackSlow.Minimum = AsusACPI.MinTotal;\n\n            trackCPU.Maximum = AsusACPI.MaxCPU;\n            trackCPU.Minimum = AsusACPI.MinCPU;\n\n            trackFast.Maximum = AsusACPI.MaxTotal;\n            trackFast.Minimum = AsusACPI.MinTotal;\n\n            trackTotal.Scroll += TrackTotal_Scroll;\n            trackSlow.Scroll += TrackSlow_Scroll;\n            trackFast.Scroll += TrackFast_Scroll;\n            trackCPU.Scroll += TrackCPU_Scroll;\n\n            trackFast.MouseUp += TrackPower_MouseUp;\n            trackCPU.MouseUp += TrackPower_MouseUp;\n            trackTotal.MouseUp += TrackPower_MouseUp;\n            trackSlow.MouseUp += TrackPower_MouseUp;\n\n            trackFast.KeyUp += TrackPower_KeyUp;\n            trackCPU.KeyUp += TrackPower_KeyUp;\n            trackTotal.KeyUp += TrackPower_KeyUp;\n            trackSlow.KeyUp += TrackPower_KeyUp;\n\n            checkApplyFans.Click += CheckApplyFans_Click;\n            checkApplyPower.Click += CheckApplyPower_Click;\n\n            trackGPUClockLimit.Minimum = NvidiaGpuControl.MinClockLimit;\n            trackGPUClockLimit.Maximum = NvidiaGpuControl.MaxClockLimit;\n\n            trackGPUCore.Minimum = NvidiaGpuControl.MinCoreOffset;\n            trackGPUCore.Maximum = NvidiaGpuControl.MaxCoreOffset;\n\n            trackGPUMemory.Minimum = NvidiaGpuControl.MinMemoryOffset;\n            trackGPUMemory.Maximum = NvidiaGpuControl.MaxMemoryOffset;\n\n            trackGPUBoost.Minimum = AsusACPI.MinGPUBoost;\n            trackGPUBoost.Maximum = AsusACPI.MaxGPUBoost;\n\n            trackGPUTemp.Minimum = AsusACPI.MinGPUTemp;\n            trackGPUTemp.Maximum = AsusACPI.MaxGPUTemp;\n\n            trackGPUPower.Minimum = AsusACPI.MinGPUPower;\n            trackGPUPower.Maximum = AsusACPI.MaxGPUPower;\n\n            trackGPUClockLimit.Scroll += trackGPUClockLimit_Scroll;\n            trackGPUCore.Scroll += trackGPU_Scroll;\n            trackGPUMemory.Scroll += trackGPU_Scroll;\n\n            trackGPUBoost.Scroll += trackGPUPower_Scroll;\n            trackGPUTemp.Scroll += trackGPUPower_Scroll;\n            trackGPUPower.Scroll += trackGPUPower_Scroll;\n\n            trackGPUCore.MouseUp += TrackGPUClocks_MouseUp;\n            trackGPUMemory.MouseUp += TrackGPUClocks_MouseUp;\n            trackGPUClockLimit.MouseUp += TrackGPUClocks_MouseUp;\n\n            trackGPUBoost.MouseUp += TrackGPU_MouseUp;\n            trackGPUTemp.MouseUp += TrackGPU_MouseUp;\n            trackGPUPower.MouseUp += TrackGPU_MouseUp;\n\n\n            //labelInfo.MaximumSize = new Size(280, 0);\n            labelFansResult.Visible = false;\n\n\n            trackUV.Minimum = RyzenControl.MinCPUUV;\n            trackUV.Maximum = RyzenControl.MaxCPUUV;\n\n            trackUViGPU.Minimum = RyzenControl.MinIGPUUV;\n            trackUViGPU.Maximum = RyzenControl.MaxIGPUUV;\n\n            trackTemp.Minimum = RyzenControl.MinTemp;\n            trackTemp.Maximum = RyzenControl.MaxTemp;\n\n            comboPowerMode.DropDownStyle = ComboBoxStyle.DropDownList;\n            comboPowerMode.DataSource = new BindingSource(PowerNative.powerModes, null);\n            comboPowerMode.DisplayMember = \"Value\";\n            comboPowerMode.ValueMember = \"Key\";\n\n            FillModes(false);\n            InitAll();\n            InitCPU();\n\n            comboBoost.SelectedValueChanged += ComboBoost_Changed;\n            comboPowerMode.SelectedValueChanged += ComboPowerMode_Changed;\n\n\n            comboModes.SelectionChangeCommitted += ComboModes_SelectedValueChanged;\n            comboModes.TextChanged += ComboModes_TextChanged;\n            comboModes.KeyPress += ComboModes_KeyPress;\n\n            Shown += Fans_Shown;\n\n            buttonAdd.Click += ButtonAdd_Click;\n            buttonRemove.Click += ButtonRemove_Click;\n            buttonRename.Click += ButtonRename_Click;\n\n\n            trackUV.Scroll += TrackUV_Scroll;\n            trackUViGPU.Scroll += TrackUV_Scroll;\n            trackTemp.Scroll += TrackUV_Scroll;\n\n            buttonApplyAdvanced.Click += ButtonApplyAdvanced_Click;\n\n            buttonCPU.BorderColor = colorStandard;\n            buttonGPU.BorderColor = colorTurbo;\n            buttonAdvanced.BorderColor = Color.Gray;\n\n            buttonCPU.Click += ButtonCPU_Click;\n            buttonGPU.Click += ButtonGPU_Click;\n            buttonAdvanced.Click += ButtonAdvanced_Click;\n\n            checkApplyUV.Click += CheckApplyUV_Click;\n\n            buttonCalibrate.Click += ButtonCalibrate_Click;\n\n            buttonDownload.Click += ButtonDownload_Click;\n\n            checkFanClamp.Checked = clampFanDots;\n            checkFanClamp.Click += CheckFanClamp_Click;\n\n            ToggleNavigation(0);\n\n            if (Program.acpi.DeviceGet(AsusACPI.DevsCPUFanCurve) < 0) buttonCalibrate.Visible = false;\n\n            FormClosed += Fans_FormClosed;\n\n        }\n\n        private void CheckFanClamp_Click(object? sender, EventArgs e)\n        {\n            clampFanDots = checkFanClamp.Checked;\n            AppConfig.Set(\"fan_clamp\", clampFanDots ? 1 : 0);\n        }\n\n        private void ButtonDownload_Click(object? sender, EventArgs e)\n        {\n            RyzenControl.DownloadRing();\n\n            panelAdvancedAlways.Visible = true;\n            panelAdvancedApply.Visible = true;\n            labelRisky.Visible = true;\n            panelUViGPU.Visible = true;\n            panelUV.Visible = true;\n            panelTitleAdvanced.Visible = true;\n            panelTemperature.Visible = true;\n            panelTitleTemp.Visible = true;\n\n            VisualiseAdvanced();\n        }\n\n        private void ButtonCalibrate_Click(object? sender, EventArgs e)\n        {\n            buttonCalibrate.Enabled = false;\n            fanSensorControl.StartCalibration();\n        }\n\n        private void ChartCPU_MouseClick(object? sender, MouseEventArgs e)\n        {\n            if (sender is null) return;\n            Chart chart = (Chart)sender;\n\n            HitTestResult result = chart.HitTest(e.X, e.Y);\n\n            if ((result.ChartElementType == ChartElementType.AxisLabels || result.ChartElementType == ChartElementType.Axis) && result.Axis == chart.ChartAreas[0].AxisY)\n            {\n                fanRpm = !fanRpm;\n                SetAxis(chartCPU, AsusFan.CPU);\n                SetAxis(chartGPU, AsusFan.GPU);\n                if (chartMid.Visible) SetAxis(chartMid, AsusFan.Mid);\n                if (chartXGM.Visible) SetAxis(chartXGM, AsusFan.XGM);\n            }\n\n        }\n\n        private void Fans_FormClosed(object? sender, FormClosedEventArgs e)\n        {\n            //Because windows charts seem to eat a lot of memory :(\n            GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);\n        }\n\n        private void CheckApplyUV_Click(object? sender, EventArgs e)\n        {\n            AppConfig.SetMode(\"auto_uv\", checkApplyUV.Checked ? 1 : 0);\n            modeControl.AutoRyzen();\n        }\n\n        public void InitAll()\n        {\n            InitMode();\n            InitFans();\n            InitPower();\n            InitPowerPlan();\n            InitUV();\n            InitGPU();\n        }\n\n        public void InitCPU()\n        {\n            Task.Run(async () =>\n            {\n                string CPUName;\n                using (ManagementObjectSearcher myProcessorObject = new ManagementObjectSearcher(\"select * from Win32_Processor\"))\n                    foreach (ManagementObject obj in myProcessorObject.Get())\n                    {\n                        CPUName = obj[\"Name\"].ToString();\n                        Invoke(delegate\n                        {\n                            Text = Properties.Strings.FansAndPower + \" - \" + CPUName;\n                        });\n                    }\n            });\n        }\n\n        public void ToggleNavigation(int index = 0)\n        {\n\n            SuspendLayout();\n\n            buttonCPU.Activated = false;\n            buttonGPU.Activated = false;\n            buttonAdvanced.Activated = false;\n\n            panelPower.Visible = false;\n            panelGPU.Visible = false;\n            panelAdvanced.Visible = false;\n\n            switch (index)\n            {\n                case 1:\n                    buttonGPU.Activated = true;\n                    panelGPU.Visible = true;\n                    break;\n                case 2:\n                    buttonAdvanced.Activated = true;\n                    panelAdvanced.Visible = true;\n                    break;\n                default:\n                    buttonCPU.Activated = true;\n                    panelPower.Visible = true;\n                    break;\n            }\n\n            ResumeLayout(false);\n            PerformLayout();\n        }\n\n        private void ButtonAdvanced_Click(object? sender, EventArgs e)\n        {\n            ToggleNavigation(2);\n        }\n\n        private void ButtonGPU_Click(object? sender, EventArgs e)\n        {\n            ToggleNavigation(1);\n        }\n\n        private void ButtonCPU_Click(object? sender, EventArgs e)\n        {\n            ToggleNavigation(0);\n        }\n\n        private void ButtonApplyAdvanced_Click(object? sender, EventArgs e)\n        {\n            modeControl.SetRyzen(true);\n            checkApplyUV.Enabled = true;\n        }\n\n        public void InitUV()\n        {\n\n            //if (!ProcessHelper.IsUserAdministrator()) return;\n\n            int cpuUV = Math.Max(trackUV.Minimum, Math.Min(trackUV.Maximum, AppConfig.GetMode(\"cpu_uv\", 0)));\n            int igpuUV = Math.Max(trackUViGPU.Minimum, Math.Min(trackUViGPU.Maximum, AppConfig.GetMode(\"igpu_uv\", 0)));\n\n            int temp = AppConfig.GetMode(\"cpu_temp\");\n            if (temp < RyzenControl.MinTemp || temp > RyzenControl.MaxTemp) temp = RyzenControl.MaxTemp;\n\n            checkApplyUV.Enabled = checkApplyUV.Checked = AppConfig.IsMode(\"auto_uv\");\n\n            trackUV.Value = cpuUV;\n            trackUViGPU.Value = igpuUV;\n            trackTemp.Value = temp;\n\n            VisualiseAdvanced();\n\n            buttonAdvanced.Visible = RyzenControl.IsAMD();\n\n        }\n\n        private void VisualiseAdvanced()\n        {\n\n            if (!RyzenControl.IsRingExsists())\n            {\n                panelTitleAdvanced.Visible = false;\n                labelRisky.Visible = false;\n                panelUV.Visible = false;\n                panelUViGPU.Visible = false;\n                panelTitleTemp.Visible = false;\n                panelTemperature.Visible = false;\n                panelAdvancedAlways.Visible = false;\n                panelAdvancedApply.Visible = false;\n                panelDownload.Visible = true;\n\n            }\n            else\n            {\n                panelDownload.Visible = false;\n            }\n\n            if (!RyzenControl.IsSupportedUV())\n            {\n                panelTitleAdvanced.Visible = false;\n                labelRisky.Visible = false;\n                panelUV.Visible = false;\n                panelUViGPU.Visible = false;\n            }\n\n            if (!RyzenControl.IsSupportedUViGPU())\n            {\n                panelUViGPU.Visible = false;\n            }\n\n            labelUV.Text = trackUV.Value.ToString();\n            labelUViGPU.Text = trackUViGPU.Value.ToString();\n\n            labelTemp.Text = (trackTemp.Value < RyzenControl.MaxTemp) ? trackTemp.Value.ToString() + \"°C\" : \"Default\";\n        }\n\n        private void AdvancedScroll()\n        {\n            AppConfig.SetMode(\"auto_uv\", 0);\n            checkApplyUV.Enabled = checkApplyUV.Checked = false;\n\n            VisualiseAdvanced();\n\n            AppConfig.SetMode(\"cpu_temp\", trackTemp.Value);\n            AppConfig.SetMode(\"cpu_uv\", trackUV.Value);\n            AppConfig.SetMode(\"igpu_uv\", trackUViGPU.Value);\n        }\n\n\n        private void TrackUV_Scroll(object? sender, EventArgs e)\n        {\n            AdvancedScroll();\n        }\n\n        private void ComboModes_KeyPress(object? sender, KeyPressEventArgs e)\n        {\n            if (e.KeyChar == 13) RenameToggle();\n        }\n\n        private void ComboModes_TextChanged(object? sender, EventArgs e)\n        {\n            if (comboModes.DropDownStyle == ComboBoxStyle.DropDownList) return;\n            if (!Modes.IsCurrentCustom()) return;\n            AppConfig.SetMode(\"mode_name\", comboModes.Text);\n        }\n\n        private void RenameToggle()\n        {\n            if (comboModes.DropDownStyle == ComboBoxStyle.DropDownList)\n                comboModes.DropDownStyle = ComboBoxStyle.Simple;\n            else\n            {\n                var mode = Modes.GetCurrent();\n                FillModes();\n                comboModes.SelectedValue = mode;\n            }\n        }\n\n        private void ButtonRename_Click(object? sender, EventArgs e)\n        {\n            RenameToggle();\n        }\n\n        private void ButtonRemove_Click(object? sender, EventArgs e)\n        {\n            int mode = Modes.GetCurrent();\n            if (!Modes.IsCurrentCustom()) return;\n\n            Modes.Remove(mode);\n            FillModes();\n            modeControl.SetPerformanceMode(AsusACPI.PerformanceBalanced);\n\n        }\n\n        private void FillModes(bool contextMenu = true)\n        {\n            comboModes.DropDownStyle = ComboBoxStyle.DropDownList;\n            comboModes.DataSource = new BindingSource(Modes.GetDictonary(), null);\n            comboModes.DisplayMember = \"Value\";\n            comboModes.ValueMember = \"Key\";\n            if (contextMenu) Program.settingsForm.SetContextMenu();\n        }\n\n        private void ButtonAdd_Click(object? sender, EventArgs e)\n        {\n            int mode = Modes.Add();\n            FillModes();\n            modeControl.SetPerformanceMode(mode);\n        }\n\n        public void InitMode()\n        {\n            int mode = Modes.GetCurrent();\n            comboModes.SelectedValue = mode;\n            buttonRename.Visible = buttonRemove.Visible = Modes.IsCurrentCustom();\n        }\n\n        private void ComboModes_SelectedValueChanged(object? sender, EventArgs e)\n        {\n            var selectedMode = comboModes.SelectedValue;\n\n            if (selectedMode == null) return;\n            if ((int)selectedMode == Modes.GetCurrent()) return;\n\n            Debug.WriteLine(selectedMode);\n\n            modeControl.SetPerformanceMode((int)selectedMode);\n        }\n\n        private void TrackGPU_MouseUp(object? sender, MouseEventArgs e)\n        {\n            modeControl.SetGPUPower();\n        }\n\n        private void TrackGPUClocks_MouseUp(object? sender, MouseEventArgs e)\n        {\n            modeControl.SetGPUClocks(true);\n        }\n\n        private void InitGPUPower()\n        {\n            gpuPowerBase = Program.acpi.DeviceGet(AsusACPI.GPU_BASE);\n            if (gpuPowerBase >= 0) Logger.WriteLine($\"ReadGPUPowerBase: {gpuPowerBase}\");\n\n            panelGPUPower.Visible = isGPUPower;\n            if (!isGPUPower) return;\n\n            int maxGPUPower = NvidiaSmi.GetMaxGPUPower();\n            if (maxGPUPower > 0)\n            {\n                AsusACPI.MaxGPUPower = maxGPUPower - gpuPowerBase - AsusACPI.MaxGPUBoost;\n                trackGPUPower.Minimum = AsusACPI.MinGPUPower;\n                trackGPUPower.Maximum = AsusACPI.MaxGPUPower;\n            }\n\n            Task.Run(async () =>\n            {\n                await Task.Delay(TimeSpan.FromMilliseconds(200));\n                int gpuPowerVar = Program.acpi.DeviceGet(AsusACPI.GPU_POWER);\n                Logger.WriteLine($\"ReadGPUPower ({Modes.GetCurrentBase()}): {gpuPowerVar}\");\n\n                int gpu_power = AppConfig.GetMode(\"gpu_power\");\n                if (gpu_power < 0) gpu_power = (gpuPowerVar >= 0) ? gpuPowerVar : AsusACPI.MaxGPUPower;\n\n                Invoke(delegate\n                {\n                    trackGPUPower.Value = Math.Max(Math.Min(gpu_power, AsusACPI.MaxGPUPower), AsusACPI.MinGPUPower);\n                    VisualiseGPUSettings();\n                });\n            });\n        }\n\n        public void InitGPU()\n        {\n\n            if (Program.acpi.DeviceGet(AsusACPI.GPUEco) == 1)\n            {\n                gpuVisible = buttonGPU.Visible = false;\n                return;\n            }\n\n            if (HardwareControl.GpuControl is null || !HardwareControl.GpuControl.IsValid) HardwareControl.RecreateGpuControl();\n\n            if (HardwareControl.GpuControl is not null && HardwareControl.GpuControl.IsNvidia)\n            {\n                nvControl = (NvidiaGpuControl)HardwareControl.GpuControl;\n            }\n            else\n            {\n                gpuVisible = buttonGPU.Visible = false;\n                return;\n            }\n\n            try\n            {\n                gpuVisible = buttonGPU.Visible = true;\n\n                int gpu_boost = AppConfig.GetMode(\"gpu_boost\");\n                int gpu_temp = AppConfig.GetMode(\"gpu_temp\");\n\n                int core = AppConfig.GetMode(\"gpu_core\");\n                int memory = AppConfig.GetMode(\"gpu_memory\");\n                int clock_limit = AppConfig.GetMode(\"gpu_clock_limit\");\n\n                if (gpu_boost < 0) gpu_boost = AsusACPI.MaxGPUBoost;\n                if (gpu_temp < 0) gpu_temp = AsusACPI.MaxGPUTemp;\n\n                if (core == -1) core = 0;\n                if (memory == -1) memory = 0;\n                if (clock_limit == -1) clock_limit = NvidiaGpuControl.MaxClockLimit;\n\n                if (nvControl is not null)\n                {\n                    if (nvControl.GetClocks(out int current_core, out int current_memory))\n                    {\n                        core = current_core;\n                        memory = current_memory;\n                    }\n\n                    int _clockLimit = nvControl.GetMaxGPUCLock();\n\n                    if (_clockLimit == 0) clock_limit = NvidiaGpuControl.MaxClockLimit;\n                    else if (_clockLimit > 0) clock_limit = _clockLimit;\n\n                    try\n                    {\n                        labelGPU.Text = nvControl.FullName;\n                    }\n                    catch\n                    {\n\n                    }\n                }\n\n                trackGPUClockLimit.Value = Math.Max(Math.Min(clock_limit, NvidiaGpuControl.MaxClockLimit), NvidiaGpuControl.MinClockLimit);\n\n                trackGPUCore.Value = Math.Max(Math.Min(core, NvidiaGpuControl.MaxCoreOffset), NvidiaGpuControl.MinCoreOffset);\n                trackGPUMemory.Value = Math.Max(Math.Min(memory, NvidiaGpuControl.MaxMemoryOffset), NvidiaGpuControl.MinMemoryOffset);\n\n                trackGPUBoost.Value = Math.Max(Math.Min(gpu_boost, AsusACPI.MaxGPUBoost), AsusACPI.MinGPUBoost);\n                trackGPUTemp.Value = Math.Max(Math.Min(gpu_temp, AsusACPI.MaxGPUTemp), AsusACPI.MinGPUTemp);\n\n\n                panelGPUBoost.Visible = (Program.acpi.DeviceGet(AsusACPI.PPT_GPUC0) >= 0);\n                panelGPUTemp.Visible = (Program.acpi.DeviceGet(AsusACPI.PPT_GPUC2) >= 0);\n\n                VisualiseGPUSettings();\n\n                InitGPUPower();\n\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine(ex.ToString());\n                gpuVisible = buttonGPU.Visible = false;\n            }\n\n        }\n\n        private void VisualiseGPUSettings()\n        {\n            labelGPUCore.Text = $\"{trackGPUCore.Value} MHz\";\n            labelGPUMemory.Text = $\"{trackGPUMemory.Value} MHz\";\n\n            labelGPUBoost.Text = $\"{trackGPUBoost.Value}W\";\n            labelGPUTemp.Text = $\"{trackGPUTemp.Value}°C\";\n\n            if (trackGPUClockLimit.Value >= NvidiaGpuControl.MaxClockLimit)\n                labelGPUClockLimit.Text = \"Default\";\n            else\n                labelGPUClockLimit.Text = $\"{trackGPUClockLimit.Value} MHz\";\n\n            labelGPUPower.Text = (gpuPowerBase + trackGPUPower.Value) + \"W\";\n\n        }\n\n        private void trackGPUClockLimit_Scroll(object? sender, EventArgs e)\n        {\n\n            int maxClock = (int)Math.Round((float)trackGPUClockLimit.Value / 5) * 5;\n\n            trackGPUClockLimit.Value = maxClock;\n            AppConfig.SetMode(\"gpu_clock_limit\", maxClock);\n            VisualiseGPUSettings();\n        }\n\n        private void trackGPU_Scroll(object? sender, EventArgs e)\n        {\n            if (sender is null) return;\n            TrackBar track = (TrackBar)sender;\n            track.Value = (int)Math.Round((float)track.Value / 5) * 5;\n\n            AppConfig.SetMode(\"gpu_core\", trackGPUCore.Value);\n            AppConfig.SetMode(\"gpu_memory\", trackGPUMemory.Value);\n\n\n            VisualiseGPUSettings();\n\n        }\n\n        private void trackGPUPower_Scroll(object? sender, EventArgs e)\n        {\n            AppConfig.SetMode(\"gpu_boost\", trackGPUBoost.Value);\n            AppConfig.SetMode(\"gpu_temp\", trackGPUTemp.Value);\n\n            if (isGPUPower) AppConfig.SetMode(\"gpu_power\", trackGPUPower.Value);\n\n            VisualiseGPUSettings();\n        }\n\n        static string ChartYLabel(int percentage, AsusFan device, string unit = \"\")\n        {\n            if (percentage == 0) return \"OFF\";\n\n            int Min = FanSensorControl.GetFanMin(device);\n            int Max = FanSensorControl.GetFanMax(device);\n\n            if (fanRpm)\n                return (200 * Math.Floor((float)(Min * 100 + (Max - Min) * percentage) / 200)).ToString() + unit;\n            else\n                return percentage + \"%\";\n        }\n\n        void SetAxis(Chart chart, AsusFan device)\n        {\n\n            chart.ChartAreas[0].AxisY.CustomLabels.Clear();\n\n            for (int i = 0; i <= fansMax; i += 10)\n            {\n                chart.ChartAreas[0].AxisY.CustomLabels.Add(i - 2, i + 2, ChartYLabel(i, device));\n            }\n\n            //chart.ChartAreas[0].AxisY.CustomLabels.Add(fansMax -2, fansMax + 2, Properties.Strings.RPM);\n            chart.ChartAreas[0].AxisY.Interval = 10;\n        }\n\n        void SetChart(Chart chart, AsusFan device)\n        {\n\n            string title = \"\";\n            string scale = \", RPM/°C\";\n\n            switch (device)\n            {\n                case AsusFan.CPU:\n                    title = Properties.Strings.FanProfileCPU + scale;\n                    break;\n                case AsusFan.GPU:\n                    title = Properties.Strings.FanProfileGPU + scale;\n                    break;\n                case AsusFan.Mid:\n                    title = Properties.Strings.FanProfileMid + scale;\n                    break;\n                case AsusFan.XGM:\n                    title = \"XG Mobile\" + scale;\n                    break;\n            }\n\n            chart.Titles[0].Text = title;\n\n            chart.ChartAreas[0].AxisX.Minimum = tempMin;\n            chart.ChartAreas[0].AxisX.Maximum = tempMax;\n            chart.ChartAreas[0].AxisX.Interval = 10;\n\n            chart.ChartAreas[0].AxisY.Minimum = 0;\n            chart.ChartAreas[0].AxisY.Maximum = fansMax;\n\n            chart.ChartAreas[0].AxisY.LabelStyle.Font = new Font(\"Arial\", 7F);\n\n            chart.ChartAreas[0].AxisX.MajorGrid.LineColor = chartGrid;\n            chart.ChartAreas[0].AxisY.MajorGrid.LineColor = chartGrid;\n            chart.ChartAreas[0].AxisX.LineColor = chartGrid;\n            chart.ChartAreas[0].AxisY.LineColor = chartGrid;\n\n            SetAxis(chart, device);\n\n            if (chart.Legends.Count > 0)\n                chart.Legends[0].Enabled = false;\n\n        }\n\n        public void FormPosition()\n        {\n\n            if (Height > Program.settingsForm.Height)\n            {\n                Top = Math.Max(0, Program.settingsForm.Top + Program.settingsForm.Height - Height);\n            }\n            else\n            {\n                Size = MinimumSize = new Size(0, Program.settingsForm.Height);\n                Height = Program.settingsForm.Height;\n                Top = Program.settingsForm.Top;\n            }\n\n            Left = Program.settingsForm.Left - Width - 5;\n        }\n\n        private void Fans_Shown(object? sender, EventArgs e)\n        {\n            FormPosition();\n        }\n\n\n        private void TrackPower_MouseUp(object? sender, MouseEventArgs e)\n        {\n            Task.Run(() =>\n            {\n                modeControl.AutoPower(true);\n            });\n        }\n\n\n        private void TrackPower_KeyUp(object? sender, KeyEventArgs e)\n        {\n            Task.Run(() =>\n            {\n                modeControl.AutoPower(true);\n            });\n        }\n\n        public void InitPowerPlan()\n        {\n            int boost = PowerNative.GetCPUBoost();\n            if (boost >= 0)\n                comboBoost.SelectedIndex = Math.Min(boost, comboBoost.Items.Count - 1);\n\n            string powerMode = PowerNative.GetPowerMode();\n            bool batterySaver = PowerNative.GetBatterySaverStatus();\n\n            comboPowerMode.Enabled = !batterySaver;\n\n            if (batterySaver)\n                comboPowerMode.SelectedIndex = 0;\n            else\n                comboPowerMode.SelectedValue = powerMode;\n\n        }\n\n        private void ComboPowerMode_Changed(object? sender, EventArgs e)\n        {\n            string powerMode = (string)comboPowerMode.SelectedValue;\n            PowerNative.SetPowerMode(powerMode);\n\n            if (PowerNative.GetDefaultPowerMode(Modes.GetCurrentBase()) != powerMode)\n                AppConfig.SetMode(\"powermode\", powerMode);\n            else\n                AppConfig.RemoveMode(\"powermode\");\n        }\n\n        private void ComboBoost_Changed(object? sender, EventArgs e)\n        {\n            if (AppConfig.GetMode(\"auto_boost\") != comboBoost.SelectedIndex)\n            {\n                PowerNative.SetCPUBoost(comboBoost.SelectedIndex);\n            }\n            AppConfig.SetMode(\"auto_boost\", comboBoost.SelectedIndex);\n        }\n\n        private void CheckApplyPower_Click(object? sender, EventArgs e)\n        {\n            if (sender is null) return;\n            CheckBox chk = (CheckBox)sender;\n\n            AppConfig.SetMode(\"auto_apply_power\", chk.Checked ? 1 : 0);\n            modeControl.SetPerformanceMode();\n\n        }\n\n        private void CheckApplyFans_Click(object? sender, EventArgs e)\n        {\n            if (sender is null) return;\n            CheckBox chk = (CheckBox)sender;\n\n            AppConfig.SetMode(\"auto_apply\", chk.Checked ? 1 : 0);\n            modeControl.SetPerformanceMode();\n\n        }\n\n        public void InitAxis()\n        {\n            if (this == null || this.Text == \"\") return;\n\n            Invoke(delegate\n            {\n                buttonCalibrate.Enabled = true;\n                SetAxis(chartCPU, AsusFan.CPU);\n                SetAxis(chartGPU, AsusFan.GPU);\n                if (chartMid.Visible) SetAxis(chartMid, AsusFan.Mid);\n            });\n        }\n\n        public void LabelFansResult(string text)\n        {\n            if (text.Length > 0) Logger.WriteLine(text);\n\n            if (this == null || this.Text == \"\") return;\n\n            Invoke(delegate\n            {\n                labelFansResult.Text = text;\n                labelFansResult.Visible = (text.Length > 0);\n            });\n        }\n\n\n        public void InitPower()\n        {\n\n            bool modeA = Program.acpi.DeviceGet(AsusACPI.PPT_APUA0) >= 0 || RyzenControl.IsAMD();\n            bool modeB0 = Program.acpi.IsAllAmdPPT();\n            bool modeC1 = Program.acpi.DeviceGet(AsusACPI.PPT_APUC1) >= 0;\n\n            panelTotal.Visible = modeA;\n            panelCPU.Visible = modeB0;\n\n            panelApplyPower.Visible = panelTitleCPU.Visible = modeA || modeB0 || modeC1;\n\n\n            // All AMD version has B0 but doesn't have C0 (Nvidia GPU) settings\n            if (modeB0)\n            {\n                labelLeftTotal.Text = \"Platform (CPU + GPU)\";\n                labelLeftCPU.Text = \"CPU\";\n                panelFast.Visible = false;\n                panelSlow.Visible = false;\n            }\n            else\n            {\n                panelSlow.Visible = modeA;\n\n                if (RyzenControl.IsAMD())\n                {\n                    labelLeftTotal.Text = \"SPL (CPU sustained)\";\n                    labelLeftSlow.Text = \"sPPT (CPU 2 min boost)\";\n                    labelLeftFast.Text = \"fPPT (CPU 2 sec boost)\";\n                    panelFast.Visible = modeC1;\n\n                }\n                else\n                {\n                    labelLeftTotal.Text = \"PL1 (CPU sustained)\";\n                    labelLeftSlow.Text = \"PL2 (CPU 2 min boost)\";\n                    panelFast.Visible = false;\n                }\n\n            }\n\n            checkApplyPower.Checked = AppConfig.IsMode(\"auto_apply_power\");\n\n            int limit_total = AppConfig.GetMode(\"limit_total\", AsusACPI.DefaultTotal);\n            int limit_slow = AppConfig.GetMode(\"limit_slow\", limit_total);\n            int limit_fast = AppConfig.GetMode(\"limit_fast\", limit_total);\n            int limit_cpu = AppConfig.GetMode(\"limit_cpu\", AsusACPI.DefaultCPU);\n\n            if (limit_total > AsusACPI.MaxTotal) limit_total = AsusACPI.MaxTotal;\n            if (limit_total < AsusACPI.MinTotal) limit_total = AsusACPI.MinTotal;\n\n            if (limit_cpu > AsusACPI.MaxCPU) limit_cpu = AsusACPI.MaxCPU;\n            if (limit_cpu < AsusACPI.MinCPU) limit_cpu = AsusACPI.MinCPU;\n\n            if (limit_slow > AsusACPI.MaxTotal) limit_slow = AsusACPI.MaxTotal;\n            if (limit_slow < AsusACPI.MinTotal) limit_slow = AsusACPI.MinTotal;\n\n            if (limit_fast > AsusACPI.MaxTotal) limit_fast = AsusACPI.MaxTotal;\n            if (limit_fast < AsusACPI.MinTotal) limit_fast = AsusACPI.MinTotal;\n\n            trackTotal.Value = limit_total;\n            trackSlow.Value = limit_slow;\n            trackCPU.Value = limit_cpu;\n            trackFast.Value = limit_fast;\n\n            SavePower();\n\n        }\n\n        private void SavePower()\n        {\n            labelTotal.Text = trackTotal.Value.ToString() + \"W\";\n            labelSlow.Text = trackSlow.Value.ToString() + \"W\";\n            labelCPU.Text = trackCPU.Value.ToString() + \"W\";\n            labelFast.Text = trackFast.Value.ToString() + \"W\";\n\n            AppConfig.SetMode(\"limit_total\", trackTotal.Value);\n            AppConfig.SetMode(\"limit_slow\", trackSlow.Value);\n            AppConfig.SetMode(\"limit_cpu\", trackCPU.Value);\n            AppConfig.SetMode(\"limit_fast\", trackFast.Value);\n        }\n\n        private void TrackTotal_Scroll(object? sender, EventArgs e)\n        {\n            if (trackTotal.Value > trackSlow.Value) trackSlow.Value = trackTotal.Value;\n            if (trackTotal.Value > trackFast.Value) trackFast.Value = trackTotal.Value;\n            if (trackTotal.Value < trackCPU.Value) trackCPU.Value = trackTotal.Value;\n            SavePower();\n        }\n\n        private void TrackSlow_Scroll(object? sender, EventArgs e)\n        {\n            if (trackSlow.Value < trackTotal.Value) trackTotal.Value = trackSlow.Value;\n            if (trackSlow.Value > trackFast.Value) trackFast.Value = trackSlow.Value;\n            SavePower();\n        }\n\n        private void TrackFast_Scroll(object? sender, EventArgs e)\n        {\n            if (trackFast.Value < trackSlow.Value) trackSlow.Value = trackFast.Value;\n            if (trackFast.Value < trackTotal.Value) trackTotal.Value = trackFast.Value;\n            SavePower();\n        }\n\n        private void TrackCPU_Scroll(object? sender, EventArgs e)\n        {\n            if (trackCPU.Value > trackTotal.Value) trackTotal.Value = trackCPU.Value;\n            SavePower();\n        }\n\n        public void InitFans()\n        {\n\n            int chartCount = 2;\n\n            // Middle / system fan check\n            if (!AsusACPI.IsEmptyCurve(Program.acpi.GetFanCurve(AsusFan.Mid)) || Program.acpi.GetFan(AsusFan.Mid) >= 0)\n            {\n                AppConfig.Set(\"mid_fan\", 1);\n                chartCount++;\n                chartMid.Visible = true;\n                SetChart(chartMid, AsusFan.Mid);\n                LoadProfile(seriesMid, AsusFan.Mid);\n            }\n            else\n            {\n                AppConfig.Set(\"mid_fan\", 0);\n            }\n\n            // XG Mobile Fan check\n            if (Program.acpi.IsXGConnected() || XGM.IsConnected())\n            {\n                AppConfig.Set(\"xgm_fan\", 1);\n                chartCount++;\n                chartXGM.Visible = true;\n                SetChart(chartXGM, AsusFan.XGM);\n                LoadProfile(seriesXGM, AsusFan.XGM);\n            }\n            else\n            {\n                AppConfig.Set(\"xgm_fan\", 0);\n            }\n\n            try\n            {\n                if (chartCount > 2)\n                    Size = MinimumSize = new Size(Size.Width, Math.Max(MinimumSize.Height, (int)(ControlHelper.GetDpiScale(this).Value * (chartCount * 200 + 100))));\n\n            }\n            catch (Exception ex)\n            {\n                Debug.WriteLine(ex);\n            }\n\n\n            SetChart(chartCPU, AsusFan.CPU);\n            SetChart(chartGPU, AsusFan.GPU);\n\n            LoadProfile(seriesCPU, AsusFan.CPU);\n            LoadProfile(seriesGPU, AsusFan.GPU);\n\n            bool autoFans = AppConfig.IsMode(\"auto_apply_power\") && AppConfig.IsFanRequired();\n            bool applyFans = AppConfig.IsMode(\"auto_apply\");\n\n            checkApplyFans.Checked = applyFans;\n\n            if (autoFans || applyFans)\n            {\n                seriesCPU.Color = colorStandard;\n                seriesGPU.Color = colorTurbo;\n                seriesMid.Color = colorEco;\n                seriesXGM.Color = Color.Orange;\n            }\n            else\n            {\n                seriesCPU.Color = Color.Gray;\n                seriesGPU.Color = Color.Gray;\n                seriesMid.Color = Color.Gray;\n                seriesXGM.Color = Color.Gray;\n            }\n\n        }\n\n\n        void LoadProfile(Series series, AsusFan device, bool reset = false)\n        {\n\n            series.ChartType = SeriesChartType.Line;\n            series.MarkerSize = 10;\n            series.MarkerStyle = MarkerStyle.Circle;\n\n            series.Points.Clear();\n\n            byte[] curve = AppConfig.GetFanConfig(device);\n\n            if (reset || AsusACPI.IsInvalidCurve(curve))\n            {\n                curve = Program.acpi.GetFanCurve(device, Modes.GetCurrentBase());\n                Logger.WriteLine($\"Default Curve: {device} - {BitConverter.ToString(curve)}\");\n                if (AsusACPI.IsInvalidCurve(curve))\n                    curve = AppConfig.GetDefaultCurve(device);\n\n                curve = AsusACPI.FixFanCurve(curve);\n\n            }\n\n            //Debug.WriteLine(BitConverter.ToString(curve));\n\n            byte old = 0;\n            for (int i = 0; i < 8; i++)\n            {\n                if (curve[i] == old) curve[i]++; // preventing 2 points in same spot from default asus profiles\n                series.Points.AddXY(curve[i], curve[i + 8]);\n                old = curve[i];\n            }\n\n            SaveProfile(series, device);\n\n        }\n\n        void SaveProfile(Series series, AsusFan device)\n        {\n            byte[] curve = new byte[16];\n            int i = 0;\n            foreach (DataPoint point in series.Points)\n            {\n                curve[i] = (byte)point.XValue;\n                curve[i + 8] = (byte)point.YValues.First();\n                i++;\n            }\n\n            AppConfig.SetFanConfig(device, curve);\n            //Program.wmi.SetFanCurve(device, curve);\n\n        }\n\n        private void ButtonReset_Click(object? sender, EventArgs e)\n        {\n\n            LoadProfile(seriesCPU, AsusFan.CPU, true);\n            LoadProfile(seriesGPU, AsusFan.GPU, true);\n\n            if (AppConfig.Is(\"mid_fan\"))\n                LoadProfile(seriesMid, AsusFan.Mid, true);\n\n            if (AppConfig.Is(\"xgm_fan\"))\n                LoadProfile(seriesXGM, AsusFan.XGM, true);\n\n            checkApplyFans.Checked = false;\n            checkApplyPower.Checked = false;\n            seriesCPU.Color = Color.Gray;\n            seriesGPU.Color = Color.Gray;\n            seriesMid.Color = Color.Gray;\n            seriesXGM.Color = Color.Gray;\n\n            AppConfig.SetMode(\"auto_apply\", 0);\n            AppConfig.SetMode(\"auto_apply_power\", 0);\n\n            trackUV.Value = RyzenControl.MaxCPUUV;\n            trackUViGPU.Value = RyzenControl.MaxIGPUUV;\n            trackTemp.Value = RyzenControl.MaxTemp;\n\n            AdvancedScroll();\n            AppConfig.RemoveMode(\"cpu_temp\");\n\n            modeControl.ResetPerformanceMode();\n\n            InitPowerPlan();\n\n            XGM.Reset();\n\n\n            if (gpuVisible)\n            {\n                trackGPUClockLimit.Value = NvidiaGpuControl.MaxClockLimit;\n                trackGPUCore.Value = 0;\n                trackGPUMemory.Value = 0;\n\n                trackGPUBoost.Value = AsusACPI.MaxGPUBoost;\n                trackGPUTemp.Value = AsusACPI.MaxGPUTemp;\n\n                //AppConfig.SetMode(\"gpu_boost\", trackGPUBoost.Value);\n                //AppConfig.SetMode(\"gpu_temp\", trackGPUTemp.Value);\n\n                AppConfig.RemoveMode(\"gpu_boost\");\n                AppConfig.RemoveMode(\"gpu_temp\");\n\n                AppConfig.RemoveMode(\"gpu_power\");\n                AppConfig.RemoveMode(\"gpu_clock_limit\");\n                AppConfig.RemoveMode(\"gpu_core\");\n                AppConfig.RemoveMode(\"gpu_memory\");\n\n                InitGPUPower();\n\n                VisualiseGPUSettings();\n                modeControl.SetGPUClocks(true, true);\n                modeControl.SetGPUPower();\n            }\n\n        }\n\n        private void Chart_Save()\n        {\n            curPoint = null;\n            curIndex = -1;\n            labelTip.Visible = false;\n\n            SaveProfile(seriesCPU, AsusFan.CPU);\n            SaveProfile(seriesGPU, AsusFan.GPU);\n\n            if (AppConfig.Is(\"mid_fan\"))\n                SaveProfile(seriesMid, AsusFan.Mid);\n\n            if (AppConfig.Is(\"xgm_fan\"))\n                SaveProfile(seriesXGM, AsusFan.XGM);\n\n            modeControl.AutoFans();\n        }\n\n        private void ChartCPU_MouseUp(object? sender, MouseEventArgs e)\n        {\n            Chart_Save();\n        }\n\n\n        private void ChartCPU_MouseLeave(object? sender, EventArgs e)\n        {\n            curPoint = null;\n            curIndex = -1;\n            labelTip.Visible = false;\n        }\n\n        private void ChartCPU_MouseMove(object? sender, MouseEventArgs e, AsusFan device)\n        {\n\n            if (sender is null) return;\n            Chart chart = (Chart)sender;\n\n            ChartArea ca = chart.ChartAreas[0];\n            Axis ax = ca.AxisX;\n            Axis ay = ca.AxisY;\n\n            bool tip = false;\n\n            HitTestResult hit = chart.HitTest(e.X, e.Y);\n            Series series = chart.Series[0];\n\n            if (hit.Series is not null && hit.PointIndex >= 0)\n            {\n                curIndex = hit.PointIndex;\n                curPoint = hit.Series.Points[curIndex];\n                tip = true;\n            }\n\n\n            if (curPoint != null)\n            {\n\n                double dx, dy, dymin;\n\n                try\n                {\n                    dx = ax.PixelPositionToValue(e.X);\n                    dy = ay.PixelPositionToValue(e.Y);\n\n                    if (dx < tempMin) dx = tempMin;\n                    if (dx > tempMax) dx = tempMax;\n\n                    if (dy < 0) dy = 0;\n                    if (dy > fansMax) dy = fansMax;\n\n                    dymin = (dx - 70) * 1.2;\n\n                    if (dy < dymin) dy = dymin;\n\n                    if (e.Button.HasFlag(MouseButtons.Left))\n                    {\n                        double deltaY = dy - curPoint.YValues[0];\n                        double deltaX = dx - curPoint.XValue;\n\n                        if (clampFanDots)\n                        {\n                            double minX = 30 + (curIndex * 10);\n                            double maxX = minX + 9;\n                            dx = Math.Max(minX, Math.Min(maxX, dx));\n                        }\n\n                        curPoint.XValue = dx;\n\n                        if (Control.ModifierKeys == Keys.Shift)\n                            AdjustAll(0, deltaY, series);\n                        else\n                        {\n                            curPoint.YValues[0] = dy;\n                            AdjustAllLevels(curIndex, dx, dy, series);\n                        }\n\n                        tip = true;\n                    }\n\n                    labelTip.Text = Math.Floor(curPoint.XValue) + \"C, \" + ChartYLabel((int)curPoint.YValues[0], device, \" \" + Properties.Strings.RPM);\n                    labelTip.Top = e.Y + ((Control)sender).Top;\n                    labelTip.Left = Math.Min(chart.Width - labelTip.Width - 20, e.X - 50);\n\n                }\n                catch\n                {\n                    Debug.WriteLine(e.Y);\n                    tip = false;\n                }\n\n            }\n\n            labelTip.Visible = tip;\n\n\n        }\n\n        private void AdjustAll(double deltaX, double deltaY, Series series)\n        {\n            for (int i = 0; i < series.Points.Count; i++)\n            {\n                series.Points[i].XValue = Math.Max(tempMin, Math.Min(tempMax, series.Points[i].XValue + deltaX));\n                series.Points[i].YValues[0] = Math.Max(0, Math.Min(100, series.Points[i].YValues[0] + deltaY));\n            }\n        }\n\n        private void AdjustAllLevels(int index, double curXVal, double curYVal, Series series)\n        {\n\n            // Get the neighboring DataPoints of the hit point\n            DataPoint? upperPoint = null;\n            DataPoint? lowerPoint = null;\n\n            if (index > 0)\n            {\n                lowerPoint = series.Points[index - 1];\n            }\n\n            if (index < series.Points.Count - 1)\n            {\n                upperPoint = series.Points[index + 1];\n            }\n\n            // Adjust the values according to the comparison between the value and its neighbors\n            if (upperPoint != null)\n            {\n                if (curYVal > upperPoint.YValues[0])\n                {\n\n                    for (int i = index + 1; i < series.Points.Count; i++)\n                    {\n                        DataPoint curUpper = series.Points[i];\n                        if (curUpper.YValues[0] >= curYVal) break;\n\n                        curUpper.YValues[0] = curYVal;\n                    }\n                }\n                if (curXVal > upperPoint.XValue)\n                {\n\n                    for (int i = index + 1; i < series.Points.Count; i++)\n                    {\n                        DataPoint curUpper = series.Points[i];\n                        if (curUpper.XValue >= curXVal) break;\n\n                        curUpper.XValue = curXVal;\n                    }\n                }\n            }\n\n            if (lowerPoint != null)\n            {\n                //Debug.WriteLine(curYVal + \" <? \" + Math.Floor(lowerPoint.YValues[0]));\n                if (curYVal <= Math.Floor(lowerPoint.YValues[0]))\n                {\n                    for (int i = index - 1; i >= 0; i--)\n                    {\n                        DataPoint curLower = series.Points[i];\n                        if (curLower.YValues[0] < curYVal) break;\n                        curLower.YValues[0] = Math.Floor(curYVal);\n                    }\n                }\n                if (curXVal < lowerPoint.XValue)\n                {\n\n                    for (int i = index - 1; i >= 0; i--)\n                    {\n                        DataPoint curLower = series.Points[i];\n                        if (curLower.XValue <= curXVal) break;\n\n                        curLower.XValue = curXVal;\n                    }\n                }\n            }\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "app/Fans.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!--\n    Microsoft ResX Schema\n\n    Version 2.0\n\n    The primary goals of this format is to allow a simple XML format\n    that is mostly human readable. The generation and parsing of the\n    various data types are done through the TypeConverter classes\n    associated with the data types.\n\n    Example:\n\n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n\n    There are any number of \"resheader\" rows that contain simple\n    name/value pairs.\n\n    Each data row contains a name, and value. The row also contains a\n    type or mimetype. Type corresponds to a .NET class that support\n    text/value conversion through the TypeConverter architecture.\n    Classes that don't support this are serialized and stored with the\n    mimetype set.\n\n    The mimetype is used for serialized objects, and tells the\n    ResXResourceReader how to depersist the object. This is currently not\n    extensible. For a given mimetype the value must be set accordingly:\n\n    Note - application/x-microsoft.net.object.binary.base64 is the format\n    that the ResXResourceWriter will generate, however the reader can\n    read any of the formats listed below.\n\n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array\n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"labelRisky.Text\" xml:space=\"preserve\">\n    <value>Undervolting is experimental and risky feature. If applied values are too low for your hardware, it can become unstable or shut down. Try small negative values first, click Apply and test what works for you.</value>\n  </data>\n</root>"
  },
  {
    "path": "app/GHelper.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>WinExe</OutputType>\n    <TargetFramework>net8.0-windows</TargetFramework>\n    <Nullable>enable</Nullable>\n    <UseWindowsForms>True</UseWindowsForms>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <IsPublishable>True</IsPublishable>\n    <ApplicationManifest>app.manifest</ApplicationManifest>\n    <StartupObject>GHelper.Program</StartupObject>\n    <ApplicationIcon>favicon.ico</ApplicationIcon>\n    <Platforms>AnyCPU;x64</Platforms>\n    <AssemblyName>GHelper</AssemblyName>\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <ProduceReferenceAssembly>False</ProduceReferenceAssembly>\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n    <AssemblyVersion>0.241</AssemblyVersion>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|AnyCPU'\">\n    <DebugType>embedded</DebugType>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|AnyCPU'\">\n    <DebugType>embedded</DebugType>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <DebugType>embedded</DebugType>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <DebugType>embedded</DebugType>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Remove=\"screenshots\\**\" />\n    <EmbeddedResource Remove=\"screenshots\\**\" />\n    <None Remove=\"screenshots\\**\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Remove=\"Resources\\eco.ico\" />\n    <None Remove=\"Resources\\icons8-charging-battery-48.png\" />\n    <None Remove=\"Resources\\icons8-laptop-48.png\" />\n    <None Remove=\"Resources\\icons8-speed-48.png\" />\n    <None Remove=\"Resources\\icons8-video-card-48.png\" />\n    <None Remove=\"Resources\\ultimate.ico\" />\n  </ItemGroup>\n\n\n\n  <ItemGroup>\n    <Content Include=\"favicon.ico\">\n      <CopyToOutputDirectory>Never</CopyToOutputDirectory>\n    </Content>\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"FftSharp\" Version=\"2.2.0\" />\n    <PackageReference Include=\"HidSharpCore\" Version=\"1.3.0\" />\n    <PackageReference Include=\"NAudio\" Version=\"2.2.1\" />\n    <PackageReference Include=\"NvAPIWrapper.Net\" Version=\"0.8.1.101\" />\n    <PackageReference Include=\"System.Management\" Version=\"9.0.9\" />\n    <PackageReference Include=\"TaskScheduler\" Version=\"2.12.2\" />\n    <PackageReference Include=\"WinForms.DataVisualization\" Version=\"1.10.0\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Content Include=\"Resources\\eco.ico\">\n      <CopyToOutputDirectory>Never</CopyToOutputDirectory>\n    </Content>\n    <Content Include=\"Resources\\ultimate.ico\">\n      <CopyToOutputDirectory>Never</CopyToOutputDirectory>\n    </Content>\n  </ItemGroup>\n\n  <ItemGroup>\n    <Compile Update=\"Properties\\Resources.Designer.cs\">\n      <DesignTime>True</DesignTime>\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Resources.resx</DependentUpon>\n    </Compile>\n    <Compile Update=\"Properties\\Strings.Designer.cs\">\n      <DesignTime>True</DesignTime>\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Strings.resx</DependentUpon>\n    </Compile>\n    <Compile Update=\"Properties\\Settings.Designer.cs\">\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Settings.settings</DependentUpon>\n    </Compile>\n  </ItemGroup>\n\n  <ItemGroup>\n    <EmbeddedResource Update=\"Properties\\Resources.uk.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n    </EmbeddedResource>\n    <EmbeddedResource Update=\"Properties\\Resources.uk.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n    </EmbeddedResource>\n    <EmbeddedResource Update=\"Properties\\Strings.uk.resx\">\n      <LastGenOutput>Strings.uk.Designer.cs</LastGenOutput>\n      <Generator>ResXFileCodeGenerator</Generator>\n    </EmbeddedResource>\n    <EmbeddedResource Update=\"Properties\\Strings.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Strings.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n    <EmbeddedResource Update=\"Properties\\Resources.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Update=\"Properties\\Settings.settings\">\n      <Generator>SettingsSingleFileGenerator</Generator>\n      <LastGenOutput>Settings.Designer.cs</LastGenOutput>\n    </None>\n    <None Update=\"WinRing0x64.dll\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </None>\n    <None Update=\"WinRing0x64.sys\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </None>\n  </ItemGroup>\n\n\t<Target Name=\"ZipSingleExe\" AfterTargets=\"Publish\" Condition=\"'$(GITHUB_ACTIONS)'!='true'\">\n\t\t<Exec Command=\"powershell -Command &quot;Compress-Archive -Path '$(PublishDir)GHelper.exe' -DestinationPath '$(PublishDir)GHelper.zip' -Force&quot;\" />\n\t</Target>\n</Project>\n"
  },
  {
    "path": "app/GHelper.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.4.33403.182\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"GHelper\", \"GHelper.csproj\", \"{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Solution Items\", \"Solution Items\", \"{B6E44CC6-5D28-4CB9-8EE2-BE9D6238E2D6}\"\n\tProjectSection(SolutionItems) = preProject\n\t\t.editorconfig = .editorconfig\n\tEndProjectSection\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|x64 = Debug|x64\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|x64 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Debug|Any CPU.ActiveCfg = Debug|x64\n\t\t{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Debug|Any CPU.Build.0 = Debug|x64\n\t\t{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Release|Any CPU.ActiveCfg = Release|x64\n\t\t{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Release|Any CPU.Build.0 = Release|x64\n\t\t{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Release|x64.ActiveCfg = Release|x64\n\t\t{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Release|x64.Build.0 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {B1BF5148-497A-4B5A-B079-5C00CD047DAF}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "app/Gpu/AMD/AmdAdl2.cs",
    "content": "using System.Diagnostics;\nusing System.Runtime.InteropServices;\nusing static GHelper.Gpu.AMD.Adl2.NativeMethods;\n\nnamespace GHelper.Gpu.AMD;\n\n#region Export Struct\n\n[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]\npublic struct ADLSGApplicationInfo\n{\n    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]\n    public string strFileName;\n\n    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]\n    public string strFilePath;\n\n    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]\n    public string strVersion;\n\n    public long timeStamp;\n    public uint iProfileExists;\n    public uint iGPUAffinity;\n    public ADLBdf GPUBdf;\n}\n\n[StructLayout(LayoutKind.Sequential)]\npublic struct ADLBdf\n{\n    public int iBus;\n    public int iDevice;\n    public int iFunction;\n}\n\n[StructLayout(LayoutKind.Sequential)]\npublic struct ADLSingleSensorData\n{\n    public int Supported;\n    public int Value;\n}\n\n[StructLayout(LayoutKind.Sequential)]\npublic struct ADLPMLogDataOutput\n{\n    int Size;\n\n    [MarshalAs(UnmanagedType.ByValArray, SizeConst = Adl2.ADL_PMLOG_MAX_SENSORS)]\n    public ADLSingleSensorData[] Sensors;\n}\n\n[StructLayout(LayoutKind.Sequential)]\npublic struct ADLGcnInfo\n{\n    public int CuCount; //Number of compute units on the ASIC.\n    public int TexCount; //Number of texture mapping units.\n    public int RopCount; //Number of Render backend Units.\n    public int ASICFamilyId; //Such SI, VI. See /inc/asic_reg/atiid.h for family ids\n    public int ASICRevisionId; //Such as Ellesmere, Fiji.   For example - VI family revision ids are stored in /inc/asic_reg/vi_id.h\n}\n\n[Flags]\npublic enum ADLAsicFamilyType\n{\n    Undefined = 0,\n    Discrete = 1 << 0,\n    Integrated = 1 << 1,\n    Workstation = 1 << 2,\n    FireMV = 1 << 3,\n    Xgp = 1 << 4,\n    Fusion = 1 << 5,\n    Firestream = 1 << 6,\n    Embedded = 1 << 7,\n}\n\npublic enum ADLSensorType\n{\n    SENSOR_MAXTYPES = 0,\n    PMLOG_CLK_GFXCLK = 1, // Current graphic clock value in MHz\n    PMLOG_CLK_MEMCLK = 2, // Current memory clock value in MHz\n    PMLOG_CLK_SOCCLK = 3,\n    PMLOG_CLK_UVDCLK1 = 4,\n    PMLOG_CLK_UVDCLK2 = 5,\n    PMLOG_CLK_VCECLK = 6,\n    PMLOG_CLK_VCNCLK = 7,\n    PMLOG_TEMPERATURE_EDGE = 8, // Current edge of the die temperature value in C\n    PMLOG_TEMPERATURE_MEM = 9,\n    PMLOG_TEMPERATURE_VRVDDC = 10,\n    PMLOG_TEMPERATURE_VRMVDD = 11,\n    PMLOG_TEMPERATURE_LIQUID = 12,\n    PMLOG_TEMPERATURE_PLX = 13,\n    PMLOG_FAN_RPM = 14, // Current fan RPM value\n    PMLOG_FAN_PERCENTAGE = 15, // Current ratio of fan RPM and max RPM\n    PMLOG_SOC_VOLTAGE = 16,\n    PMLOG_SOC_POWER = 17,\n    PMLOG_SOC_CURRENT = 18,\n    PMLOG_INFO_ACTIVITY_GFX = 19, // Current graphic activity level in percentage\n    PMLOG_INFO_ACTIVITY_MEM = 20, // Current memory activity level in percentage\n    PMLOG_GFX_VOLTAGE = 21, // Current graphic voltage in mV\n    PMLOG_MEM_VOLTAGE = 22,\n    PMLOG_ASIC_POWER = 23, // Current ASIC power draw in Watt\n    PMLOG_TEMPERATURE_VRSOC = 24,\n    PMLOG_TEMPERATURE_VRMVDD0 = 25,\n    PMLOG_TEMPERATURE_VRMVDD1 = 26,\n    PMLOG_TEMPERATURE_HOTSPOT = 27, // Current center of the die temperature value in C\n    PMLOG_TEMPERATURE_GFX = 28,\n    PMLOG_TEMPERATURE_SOC = 29,\n    PMLOG_GFX_POWER = 30,\n    PMLOG_GFX_CURRENT = 31,\n    PMLOG_TEMPERATURE_CPU = 32,\n    PMLOG_CPU_POWER = 33,\n    PMLOG_CLK_CPUCLK = 34,\n    PMLOG_THROTTLER_STATUS = 35, // A bit map of GPU throttle information. If a bit is set, the bit represented type of thorttling occurred in the last metrics sampling period\n    PMLOG_CLK_VCN1CLK1 = 36,\n    PMLOG_CLK_VCN1CLK2 = 37,\n    PMLOG_SMART_POWERSHIFT_CPU = 38,\n    PMLOG_SMART_POWERSHIFT_DGPU = 39,\n    PMLOG_BUS_SPEED = 40, // Current PCIE bus speed running\n    PMLOG_BUS_LANES = 41, // Current PCIE bus lanes using\n    PMLOG_TEMPERATURE_LIQUID0 = 42,\n    PMLOG_TEMPERATURE_LIQUID1 = 43,\n    PMLOG_CLK_FCLK = 44,\n    PMLOG_THROTTLER_STATUS_CPU = 45,\n    PMLOG_SSPAIRED_ASICPOWER = 46, // apuPower\n    PMLOG_SSTOTAL_POWERLIMIT = 47, // Total Power limit    \n    PMLOG_SSAPU_POWERLIMIT = 48, // APU Power limit\n    PMLOG_SSDGPU_POWERLIMIT = 49, // DGPU Power limit\n    PMLOG_TEMPERATURE_HOTSPOT_GCD = 50,\n    PMLOG_TEMPERATURE_HOTSPOT_MCD = 51,\n    PMLOG_THROTTLER_TEMP_EDGE_PERCENTAGE = 52,\n    PMLOG_THROTTLER_TEMP_HOTSPOT_PERCENTAGE = 53,\n    PMLOG_THROTTLER_TEMP_HOTSPOT_GCD_PERCENTAGE = 54,\n    PMLOG_THROTTLER_TEMP_HOTSPOT_MCD_PERCENTAGE = 55,\n    PMLOG_THROTTLER_TEMP_MEM_PERCENTAGE = 56,\n    PMLOG_THROTTLER_TEMP_VR_GFX_PERCENTAGE = 57,\n    PMLOG_THROTTLER_TEMP_VR_MEM0_PERCENTAGE = 58,\n    PMLOG_THROTTLER_TEMP_VR_MEM1_PERCENTAGE = 59,\n    PMLOG_THROTTLER_TEMP_VR_SOC_PERCENTAGE = 60,\n    PMLOG_THROTTLER_TEMP_LIQUID0_PERCENTAGE = 61,\n    PMLOG_THROTTLER_TEMP_LIQUID1_PERCENTAGE = 62,\n    PMLOG_THROTTLER_TEMP_PLX_PERCENTAGE = 63,\n    PMLOG_THROTTLER_TDC_GFX_PERCENTAGE = 64,\n    PMLOG_THROTTLER_TDC_SOC_PERCENTAGE = 65,\n    PMLOG_THROTTLER_TDC_USR_PERCENTAGE = 66,\n    PMLOG_THROTTLER_PPT0_PERCENTAGE = 67,\n    PMLOG_THROTTLER_PPT1_PERCENTAGE = 68,\n    PMLOG_THROTTLER_PPT2_PERCENTAGE = 69,\n    PMLOG_THROTTLER_PPT3_PERCENTAGE = 70,\n    PMLOG_THROTTLER_FIT_PERCENTAGE = 71,\n    PMLOG_THROTTLER_GFX_APCC_PLUS_PERCENTAGE = 72,\n    PMLOG_BOARD_POWER = 73,\n    PMLOG_MAX_SENSORS_REAL\n};\n\n//Throttle Status\n[Flags]\npublic enum ADL_THROTTLE_NOTIFICATION\n{\n    ADL_PMLOG_THROTTLE_POWER = 1 << 0,\n    ADL_PMLOG_THROTTLE_THERMAL = 1 << 1,\n    ADL_PMLOG_THROTTLE_CURRENT = 1 << 2,\n};\n\npublic enum ADL_PMLOG_SENSORS\n{\n    ADL_SENSOR_MAXTYPES = 0,\n    ADL_PMLOG_CLK_GFXCLK = 1,\n    ADL_PMLOG_CLK_MEMCLK = 2,\n    ADL_PMLOG_CLK_SOCCLK = 3,\n    ADL_PMLOG_CLK_UVDCLK1 = 4,\n    ADL_PMLOG_CLK_UVDCLK2 = 5,\n    ADL_PMLOG_CLK_VCECLK = 6,\n    ADL_PMLOG_CLK_VCNCLK = 7,\n    ADL_PMLOG_TEMPERATURE_EDGE = 8,\n    ADL_PMLOG_TEMPERATURE_MEM = 9,\n    ADL_PMLOG_TEMPERATURE_VRVDDC = 10,\n    ADL_PMLOG_TEMPERATURE_VRMVDD = 11,\n    ADL_PMLOG_TEMPERATURE_LIQUID = 12,\n    ADL_PMLOG_TEMPERATURE_PLX = 13,\n    ADL_PMLOG_FAN_RPM = 14,\n    ADL_PMLOG_FAN_PERCENTAGE = 15,\n    ADL_PMLOG_SOC_VOLTAGE = 16,\n    ADL_PMLOG_SOC_POWER = 17,\n    ADL_PMLOG_SOC_CURRENT = 18,\n    ADL_PMLOG_INFO_ACTIVITY_GFX = 19,\n    ADL_PMLOG_INFO_ACTIVITY_MEM = 20,\n    ADL_PMLOG_GFX_VOLTAGE = 21,\n    ADL_PMLOG_MEM_VOLTAGE = 22,\n    ADL_PMLOG_ASIC_POWER = 23,\n    ADL_PMLOG_TEMPERATURE_VRSOC = 24,\n    ADL_PMLOG_TEMPERATURE_VRMVDD0 = 25,\n    ADL_PMLOG_TEMPERATURE_VRMVDD1 = 26,\n    ADL_PMLOG_TEMPERATURE_HOTSPOT = 27,\n    ADL_PMLOG_TEMPERATURE_GFX = 28,\n    ADL_PMLOG_TEMPERATURE_SOC = 29,\n    ADL_PMLOG_GFX_POWER = 30,\n    ADL_PMLOG_GFX_CURRENT = 31,\n    ADL_PMLOG_TEMPERATURE_CPU = 32,\n    ADL_PMLOG_CPU_POWER = 33,\n    ADL_PMLOG_CLK_CPUCLK = 34,\n    ADL_PMLOG_THROTTLER_STATUS = 35, // GFX\n    ADL_PMLOG_CLK_VCN1CLK1 = 36,\n    ADL_PMLOG_CLK_VCN1CLK2 = 37,\n    ADL_PMLOG_SMART_POWERSHIFT_CPU = 38,\n    ADL_PMLOG_SMART_POWERSHIFT_DGPU = 39,\n    ADL_PMLOG_BUS_SPEED = 40,\n    ADL_PMLOG_BUS_LANES = 41,\n    ADL_PMLOG_TEMPERATURE_LIQUID0 = 42,\n    ADL_PMLOG_TEMPERATURE_LIQUID1 = 43,\n    ADL_PMLOG_CLK_FCLK = 44,\n    ADL_PMLOG_THROTTLER_STATUS_CPU = 45,\n    ADL_PMLOG_SSPAIRED_ASICPOWER = 46, // apuPower\n    ADL_PMLOG_SSTOTAL_POWERLIMIT = 47, // Total Power limit\n    ADL_PMLOG_SSAPU_POWERLIMIT = 48, // APU Power limit\n    ADL_PMLOG_SSDGPU_POWERLIMIT = 49, // DGPU Power limit\n    ADL_PMLOG_TEMPERATURE_HOTSPOT_GCD = 50,\n    ADL_PMLOG_TEMPERATURE_HOTSPOT_MCD = 51,\n    ADL_PMLOG_THROTTLER_TEMP_EDGE_PERCENTAGE = 52,\n    ADL_PMLOG_THROTTLER_TEMP_HOTSPOT_PERCENTAGE = 53,\n    ADL_PMLOG_THROTTLER_TEMP_HOTSPOT_GCD_PERCENTAGE = 54,\n    ADL_PMLOG_THROTTLER_TEMP_HOTSPOT_MCD_PERCENTAGE = 55,\n    ADL_PMLOG_THROTTLER_TEMP_MEM_PERCENTAGE = 56,\n    ADL_PMLOG_THROTTLER_TEMP_VR_GFX_PERCENTAGE = 57,\n    ADL_PMLOG_THROTTLER_TEMP_VR_MEM0_PERCENTAGE = 58,\n    ADL_PMLOG_THROTTLER_TEMP_VR_MEM1_PERCENTAGE = 59,\n    ADL_PMLOG_THROTTLER_TEMP_VR_SOC_PERCENTAGE = 60,\n    ADL_PMLOG_THROTTLER_TEMP_LIQUID0_PERCENTAGE = 61,\n    ADL_PMLOG_THROTTLER_TEMP_LIQUID1_PERCENTAGE = 62,\n    ADL_PMLOG_THROTTLER_TEMP_PLX_PERCENTAGE = 63,\n    ADL_PMLOG_THROTTLER_TDC_GFX_PERCENTAGE = 64,\n    ADL_PMLOG_THROTTLER_TDC_SOC_PERCENTAGE = 65,\n    ADL_PMLOG_THROTTLER_TDC_USR_PERCENTAGE = 66,\n    ADL_PMLOG_THROTTLER_PPT0_PERCENTAGE = 67,\n    ADL_PMLOG_THROTTLER_PPT1_PERCENTAGE = 68,\n    ADL_PMLOG_THROTTLER_PPT2_PERCENTAGE = 69,\n    ADL_PMLOG_THROTTLER_PPT3_PERCENTAGE = 70,\n    ADL_PMLOG_THROTTLER_FIT_PERCENTAGE = 71,\n    ADL_PMLOG_THROTTLER_GFX_APCC_PLUS_PERCENTAGE = 72,\n    ADL_PMLOG_BOARD_POWER = 73,\n    ADL_PMLOG_MAX_SENSORS_REAL\n}\n\n#region ADLAdapterInfo\n\n/// <summary> ADLAdapterInfo Structure</summary>\n[StructLayout(LayoutKind.Sequential)]\npublic struct ADLAdapterInfo\n{\n    /// <summary>The size of the structure</summary>\n    int Size;\n\n    /// <summary> Adapter Index</summary>\n    public int AdapterIndex;\n\n    /// <summary> Adapter UDID</summary>\n    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = Adl2.ADL_MAX_PATH)]\n    public string UDID;\n\n    /// <summary> Adapter Bus Number</summary>\n    public int BusNumber;\n\n    /// <summary> Adapter Driver Number</summary>\n    public int DriverNumber;\n\n    /// <summary> Adapter Function Number</summary>\n    public int FunctionNumber;\n\n    /// <summary> Adapter Vendor ID</summary>\n    public int VendorID;\n\n    /// <summary> Adapter Adapter name</summary>\n    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = Adl2.ADL_MAX_PATH)]\n    public string AdapterName;\n\n    /// <summary> Adapter Display name</summary>\n    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = Adl2.ADL_MAX_PATH)]\n    public string DisplayName;\n\n    /// <summary> Adapter Present status</summary>\n    public int Present;\n\n    /// <summary> Adapter Exist status</summary>\n    public int Exist;\n\n    /// <summary> Adapter Driver Path</summary>\n    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = Adl2.ADL_MAX_PATH)]\n    public string DriverPath;\n\n    /// <summary> Adapter Driver Ext Path</summary>\n    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = Adl2.ADL_MAX_PATH)]\n    public string DriverPathExt;\n\n    /// <summary> Adapter PNP String</summary>\n    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = Adl2.ADL_MAX_PATH)]\n    public string PNPString;\n\n    /// <summary> OS Display Index</summary>\n    public int OSDisplayIndex;\n}\n\n/// <summary> ADLAdapterInfo Array</summary>\n[StructLayout(LayoutKind.Sequential)]\npublic struct ADLAdapterInfoArray\n{\n    /// <summary> ADLAdapterInfo Array </summary>\n    [MarshalAs(UnmanagedType.ByValArray, SizeConst = Adl2.ADL_MAX_ADAPTERS)]\n    public ADLAdapterInfo[] ADLAdapterInfo;\n}\n\n#endregion ADLAdapterInfo\n\n#region ADLDisplayInfo\n\n/// <summary> ADLDisplayID Structure</summary>\n[StructLayout(LayoutKind.Sequential)]\npublic struct ADLDisplayID\n{\n    /// <summary> Display Logical Index </summary>\n    public int DisplayLogicalIndex;\n\n    /// <summary> Display Physical Index </summary>\n    public int DisplayPhysicalIndex;\n\n    /// <summary> Adapter Logical Index </summary>\n    public int DisplayLogicalAdapterIndex;\n\n    /// <summary> Adapter Physical Index </summary>\n    public int DisplayPhysicalAdapterIndex;\n}\n\n/// <summary> ADLDisplayInfo Structure</summary>\n[StructLayout(LayoutKind.Sequential)]\npublic struct ADLDisplayInfo\n{\n    /// <summary> Display Index </summary>\n    public ADLDisplayID DisplayID;\n\n    /// <summary> Display Controller Index </summary>\n    public int DisplayControllerIndex;\n\n    /// <summary> Display Name </summary>\n    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = Adl2.ADL_MAX_PATH)]\n    public string DisplayName;\n\n    /// <summary> Display Manufacturer Name </summary>\n    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = Adl2.ADL_MAX_PATH)]\n    public string DisplayManufacturerName;\n\n    /// <summary> Display Type : < The Display type. CRT, TV,CV,DFP are some of display types,</summary>\n    public int DisplayType;\n\n    /// <summary> Display output type </summary>\n    public int DisplayOutputType;\n\n    /// <summary> Connector type</summary>\n    public int DisplayConnector;\n\n    ///<summary> Indicating the display info bits' mask.<summary>\n    public int DisplayInfoMask;\n\n    ///<summary> Indicating the display info value.<summary>\n    public int DisplayInfoValue;\n}\n\n#endregion ADLDisplayInfo\n\n#endregion Export Struct\n\npublic class Adl2\n{\n    public const string Atiadlxx_FileName = \"atiadlxx.dll\";\n\n    #region Internal Constant\n\n    /// <summary> Define the maximum path</summary>\n    public const int ADL_MAX_PATH = 256;\n\n    /// <summary> Define the maximum adapters</summary>\n    public const int ADL_MAX_ADAPTERS = 40 /* 150 */;\n\n    /// <summary> Define the maximum displays</summary>\n    public const int ADL_MAX_DISPLAYS = 40 /* 150 */;\n\n    /// <summary> Define the maximum device name length</summary>\n    public const int ADL_MAX_DEVICENAME = 32;\n\n    /// <summary> Define the successful</summary>\n    public const int ADL_SUCCESS = 0;\n\n    /// <summary> Define the failure</summary>\n    public const int ADL_FAIL = -1;\n\n    /// <summary> Define the driver ok</summary>\n    public const int ADL_DRIVER_OK = 0;\n\n    /// <summary> Maximum number of GL-Sync ports on the GL-Sync module </summary>\n    public const int ADL_MAX_GLSYNC_PORTS = 8;\n\n    /// <summary> Maximum number of GL-Sync ports on the GL-Sync module </summary>\n    public const int ADL_MAX_GLSYNC_PORT_LEDS = 8;\n\n    /// <summary> Maximum number of ADLMOdes for the adapter </summary>\n    public const int ADL_MAX_NUM_DISPLAYMODES = 1024;\n\n    /// <summary> Performance Metrics Log max sensors number </summary>\n    public const int ADL_PMLOG_MAX_SENSORS = 256;\n\n    #endregion Internal Constant\n\n    // ///// <summary> ADL Create Function to create ADL Data</summary>\n    /// <param name=\"enumConnectedAdapters\">If it is 1, then ADL will only return the physical exist adapters </param>\n    ///// <returns> retrun ADL Error Code</returns>\n    public static int ADL2_Main_Control_Create(int enumConnectedAdapters, out nint adlContextHandle)\n    {\n        return NativeMethods.ADL2_Main_Control_Create(ADL_Main_Memory_Alloc_Impl_Reference, enumConnectedAdapters, out adlContextHandle);\n    }\n\n    public static void FreeMemory(nint buffer)\n    {\n        Memory_Free_Impl(buffer);\n    }\n\n    private static bool? isDllLoaded;\n\n    public static bool Load()\n    {\n        if (isDllLoaded != null)\n            return isDllLoaded.Value;\n\n        try\n        {\n            Marshal.PrelinkAll(typeof(Adl2));\n            isDllLoaded = true;\n        }\n        catch (Exception e) when (e is DllNotFoundException or EntryPointNotFoundException)\n        {\n            Debug.WriteLine(e);\n            isDllLoaded = false;\n        }\n\n        return isDllLoaded.Value;\n    }\n\n    private static ADL_Main_Memory_Alloc ADL_Main_Memory_Alloc_Impl_Reference = Memory_Alloc_Impl;\n\n    /// <summary> Build in memory allocation function</summary>\n    /// <param name=\"size\">input size</param>\n    /// <returns>return the memory buffer</returns>\n    private static nint Memory_Alloc_Impl(int size)\n    {\n        return Marshal.AllocCoTaskMem(size);\n    }\n\n    /// <summary> Build in memory free function</summary>\n    /// <param name=\"buffer\">input buffer</param>\n    private static void Memory_Free_Impl(nint buffer)\n    {\n        if (nint.Zero != buffer)\n        {\n            Marshal.FreeCoTaskMem(buffer);\n        }\n    }\n\n    public static class NativeMethods\n    {\n        /// <summary> ADL Memory allocation function allows ADL to callback for memory allocation</summary>\n        /// <param name=\"size\">input size</param>\n        /// <returns> retrun ADL Error Code</returns>\n        public delegate nint ADL_Main_Memory_Alloc(int size);\n\n        // ///// <summary> ADL Create Function to create ADL Data</summary>\n        /// <param name=\"callback\">Call back functin pointer which is ised to allocate memeory </param>\n        /// <param name=\"enumConnectedAdapters\">If it is 1, then ADL will only retuen the physical exist adapters </param>\n        ///// <returns> retrun ADL Error Code</returns>\n        [DllImport(Atiadlxx_FileName)]\n        public static extern int ADL2_Main_Control_Create(ADL_Main_Memory_Alloc callback, int enumConnectedAdapters, out nint adlContextHandle);\n\n        /// <summary> ADL Destroy Function to free up ADL Data</summary>\n        /// <returns> retrun ADL Error Code</returns>\n        [DllImport(Atiadlxx_FileName)]\n        public static extern int ADL2_Main_Control_Destroy(nint adlContextHandle);\n\n        /// <summary> ADL Function to get the number of adapters</summary>\n        /// <param name=\"numAdapters\">return number of adapters</param>\n        /// <returns> retrun ADL Error Code</returns>\n        [DllImport(Atiadlxx_FileName)]\n        public static extern int ADL2_Adapter_NumberOfAdapters_Get(nint adlContextHandle, out int numAdapters);\n\n        /// <summary> ADL Function to get the GPU adapter information</summary>\n        /// <param name=\"info\">return GPU adapter information</param>\n        /// <param name=\"inputSize\">the size of the GPU adapter struct</param>\n        /// <returns> retrun ADL Error Code</returns>\n        [DllImport(Atiadlxx_FileName)]\n        public static extern int ADL2_Adapter_AdapterInfo_Get(nint adlContextHandle, nint info, int inputSize);\n\n        /// <summary> Function to determine if the adapter is active or not.</summary>\n        /// <remarks>The function is used to check if the adapter associated with iAdapterIndex is active</remarks>  \n        /// <param name=\"adapterIndex\"> Adapter Index.</param>\n        /// <param name=\"status\"> Status of the adapter. True: Active; False: Dsiabled</param>\n        /// <returns>Non zero is successfull</returns> \n        [DllImport(Atiadlxx_FileName)]\n        public static extern int ADL2_Adapter_Active_Get(nint adlContextHandle, int adapterIndex, out int status);\n\n        /// <summary>Get display information based on adapter index</summary>\n        /// <param name=\"adapterIndex\">Adapter Index</param>\n        /// <param name=\"numDisplays\">return the total number of supported displays</param>\n        /// <param name=\"displayInfoArray\">return ADLDisplayInfo Array for supported displays' information</param>\n        /// <param name=\"forceDetect\">force detect or not</param>\n        /// <returns>return ADL Error Code</returns>\n        [DllImport(Atiadlxx_FileName)]\n        public static extern int ADL2_Display_DisplayInfo_Get(\n            nint adlContextHandle,\n            int adapterIndex,\n            out int numDisplays,\n            out nint displayInfoArray,\n            int forceDetect\n        );\n\n        [DllImport(Atiadlxx_FileName)]\n        public static extern int ADL2_Overdrive_Caps(\n            nint adlContextHandle,\n            int adapterIndex,\n            out int supported,\n            out int enabled,\n            out int version\n        );\n\n        [DllImport(Atiadlxx_FileName)]\n        public static extern int ADL2_New_QueryPMLogData_Get(nint adlContextHandle, int adapterIndex, out ADLPMLogDataOutput adlpmLogDataOutput);\n\n        [DllImport(Atiadlxx_FileName)]\n        public static extern int ADL2_Adapter_ASICFamilyType_Get(nint adlContextHandle, int adapterIndex, out ADLAsicFamilyType asicFamilyType, out int asicFamilyTypeValids);\n\n        [DllImport(Atiadlxx_FileName)]\n        public static extern int ADL2_SwitchableGraphics_Applications_Get(\n            nint context,\n            int iListType,\n            out int lpNumApps,\n            out nint lppAppList);\n\n        [DllImport(Atiadlxx_FileName)]\n        public static extern int ADL2_Adapter_VariBright_Caps(\n            nint context,\n            int iAdapterIndex,\n            out int iSupported,\n            out int iEnabled,\n            out int iVersion);\n\n        [DllImport(Atiadlxx_FileName)]\n        public static extern int ADL2_Adapter_VariBrightEnable_Set(\n            nint context,\n            int iAdapterIndex,\n            int iEnabled);\n\n        // FPS\n\n        [DllImport(Atiadlxx_FileName)]\n        public static extern int ADL2_Adapter_FrameMetrics_Start(\n            IntPtr context,\n            int iAdapterIndex,\n            int VidPnSourceId\n        );\n\n        [DllImport(Atiadlxx_FileName)]\n        public static extern int ADL2_Adapter_FrameMetrics_Stop(\n            IntPtr context,\n            int iAdapterIndex,\n            int VidPnSourceId\n        );\n\n        [DllImport(Atiadlxx_FileName)]\n        public static extern int ADL2_Adapter_FrameMetrics_Get(\n              IntPtr context,\n              int iAdapterIndex,\n              int VidPnSourceId,\n              out float iFramesPerSecond\n          );\n\n        [DllImport(Atiadlxx_FileName)]\n        public static extern int ADL2_FPS_Settings_Get(IntPtr context, int iAdapterIndex, out ADLFPSSettingsOutput lpFPSSettings);\n\n        [DllImport(Atiadlxx_FileName)]\n        public static extern int ADL2_FPS_Settings_Set(IntPtr context, int iAdapterIndex, ADLFPSSettingsInput lpFPSSettings);\n\n        [DllImport(Atiadlxx_FileName)]\n        public static extern int ADL2_FPS_Settings_Reset(IntPtr context, int iAdapterIndex);\n\n        [StructLayout(LayoutKind.Sequential)]\n        public struct ADLFPSSettingsOutput\n        {\n            public int ulSize;\n            public int bACFPSEnabled;\n            public int bDCFPSEnabled;\n            public int ulACFPSCurrent;\n            public int ulDCFPSCurrent;\n            public int ulACFPSMaximum;\n            public int ulACFPSMinimum;\n            public int ulDCFPSMaximum;\n            public int ulDCFPSMinimum;\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        public struct ADLFPSSettingsInput\n        {\n            public int ulSize;\n            public int bGlobalSettings;\n            public int ulACFPSCurrent;\n            public int ulDCFPSCurrent;\n\n            // Assuming ulReserved is an array of 6 integers\n            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]\n            public int[] ulReserved;\n        }\n        // Clocks\n\n        [StructLayout(LayoutKind.Sequential)]\n        public struct ADLODNPerformanceLevel\n        {\n            public int iClock;\n            public int iVddc;\n            public int iEnabled;\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        public struct ADLODNPerformanceLevels\n        {\n            public int iSize;\n            public int iMode;\n            public int iNumberOfPerformanceLevels;\n            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]\n            public ADLODNPerformanceLevel[] aLevels;\n        }\n\n\n        [DllImport(Atiadlxx_FileName)]\n        public static extern int ADL2_OverdriveN_SystemClocks_Get(\n            nint context,\n            int adapterIndex,\n            ref ADLODNPerformanceLevels performanceLevels);\n\n        [DllImport(Atiadlxx_FileName)]\n        public static extern int ADL2_OverdriveN_SystemClocks_Set(\n            nint context,\n            int adapterIndex,\n            ref ADLODNPerformanceLevels performanceLevels);\n\n        [DllImport(Atiadlxx_FileName)]\n        public static extern int ADL2_OverdriveN_MemoryClocks_Get(\n            nint context,\n            int adapterIndex,\n            ref ADLODNPerformanceLevels performanceLevels);\n\n        [DllImport(Atiadlxx_FileName)]\n        public static extern int ADL2_OverdriveN_MemoryClocks_Set(\n            nint context,\n            int adapterIndex,\n            ref ADLODNPerformanceLevels performanceLevels);\n    }\n}\n"
  },
  {
    "path": "app/Gpu/AMD/AmdGpuControl.cs",
    "content": "using GHelper.Helpers;\nusing System.Runtime.InteropServices;\nusing static GHelper.Gpu.AMD.Adl2.NativeMethods;\n\nnamespace GHelper.Gpu.AMD;\n\n// Reference: https://github.com/GPUOpen-LibrariesAndSDKs/display-library/blob/master/Sample-Managed/Program.cs\npublic class AmdGpuControl : IGpuControl\n{\n    private bool _isReady;\n    private nint _adlContextHandle;\n\n    private readonly ADLAdapterInfo _internalDiscreteAdapter;\n    private readonly ADLAdapterInfo? _iGPU;\n\n    public bool IsNvidia => false;\n\n    public string FullName => _internalDiscreteAdapter!.AdapterName;\n\n    private ADLAdapterInfo? FindByType(ADLAsicFamilyType type = ADLAsicFamilyType.Discrete)\n    {\n        ADL2_Adapter_NumberOfAdapters_Get(_adlContextHandle, out int numberOfAdapters);\n        if (numberOfAdapters <= 0)\n            return null;\n\n        ADLAdapterInfoArray osAdapterInfoData = new();\n        int osAdapterInfoDataSize = Marshal.SizeOf(osAdapterInfoData);\n        nint AdapterBuffer = Marshal.AllocCoTaskMem(osAdapterInfoDataSize);\n        Marshal.StructureToPtr(osAdapterInfoData, AdapterBuffer, false);\n        if (ADL2_Adapter_AdapterInfo_Get(_adlContextHandle, AdapterBuffer, osAdapterInfoDataSize) != Adl2.ADL_SUCCESS)\n            return null;\n\n        osAdapterInfoData = (ADLAdapterInfoArray)Marshal.PtrToStructure(AdapterBuffer, osAdapterInfoData.GetType())!;\n\n        const int amdVendorId = 1002;\n\n        // Determine which GPU is internal discrete AMD GPU\n        ADLAdapterInfo internalDiscreteAdapter =\n            osAdapterInfoData.ADLAdapterInfo\n                .FirstOrDefault(adapter =>\n                {\n                    if (adapter.Exist == 0 || adapter.Present == 0)\n                        return false;\n\n                    if (adapter.VendorID != amdVendorId)\n                        return false;\n\n                    if (ADL2_Adapter_ASICFamilyType_Get(_adlContextHandle, adapter.AdapterIndex, out ADLAsicFamilyType asicFamilyType, out int asicFamilyTypeValids) != Adl2.ADL_SUCCESS)\n                        return false;\n\n                    asicFamilyType = (ADLAsicFamilyType)((int)asicFamilyType & asicFamilyTypeValids);\n\n                    return (asicFamilyType & type) != 0;\n                });\n\n        if (internalDiscreteAdapter.Exist == 0)\n            return null;\n\n        return internalDiscreteAdapter;\n\n    }\n\n    public AmdGpuControl()\n    {\n        if (AppConfig.NoGpu() || !Adl2.Load()) return;\n\n        try\n        {\n            if (Adl2.ADL2_Main_Control_Create(1, out _adlContextHandle) != Adl2.ADL_SUCCESS) return;\n        } catch (Exception ex)\n        {\n            Logger.WriteLine(ex.Message);\n            return;\n        }\n\n        ADLAdapterInfo? internalDiscreteAdapter = FindByType(ADLAsicFamilyType.Discrete);\n\n        if (internalDiscreteAdapter is not null)\n        {\n            _internalDiscreteAdapter = (ADLAdapterInfo)internalDiscreteAdapter;\n            _isReady = true;\n        }\n\n        _iGPU = FindByType(ADLAsicFamilyType.Integrated);\n\n    }\n\n    public bool IsValid => _isReady && _adlContextHandle != nint.Zero;\n\n    public int? GetCurrentTemperature()\n    {\n        if (!IsValid)\n            return null;\n\n        if (ADL2_New_QueryPMLogData_Get(_adlContextHandle, _internalDiscreteAdapter.AdapterIndex, out ADLPMLogDataOutput adlpmLogDataOutput) != Adl2.ADL_SUCCESS)\n            return null;\n\n        ADLSingleSensorData temperatureSensor = adlpmLogDataOutput.Sensors[(int)ADLSensorType.PMLOG_TEMPERATURE_EDGE];\n        if (temperatureSensor.Supported == 0)\n            return null;\n\n        return temperatureSensor.Value;\n    }\n\n\n    public int? GetGpuUse()\n    {\n        if (!IsValid) return null;\n\n        if (ADL2_New_QueryPMLogData_Get(_adlContextHandle, _internalDiscreteAdapter.AdapterIndex, out ADLPMLogDataOutput adlpmLogDataOutput) != Adl2.ADL_SUCCESS)\n            return null;\n\n        ADLSingleSensorData gpuUsage = adlpmLogDataOutput.Sensors[(int)ADLSensorType.PMLOG_INFO_ACTIVITY_GFX];\n        if (gpuUsage.Supported == 0)\n            return null;\n\n        return gpuUsage.Value;\n\n    }\n\n    public int? GetiGpuUse()\n    {\n        if (_adlContextHandle == nint.Zero || _iGPU == null) return null;\n        if (ADL2_New_QueryPMLogData_Get(_adlContextHandle, ((ADLAdapterInfo)_iGPU).AdapterIndex, out ADLPMLogDataOutput adlpmLogDataOutput) != Adl2.ADL_SUCCESS) return null;\n\n        ADLSingleSensorData gpuUsage = adlpmLogDataOutput.Sensors[(int)ADLSensorType.PMLOG_INFO_ACTIVITY_GFX];\n        if (gpuUsage.Supported == 0) return null;\n\n        return gpuUsage.Value;\n\n    }\n\n    public int? GetGpuPower()\n    {\n        if (_adlContextHandle == nint.Zero || _iGPU == null) return null;\n        if (ADL2_New_QueryPMLogData_Get(_adlContextHandle, ((ADLAdapterInfo)_iGPU).AdapterIndex, out ADLPMLogDataOutput adlpmLogDataOutput) != Adl2.ADL_SUCCESS) return null;\n\n        ADLSingleSensorData gpuUsage = adlpmLogDataOutput.Sensors[(int)ADLSensorType.PMLOG_ASIC_POWER];\n        if (gpuUsage.Supported == 0) return null;\n\n        return gpuUsage.Value;\n\n    }\n\n\n    public bool SetVariBright(int enabled)\n    {\n        if (_adlContextHandle == nint.Zero) return false;\n\n        ADLAdapterInfo? iGPU = FindByType(ADLAsicFamilyType.Integrated);\n        if (iGPU is null) return false;\n\n        return ADL2_Adapter_VariBrightEnable_Set(_adlContextHandle, ((ADLAdapterInfo)iGPU).AdapterIndex, enabled) == Adl2.ADL_SUCCESS;\n\n    }\n\n    public bool GetVariBright(out int supported, out int enabled)\n    {\n        supported = enabled = -1;\n\n        if (_adlContextHandle == nint.Zero) return false;\n\n        ADLAdapterInfo? iGPU = FindByType(ADLAsicFamilyType.Integrated);\n        if (iGPU is null) return false;\n\n        if (ADL2_Adapter_VariBright_Caps(_adlContextHandle, ((ADLAdapterInfo)iGPU).AdapterIndex, out int supportedOut, out int enabledOut, out int version) != Adl2.ADL_SUCCESS)\n            return false;\n\n        supported = supportedOut;\n        enabled = enabledOut;\n\n        return true;\n    }\n\n    public void StartFPS()\n    {\n        if (_adlContextHandle == nint.Zero || _iGPU == null) return;\n        ADL2_Adapter_FrameMetrics_Start(_adlContextHandle, ((ADLAdapterInfo)_iGPU).AdapterIndex, 0);\n    }\n\n    public void StopFPS()\n    {\n        if (_adlContextHandle == nint.Zero || _iGPU == null) return;\n        ADL2_Adapter_FrameMetrics_Stop(_adlContextHandle, ((ADLAdapterInfo)_iGPU).AdapterIndex, 0);\n    }\n\n    public float GetFPS()\n    {\n        if (_adlContextHandle == nint.Zero || _iGPU == null) return 0;\n        float fps;\n        if (ADL2_Adapter_FrameMetrics_Get(_adlContextHandle, ((ADLAdapterInfo)_iGPU).AdapterIndex, 0, out fps) != Adl2.ADL_SUCCESS) return 0;\n        return fps;\n    }\n\n    public int GetFPSLimit()\n    {\n        if (_adlContextHandle == nint.Zero || _iGPU == null) return -1;\n        ADLFPSSettingsOutput settings;\n        if (ADL2_FPS_Settings_Get(_adlContextHandle, ((ADLAdapterInfo)_iGPU).AdapterIndex, out settings) != Adl2.ADL_SUCCESS) return -1;\n\n        Logger.WriteLine($\"FPS Limit: {settings.ulACFPSCurrent}\");\n\n        return settings.ulACFPSCurrent;\n    }\n\n    public int SetFPSLimit(int limit)\n    {\n        if (_adlContextHandle == nint.Zero || _iGPU == null) return -1;\n\n        ADLFPSSettingsInput settings = new ADLFPSSettingsInput();\n\n        settings.ulACFPSCurrent = limit;\n        settings.ulDCFPSCurrent = limit;\n        settings.bGlobalSettings = 1;\n\n        if (ADL2_FPS_Settings_Set(_adlContextHandle, ((ADLAdapterInfo)_iGPU).AdapterIndex, settings) != Adl2.ADL_SUCCESS) return 0;\n\n        return 1;\n    }\n\n    public ADLODNPerformanceLevels? GetGPUClocks()\n    {\n        if (!IsValid) return null;\n\n        ADLODNPerformanceLevels performanceLevels = new();\n        ADL2_OverdriveN_SystemClocks_Get(_adlContextHandle, _internalDiscreteAdapter.AdapterIndex, ref performanceLevels);\n\n        return performanceLevels;\n    }\n\n    public void KillGPUApps()\n    {\n\n        if (!IsValid) return;\n\n        nint appInfoPtr = nint.Zero;\n        int appCount = 0;\n\n        try\n        {\n            // Get switchable graphics applications information\n            var result = ADL2_SwitchableGraphics_Applications_Get(_adlContextHandle, 2, out appCount, out appInfoPtr);\n            if (result != 0)\n            {\n                throw new Exception(\"Failed to get switchable graphics applications. Error code: \" + result);\n            }\n\n            // Convert the application data pointers to an array of structs\n            var appInfoArray = new ADLSGApplicationInfo[appCount];\n            nint currentPtr = appInfoPtr;\n\n            for (int i = 0; i < appCount; i++)\n            {\n                appInfoArray[i] = Marshal.PtrToStructure<ADLSGApplicationInfo>(currentPtr);\n                currentPtr = nint.Add(currentPtr, Marshal.SizeOf<ADLSGApplicationInfo>());\n            }\n\n            var appNames = new List<string>();\n\n            for (int i = 0; i < appCount; i++)\n            {\n                if (appInfoArray[i].iGPUAffinity == 1)\n                {\n                    Logger.WriteLine(appInfoArray[i].strFileName + \":\" + appInfoArray[i].iGPUAffinity + \"(\" + appInfoArray[i].timeStamp + \")\");\n                    appNames.Add(Path.GetFileNameWithoutExtension(appInfoArray[i].strFileName));\n                }\n            }\n\n            List<string> immune = new() { \"svchost\", \"system\", \"ntoskrnl\", \"csrss\", \"winlogon\", \"wininit\", \"smss\" };\n\n            foreach (string kill in appNames)\n                if (!immune.Contains(kill.ToLower()))\n                    ProcessHelper.KillByName(kill);\n\n\n        }\n        catch (Exception ex)\n        {\n            Logger.WriteLine(ex.Message);\n        }\n        finally\n        {\n            // Clean up resources\n            if (appInfoPtr != nint.Zero)\n            {\n                Marshal.FreeCoTaskMem(appInfoPtr);\n            }\n\n        }\n    }\n\n\n    private void ReleaseUnmanagedResources()\n    {\n        if (_adlContextHandle != nint.Zero)\n        {\n            ADL2_Main_Control_Destroy(_adlContextHandle);\n            _adlContextHandle = nint.Zero;\n            _isReady = false;\n        }\n    }\n\n    public void Dispose()\n    {\n        ReleaseUnmanagedResources();\n        GC.SuppressFinalize(this);\n    }\n\n    ~AmdGpuControl()\n    {\n        ReleaseUnmanagedResources();\n    }\n}\n"
  },
  {
    "path": "app/Gpu/GPUModeControl.cs",
    "content": "﻿using GHelper.Display;\nusing GHelper.Gpu.NVidia;\nusing GHelper.Helpers;\nusing GHelper.USB;\nusing Microsoft.Win32;\nusing System.Diagnostics;\n\nnamespace GHelper.Gpu\n{\n    public class GPUModeControl\n    {\n        SettingsForm settings;\n\n        public static int gpuMode;\n        public static bool? gpuExists = null;\n\n\n        public GPUModeControl(SettingsForm settingsForm)\n        {\n            settings = settingsForm;\n        }\n\n        public void InitGPUMode()\n        {\n            if (AppConfig.NoGpu())\n            {\n                settings.HideGPUModes(false);\n                return;\n            }\n\n            int eco = Program.acpi.DeviceGet(AsusACPI.GPUEco);\n            int mux = Program.acpi.DeviceGet(AsusACPI.GPUMux);\n\n            Logger.WriteLine(\"Eco flag : \" + eco);\n            Logger.WriteLine(\"Mux flag : \" + mux);\n\n            settings.VisualiseGPUButtons(eco >= 0, mux >= 0);\n\n            if (mux == 0)\n            {\n                gpuMode = AsusACPI.GPUModeUltimate;\n            }\n            else\n            {\n                if (eco == 1)\n                    gpuMode = AsusACPI.GPUModeEco;\n                else\n                    gpuMode = AsusACPI.GPUModeStandard;\n\n                // GPU mode not supported\n                if (eco < 0 && mux < 0)\n                {\n                    if (gpuExists is null) gpuExists = Program.acpi.GetFan(AsusFan.GPU) >= 0;\n                    settings.HideGPUModes((bool)gpuExists);\n                }\n            }\n\n            AppConfig.Set(\"gpu_mode\", gpuMode);\n            settings.VisualiseGPUMode(gpuMode);\n\n            Aura.CustomRGB.ApplyGPUColor(gpuMode);\n\n        }\n\n\n\n        public void SetGPUMode(int GPUMode, int auto = 0)\n        {\n\n            int CurrentGPU = AppConfig.Get(\"gpu_mode\");\n            AppConfig.Set(\"gpu_auto\", auto);\n\n            if (CurrentGPU == GPUMode)\n            {\n                settings.VisualiseGPUMode();\n                return;\n            }\n\n            var restart = false;\n            var changed = false;\n\n            int status;\n\n            if (CurrentGPU == AsusACPI.GPUModeUltimate)\n            {\n                DialogResult dialogResult = MessageBox.Show(Properties.Strings.AlertUltimateOff, Properties.Strings.AlertUltimateTitle, MessageBoxButtons.YesNo);\n                if (dialogResult == DialogResult.Yes)\n                {\n                    status = Program.acpi.DeviceSet(AsusACPI.GPUMux, 1, \"GPUMux\");\n                    restart = true;\n                    changed = true;\n                }\n            }\n            else if (GPUMode == AsusACPI.GPUModeUltimate)\n            {\n                DialogResult dialogResult = MessageBox.Show(Properties.Strings.AlertUltimateOn, Properties.Strings.AlertUltimateTitle, MessageBoxButtons.YesNo);\n                if (dialogResult == DialogResult.Yes)\n                {\n                    if (AppConfig.NoAutoUltimate())\n                    {\n                        Program.acpi.SetGPUEco(0);\n                        Thread.Sleep(500);\n\n                        int eco = Program.acpi.DeviceGet(AsusACPI.GPUEco);\n                        Logger.WriteLine(\"Eco flag : \" + eco);\n                        if (eco == 1)\n                        {\n                            settings.VisualiseGPUMode();\n                            return;\n                        }\n                    }\n                    status = Program.acpi.DeviceSet(AsusACPI.GPUMux, 0, \"GPUMux\");\n                    restart = true;\n                    changed = true;\n                }\n\n            }\n            else if (GPUMode == AsusACPI.GPUModeEco)\n            {\n                settings.VisualiseGPUMode(GPUMode);\n                SetGPUEco(1);\n                changed = true;\n            }\n            else if (GPUMode == AsusACPI.GPUModeStandard)\n            {\n                settings.VisualiseGPUMode(GPUMode);\n                SetGPUEco(0);\n                changed = true;\n            }\n\n            if (changed)\n            {\n                AppConfig.Set(\"gpu_mode\", GPUMode);\n            }\n\n            if (restart)\n            {\n                settings.VisualiseGPUMode();\n                Process.Start(\"shutdown\", \"/r /t 1\");\n            }\n\n        }\n\n\n\n        public void SetGPUEco(int eco)\n        {\n\n            settings.LockGPUModes();\n\n            Task.Run(async () =>\n            {\n\n                int status = 1;\n\n                if (eco == 1)\n                {\n                    HardwareControl.KillGPUApps();\n                    if (AppConfig.IsNVPlatform()) NvidiaGpuControl.StopNVService();\n                }\n\n                Logger.WriteLine($\"Running eco command {eco}\");\n\n                try\n                {\n\n                    status = Program.acpi.SetGPUEco(eco);\n                    await Task.Delay(TimeSpan.FromMilliseconds(AppConfig.Get(\"refresh_delay\", 500)));\n\n                    settings.Invoke(delegate\n                    {\n                        InitGPUMode();\n                        ScreenControl.AutoScreen();\n                    });\n\n                    if (eco == 0)\n                    {\n                        if (AppConfig.IsNVPlatform())\n                        {\n                            await Task.Delay(TimeSpan.FromMilliseconds(AppConfig.Get(\"nv_delay\", 5000)));\n                            NvidiaGpuControl.RestartNVService();\n                            await Task.Delay(TimeSpan.FromMilliseconds(1000));\n                        } else\n                        {\n                            await Task.Delay(TimeSpan.FromMilliseconds(3000));\n                        }\n                        HardwareControl.RecreateGpuControl();\n                        Program.modeControl.SetGPUClocks(false);\n                    }\n\n                    if (AppConfig.IsModeReapplyRequired())\n                    {\n                        await Task.Delay(TimeSpan.FromMilliseconds(3000));\n                        Program.modeControl.AutoPerformance();\n                    }\n                }\n                catch (Exception ex)\n                {\n                    Logger.WriteLine(\"Error setting GPU Eco: \" + ex.Message);\n                }\n\n            });\n\n\n        }\n\n        public static bool IsPlugged()\n        {\n            if (SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Online) return false;\n            if (!AppConfig.Is(\"optimized_usbc\")) return true;\n\n            if (AppConfig.ContainsModel(\"FA507\")) Thread.Sleep(1000);\n\n            int chargerMode = Program.acpi.DeviceGet(AsusACPI.ChargerMode);\n            Logger.WriteLine(\"ChargerStatus: \" + chargerMode);\n\n            if (chargerMode <= 0) return true;\n            return (chargerMode & AsusACPI.ChargerBarrel) > 0;\n\n        }\n\n        public bool AutoGPUMode(bool optimized = false, int delay = 0)\n        {\n\n            bool GpuAuto = AppConfig.Is(\"gpu_auto\");\n            bool ForceGPU = AppConfig.IsForceSetGPUMode() && !GpuAuto;\n\n            int GpuMode = AppConfig.Get(\"gpu_mode\");\n\n            if (!GpuAuto && !ForceGPU) return false;\n\n            int eco = Program.acpi.DeviceGet(AsusACPI.GPUEco);\n            int mux = Program.acpi.DeviceGet(AsusACPI.GPUMux);\n\n            if (mux == 0)\n            {\n                if (optimized) SetGPUMode(AsusACPI.GPUModeStandard, 1);\n                return false;\n            }\n            else\n            {\n\n                if (eco == 1)\n                    if ((GpuAuto && IsPlugged()) || (ForceGPU && GpuMode == AsusACPI.GPUModeStandard))\n                    {\n                        if (delay > 0) Thread.Sleep(delay);\n                        SetGPUEco(0);\n                        return true;\n                    }\n                if (eco == 0)\n                    if ((GpuAuto && !IsPlugged()) || (ForceGPU && GpuMode == AsusACPI.GPUModeEco))\n                    {\n\n                        if (Program.acpi.IsXGConnected()) return false;\n                        if (HardwareControl.IsUsedGPU())\n                        {\n                            DialogResult dialogResult = MessageBox.Show(Properties.Strings.AlertDGPU, Properties.Strings.AlertDGPUTitle, MessageBoxButtons.YesNo);\n                            if (dialogResult == DialogResult.No) return false;\n                        }\n\n                        if (delay > 0) Thread.Sleep(delay);\n                        SetGPUEco(1);\n                        return true;\n                    }\n            }\n\n            return false;\n\n        }\n\n\n        public void ToggleXGM(bool silent = false)\n        {\n\n            Task.Run(async () =>\n            {\n                settings.LockGPUModes();\n\n                if (Program.acpi.DeviceGet(AsusACPI.GPUXG) == 1)\n                {\n                    XGM.Reset();\n                    HardwareControl.KillGPUApps();\n\n                    if (silent)\n                    {\n                        Program.acpi.DeviceSet(AsusACPI.GPUXG, 0, \"GPU XGM\");\n                        await Task.Delay(TimeSpan.FromSeconds(15));\n                    }\n                    else\n                    {\n                        DialogResult dialogResult = DialogResult.No;\n                        settings.Invoke((MethodInvoker)delegate\n                        {\n                            dialogResult = MessageBox.Show(settings, \"Did you close all applications running on XG Mobile?\", \"Disabling XG Mobile\", MessageBoxButtons.YesNo);\n                        });\n                        \n                        if (dialogResult == DialogResult.Yes)\n                        {\n                            Program.acpi.DeviceSet(AsusACPI.GPUXG, 0, \"GPU XGM\");\n                            await Task.Delay(TimeSpan.FromSeconds(15));\n                        }\n                    }\n                }\n                else\n                {\n\n                    if (AppConfig.Is(\"xgm_special\"))\n                        Program.acpi.DeviceSet(AsusACPI.GPUXG, 0x101, \"GPU XGM\");\n                    else\n                        Program.acpi.DeviceSet(AsusACPI.GPUXG, 1, \"GPU XGM\");\n\n                    XGM.Init();\n\n                    await Task.Delay(TimeSpan.FromSeconds(15));\n\n                    if (AppConfig.IsMode(\"auto_apply\"))\n                        XGM.SetFan(AppConfig.GetFanConfig(AsusFan.XGM));\n\n                    HardwareControl.RecreateGpuControl();\n\n                }\n\n                settings.Invoke(delegate\n                {\n                    InitGPUMode();\n                });\n            });\n        }\n\n        public void KillGPUApps()\n        {\n            if (HardwareControl.GpuControl is not null)\n            {\n                HardwareControl.GpuControl.KillGPUApps();\n            }\n        }\n\n        public static bool IsHibernationEnabled()\n        {\n            try\n            {\n                using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@\"SYSTEM\\CurrentControlSet\\Control\\Power\"))\n                {\n                    if (key != null)\n                    {\n                        object value = key.GetValue(\"HibernateEnabled\");\n                        if (value is int intValue)\n                        {\n                            return intValue != 0;\n                        }\n                    }\n                }\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine(\"Error checking hibernation status: \" + ex.Message);\n            }\n            return true;\n        }\n\n\n        // Manually forcing standard mode on shutdown/hibernate for some exotic cases\n        // https://github.com/seerge/g-helper/pull/855 \n        public void StandardModeFix(bool hibernate = false)\n        {\n            if (!AppConfig.IsGPUFix()) return; // No config entry\n            if (Program.acpi.DeviceGet(AsusACPI.GPUMux) == 0) return; // Ultimate mode\n            if (hibernate && !IsHibernationEnabled()) return;\n\n            Logger.WriteLine(\"Forcing Standard Mode on \" + (hibernate ? \"hibernation\" : \"shutdown\"));\n            Program.acpi.SetGPUEco(0);\n        }\n\n    }\n}\n"
  },
  {
    "path": "app/Gpu/IGpuControl.cs",
    "content": "﻿namespace GHelper.Gpu;\n\npublic  interface IGpuControl : IDisposable {\n    bool IsNvidia { get; }\n    bool IsValid { get; }\n    public string FullName { get; }\n    int? GetCurrentTemperature();\n    int? GetGpuUse();\n    void KillGPUApps();\n\n}\n"
  },
  {
    "path": "app/Gpu/NVidia/NvidiaGpuControl.cs",
    "content": "﻿using GHelper.Helpers;\nusing NvAPIWrapper.GPU;\nusing NvAPIWrapper.Native;\nusing NvAPIWrapper.Native.GPU;\nusing NvAPIWrapper.Native.GPU.Structures;\nusing NvAPIWrapper.Native.Interfaces.GPU;\nusing System.Diagnostics;\nusing static NvAPIWrapper.Native.GPU.Structures.PerformanceStates20InfoV1;\n\nnamespace GHelper.Gpu.NVidia;\n\npublic class NvidiaGpuControl : IGpuControl\n{\n\n    public static int MaxCoreOffset = AppConfig.Get(\"max_gpu_core\", 250);\n    public static int MaxMemoryOffset = AppConfig.Get(\"max_gpu_memory\", 500);\n\n    public static int MinCoreOffset = AppConfig.Get(\"min_gpu_core\", -250);\n    public static int MinMemoryOffset = AppConfig.Get(\"min_gpu_memory\", -500);\n\n    public static int MinClockLimit = AppConfig.Get(\"min_gpu_clock\", 400);\n    public const int MaxClockLimit = 3000;\n\n    private static PhysicalGPU? _internalGpu;\n\n    public NvidiaGpuControl()\n    {\n        _internalGpu = GetInternalDiscreteGpu();\n        if (IsValid)\n        {\n            if (FullName.Contains(\"5080\") || FullName.Contains(\"5090\"))\n            {\n                MaxCoreOffset = AppConfig.Get(\"max_gpu_core\", 400);\n                MaxMemoryOffset = AppConfig.Get(\"max_gpu_memory\", 1000);\n                Logger.WriteLine($\"NVIDIA GPU: {FullName} ({MaxCoreOffset},{MaxMemoryOffset})\");\n            }\n            if (FullName.Contains(\"5070 Ti\") || FullName.Contains(\"4080\") || FullName.Contains(\"4090\"))\n            {\n                MaxCoreOffset = AppConfig.Get(\"max_gpu_core\", 300);\n                Logger.WriteLine($\"NVIDIA GPU: {FullName} ({MaxCoreOffset},{MaxMemoryOffset})\");\n            }\n        }\n    }\n\n    public bool IsValid => _internalGpu != null;\n\n    public bool IsNvidia => IsValid;\n\n    public string FullName => _internalGpu!.FullName;\n\n    public int? GetCurrentTemperature()\n    {\n        if (!IsValid) return null;\n\n        PhysicalGPU internalGpu = _internalGpu!;\n        IThermalSensor? gpuSensor =\n            GPUApi.GetThermalSettings(internalGpu.Handle).Sensors\n            .FirstOrDefault(s => s.Target == ThermalSettingsTarget.GPU);\n\n        return gpuSensor?.CurrentTemperature;\n    }\n\n    public void Dispose()\n    {\n    }\n\n    public void KillGPUApps()\n    {\n\n        if (!IsValid) return;\n        PhysicalGPU internalGpu = _internalGpu!;\n\n        try\n        {\n            Process[] processes = internalGpu.GetActiveApplications();\n            foreach (Process process in processes)\n                try\n                {\n                    Logger.WriteLine(\"Kill:\" + process.ProcessName);\n                    ProcessHelper.KillByProcess(process);\n                }\n                catch (Exception ex)\n                {\n                    Logger.WriteLine(ex.Message);\n                }\n        }\n        catch (Exception ex)\n        {\n            Logger.WriteLine(ex.Message);\n        }\n\n        //GeneralApi.RestartDisplayDriver();\n    }\n\n\n    public bool GetClocks(out int core, out int memory)\n    {\n        PhysicalGPU internalGpu = _internalGpu!;\n\n        //Logger.WriteLine(internalGpu.FullName);\n        //Logger.WriteLine(internalGpu.ArchitectInformation.ToString());\n\n        try\n        {\n            IPerformanceStates20Info states = GPUApi.GetPerformanceStates20(internalGpu.Handle);\n            core = states.Clocks[PerformanceStateId.P0_3DPerformance][0].FrequencyDeltaInkHz.DeltaValue / 1000;\n            memory = states.Clocks[PerformanceStateId.P0_3DPerformance][1].FrequencyDeltaInkHz.DeltaValue / 1000;\n            Logger.WriteLine($\"GET GPU CLOCKS: {core}, {memory}\");\n\n            foreach (var delta in states.Voltages[PerformanceStateId.P0_3DPerformance])\n            {\n                Logger.WriteLine(\"GPU VOLT:\" + delta.IsEditable + \" - \" + delta.ValueDeltaInMicroVolt.DeltaValue);\n            }\n\n            return true;\n\n        }\n        catch (Exception ex)\n        {\n            Logger.WriteLine(\"GET GPU CLOCKS:\" + ex.Message);\n            core = memory = 0;\n            return false;\n        }\n\n    }\n\n\n    private static bool RunPowershellCommand(string script)\n    {\n        try\n        {\n            ProcessHelper.RunCMD(\"powershell\", script);\n            return true;\n        }\n        catch (Exception ex)\n        {\n            Logger.WriteLine(ex.ToString());\n            return false;\n        }\n\n    }\n\n    public int GetMaxGPUCLock()\n    {\n        PhysicalGPU internalGpu = _internalGpu!;\n        try\n        {\n            PrivateClockBoostLockV2 data = GPUApi.GetClockBoostLock(internalGpu.Handle);\n            int limit = (int)data.ClockBoostLocks[0].VoltageInMicroV / 1000;\n            Logger.WriteLine(\"GET CLOCK LIMIT: \" + limit);\n            return limit;\n        }\n        catch (Exception ex)\n        {\n            Logger.WriteLine(\"GET CLOCK LIMIT: \" + ex.Message);\n            return -1;\n\n        }\n    }\n\n\n    public int SetMaxGPUClock(int clock)\n    {\n\n        if (clock < MinClockLimit || clock >= MaxClockLimit) clock = 0;\n\n        int _clockLimit = GetMaxGPUCLock();\n\n        if (_clockLimit < 0 && clock == 0) return 0;\n\n        if (_clockLimit != clock)\n        {\n            if (clock > 0) RunPowershellCommand($\"nvidia-smi -lgc 0,{clock}\");\n            else RunPowershellCommand($\"nvidia-smi -rgc\");\n            return 1;\n        }\n        else\n        {\n            return 0;\n        }\n\n\n    }\n\n    public static void RestartNVService()\n    {\n        if (!ProcessHelper.IsUserAdministrator()) return;\n        RunPowershellCommand(@\"Restart-Service -Name 'NVDisplay.ContainerLocalSystem' -Force\");\n        RunPowershellCommand(@\"Restart-Service -Name 'NvContainerLocalSystem' -Force\");\n    }\n\n    public static void StopNVService()\n    {\n        if (!ProcessHelper.IsUserAdministrator()) return;\n        RunPowershellCommand(@\"Stop-Service -Name 'NvContainerLocalSystem' -Force\");\n        RunPowershellCommand(@\"Stop-Service -Name 'NVDisplay.ContainerLocalSystem' -Force\");\n    }\n\n    public int SetClocks(int core, int memory)\n    {\n\n        if (core < MinCoreOffset || core > MaxCoreOffset) return 0;\n        if (memory < MinMemoryOffset || memory > MaxMemoryOffset) return 0;\n\n        GetClocks(out int currentCore, out int currentMemory);\n\n        // Nothing to set\n        if (Math.Abs(core - currentCore) < 5 && Math.Abs(memory - currentMemory) < 5) return 0;\n\n        PhysicalGPU internalGpu = _internalGpu!;\n\n        var coreClock = new PerformanceStates20ClockEntryV1(PublicClockDomain.Graphics, new PerformanceStates20ParameterDelta(core * 1000));\n        var memoryClock = new PerformanceStates20ClockEntryV1(PublicClockDomain.Memory, new PerformanceStates20ParameterDelta(memory * 1000));\n        //var voltageEntry = new PerformanceStates20BaseVoltageEntryV1(PerformanceVoltageDomain.Core, new PerformanceStates20ParameterDelta(voltage));\n\n        PerformanceStates20ClockEntryV1[] clocks = { coreClock, memoryClock };\n        PerformanceStates20BaseVoltageEntryV1[] voltages = { };\n\n        PerformanceState20[] performanceStates = { new PerformanceState20(PerformanceStateId.P0_3DPerformance, clocks, voltages) };\n\n        var overclock = new PerformanceStates20InfoV1(performanceStates, 2, 0);\n\n        try\n        {\n            Logger.WriteLine($\"SET GPU CLOCKS: {core}, {memory}\");\n            GPUApi.SetPerformanceStates20(internalGpu.Handle, overclock);\n        }\n        catch (Exception ex)\n        {\n            Logger.WriteLine(\"SET GPU CLOCKS: \" + ex.Message);\n            return -1;\n        }\n\n        return 1;\n    }\n\n    private static PhysicalGPU? GetInternalDiscreteGpu()\n    {\n        try\n        {\n            return PhysicalGPU\n                .GetPhysicalGPUs()\n                .FirstOrDefault(gpu => gpu.SystemType == SystemType.Laptop);\n        }\n        catch (Exception ex)\n        {\n            Debug.WriteLine(ex.Message);\n            return null;\n        }\n    }\n\n\n    public int? GetGpuUse()\n    {\n        if (!IsValid)\n            return null;\n\n        PhysicalGPU internalGpu = _internalGpu!;\n        IUtilizationDomainInfo? gpuUsage = GPUApi.GetUsages(internalGpu.Handle).GPU;\n\n        return (int?)gpuUsage?.Percentage;\n\n    }\n\n}\n"
  },
  {
    "path": "app/Gpu/NVidia/NvidiaSmi.cs",
    "content": "﻿using Ryzen;\nusing System.Diagnostics;\nusing System.Text.RegularExpressions;\n\npublic static class NvidiaSmi\n{\n    public static bool GetDisplayActiveStatus()\n    {\n        // Non AMD devices doesn't seem to be affected\n        if (!RyzenControl.IsAMD()) return false;\n\n        string commandOutput = RunNvidiaSmiCommand();\n\n        Logger.WriteLine(commandOutput);\n\n        if (commandOutput.Length == 0) return false;\n        if (!commandOutput.Contains(\"RTX 40\")) return false;\n\n        // Extract the \"Display Active\" status using regular expressions\n        string displayActivePattern = @\"Display Active\\s+:\\s+(\\w+)\";\n\n        Match match = Regex.Match(commandOutput, displayActivePattern, RegexOptions.IgnoreCase);\n\n        if (match.Success)\n        {\n            string status = match.Groups[1].Value.ToLower().Trim(' ');\n            return status == \"enabled\";\n        }\n\n        return false; // Return false if the \"Display Active\" status is not found\n    }\n\n    public static int GetDefaultMaxGPUPower()\n    {\n        if (AppConfig.ContainsModel(\"GU605\") || AppConfig.ContainsModel(\"GA605\")) return 125;\n        if (AppConfig.ContainsModel(\"GA403\")) return 90;\n        if (AppConfig.ContainsModel(\"FA607\")) return 140;\n        else return 175;\n    }\n\n    public static int GetMaxGPUPower()\n    {\n        string output = RunNvidiaSmiCommand(\"--query-gpu=power.max_limit --format csv,noheader,nounits\");\n        output = output.Trim().Trim('\\n', '\\r').Replace(\".00\",\"\").Replace(\",00\", \"\");\n\n        if (float.TryParse(output, out float floatValue))\n        {\n            int intValue = (int)floatValue;\n            if (intValue >= 50 && intValue <= 175) return intValue;\n        }\n\n        return GetDefaultMaxGPUPower();\n    }\n\n    private static string RunNvidiaSmiCommand(string arguments = \"-i 0 -q\")\n    {\n        ProcessStartInfo startInfo = new ProcessStartInfo\n        {\n            FileName = \"nvidia-smi\",\n            Arguments = arguments,\n            RedirectStandardOutput = true,\n            UseShellExecute = false,\n            CreateNoWindow = true\n        };\n\n        Process process = new Process\n        {\n            StartInfo = startInfo\n        };\n\n        try\n        {\n            process.Start();\n            string output = process.StandardOutput.ReadToEnd();\n            process.WaitForExit();\n            return output;\n        }\n        catch (Exception ex)\n        {\n            //return File.ReadAllText(@\"smi.txt\");\n            Debug.WriteLine(ex.Message);\n        }\n\n        return \"\";\n\n    }\n}\n"
  },
  {
    "path": "app/Handheld.Designer.cs",
    "content": "﻿namespace GHelper\n{\n    partial class Handheld\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            panelDeadzones = new Panel();\n            panelRight = new Panel();\n            panelRT = new Panel();\n            pictureBox4 = new PictureBox();\n            trackRTMax = new TrackBar();\n            labelRT = new Label();\n            trackRTMin = new TrackBar();\n            labelRTTitle = new Label();\n            panelRS = new Panel();\n            pictureBox1 = new PictureBox();\n            trackRSMax = new TrackBar();\n            labelRS = new Label();\n            trackRSMin = new TrackBar();\n            labelRSTitle = new Label();\n            panelLeft = new Panel();\n            panelLT = new Panel();\n            pictureBox2 = new PictureBox();\n            trackLTMax = new TrackBar();\n            labelLT = new Label();\n            trackLTMin = new TrackBar();\n            labelLTTitle = new Label();\n            panelLS = new Panel();\n            pictureBox3 = new PictureBox();\n            trackLSMax = new TrackBar();\n            labelLS = new Label();\n            trackLSMin = new TrackBar();\n            labelLSTitle = new Label();\n            buttonReset = new UI.RButton();\n            panelBindings = new Panel();\n            panelBinding = new Panel();\n            labelBinding = new Label();\n            labelSecondary = new Label();\n            labelPrimary = new Label();\n            comboSecondary = new UI.RComboBox();\n            comboPrimary = new UI.RComboBox();\n            buttonView = new UI.RButton();\n            buttonLS = new UI.RButton();\n            buttonLT = new UI.RButton();\n            buttonLB = new UI.RButton();\n            buttonDPR = new UI.RButton();\n            buttonDPL = new UI.RButton();\n            buttonDPD = new UI.RButton();\n            buttonDPU = new UI.RButton();\n            buttonM2 = new UI.RButton();\n            buttonM1 = new UI.RButton();\n            buttonRS = new UI.RButton();\n            buttonMenu = new UI.RButton();\n            buttonRT = new UI.RButton();\n            buttonRB = new UI.RButton();\n            buttonB = new UI.RButton();\n            buttonA = new UI.RButton();\n            buttonY = new UI.RButton();\n            buttonX = new UI.RButton();\n            pictureAlly = new PictureBox();\n            panelVibra = new Panel();\n            checkController = new UI.RCheckBox();\n            pictureBox5 = new PictureBox();\n            labelVibra = new Label();\n            labelVibraTitle = new Label();\n            trackVibra = new TrackBar();\n            panelDeadzones.SuspendLayout();\n            panelRight.SuspendLayout();\n            panelRT.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureBox4).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)trackRTMax).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)trackRTMin).BeginInit();\n            panelRS.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)trackRSMax).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)trackRSMin).BeginInit();\n            panelLeft.SuspendLayout();\n            panelLT.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureBox2).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)trackLTMax).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)trackLTMin).BeginInit();\n            panelLS.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureBox3).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)trackLSMax).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)trackLSMin).BeginInit();\n            panelBindings.SuspendLayout();\n            panelBinding.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureAlly).BeginInit();\n            panelVibra.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureBox5).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)trackVibra).BeginInit();\n            SuspendLayout();\n            // \n            // panelDeadzones\n            // \n            panelDeadzones.Controls.Add(panelRight);\n            panelDeadzones.Controls.Add(panelLeft);\n            panelDeadzones.Dock = DockStyle.Top;\n            panelDeadzones.Location = new Point(10, 527);\n            panelDeadzones.Name = \"panelDeadzones\";\n            panelDeadzones.Size = new Size(1123, 258);\n            panelDeadzones.TabIndex = 0;\n            // \n            // panelRight\n            // \n            panelRight.AutoSize = true;\n            panelRight.Controls.Add(panelRT);\n            panelRight.Controls.Add(panelRS);\n            panelRight.Dock = DockStyle.Left;\n            panelRight.Location = new Point(560, 0);\n            panelRight.MinimumSize = new Size(560, 0);\n            panelRight.Name = \"panelRight\";\n            panelRight.Size = new Size(560, 258);\n            panelRight.TabIndex = 48;\n            // \n            // panelRT\n            // \n            panelRT.AutoSize = true;\n            panelRT.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelRT.Controls.Add(pictureBox4);\n            panelRT.Controls.Add(trackRTMax);\n            panelRT.Controls.Add(labelRT);\n            panelRT.Controls.Add(trackRTMin);\n            panelRT.Controls.Add(labelRTTitle);\n            panelRT.Dock = DockStyle.Top;\n            panelRT.Location = new Point(0, 124);\n            panelRT.Margin = new Padding(4);\n            panelRT.MaximumSize = new Size(0, 124);\n            panelRT.Name = \"panelRT\";\n            panelRT.Size = new Size(560, 124);\n            panelRT.TabIndex = 51;\n            // \n            // pictureBox4\n            // \n            pictureBox4.BackgroundImage = Properties.Resources.icons8_xbox_rt_32;\n            pictureBox4.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureBox4.ErrorImage = null;\n            pictureBox4.InitialImage = null;\n            pictureBox4.Location = new Point(16, 18);\n            pictureBox4.Margin = new Padding(4, 2, 4, 10);\n            pictureBox4.Name = \"pictureBox4\";\n            pictureBox4.Size = new Size(32, 32);\n            pictureBox4.TabIndex = 43;\n            pictureBox4.TabStop = false;\n            // \n            // trackRTMax\n            // \n            trackRTMax.Location = new Point(272, 48);\n            trackRTMax.Margin = new Padding(4, 2, 4, 2);\n            trackRTMax.Maximum = 100;\n            trackRTMax.Minimum = 50;\n            trackRTMax.Name = \"trackRTMax\";\n            trackRTMax.RightToLeft = RightToLeft.No;\n            trackRTMax.Size = new Size(280, 90);\n            trackRTMax.TabIndex = 30;\n            trackRTMax.TickFrequency = 5;\n            trackRTMax.TickStyle = TickStyle.TopLeft;\n            trackRTMax.Value = 100;\n            // \n            // labelRT\n            // \n            labelRT.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold, GraphicsUnit.Point);\n            labelRT.Location = new Point(363, 13);\n            labelRT.Margin = new Padding(4, 0, 4, 0);\n            labelRT.Name = \"labelRT\";\n            labelRT.Size = new Size(176, 32);\n            labelRT.TabIndex = 29;\n            labelRT.Text = \"0 - 100%\";\n            labelRT.TextAlign = ContentAlignment.TopRight;\n            // \n            // trackRTMin\n            // \n            trackRTMin.LargeChange = 100;\n            trackRTMin.Location = new Point(6, 48);\n            trackRTMin.Margin = new Padding(4, 2, 4, 2);\n            trackRTMin.Maximum = 50;\n            trackRTMin.Name = \"trackRTMin\";\n            trackRTMin.RightToLeft = RightToLeft.No;\n            trackRTMin.Size = new Size(280, 90);\n            trackRTMin.SmallChange = 10;\n            trackRTMin.TabIndex = 18;\n            trackRTMin.TickFrequency = 5;\n            trackRTMin.TickStyle = TickStyle.TopLeft;\n            // \n            // labelRTTitle\n            // \n            labelRTTitle.AutoSize = true;\n            labelRTTitle.Location = new Point(56, 16);\n            labelRTTitle.Margin = new Padding(4, 0, 4, 0);\n            labelRTTitle.Name = \"labelRTTitle\";\n            labelRTTitle.Size = new Size(276, 32);\n            labelRTTitle.TabIndex = 17;\n            labelRTTitle.Text = \"Right Trigger Deadzones\";\n            // \n            // panelRS\n            // \n            panelRS.AutoSize = true;\n            panelRS.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelRS.Controls.Add(pictureBox1);\n            panelRS.Controls.Add(trackRSMax);\n            panelRS.Controls.Add(labelRS);\n            panelRS.Controls.Add(trackRSMin);\n            panelRS.Controls.Add(labelRSTitle);\n            panelRS.Dock = DockStyle.Top;\n            panelRS.Location = new Point(0, 0);\n            panelRS.Margin = new Padding(4);\n            panelRS.MaximumSize = new Size(0, 124);\n            panelRS.Name = \"panelRS\";\n            panelRS.Size = new Size(560, 124);\n            panelRS.TabIndex = 50;\n            // \n            // pictureBox1\n            // \n            pictureBox1.BackgroundImage = Properties.Resources.icons8_joystick_32;\n            pictureBox1.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureBox1.ErrorImage = null;\n            pictureBox1.InitialImage = null;\n            pictureBox1.Location = new Point(16, 14);\n            pictureBox1.Margin = new Padding(4, 2, 4, 10);\n            pictureBox1.Name = \"pictureBox1\";\n            pictureBox1.Size = new Size(32, 32);\n            pictureBox1.TabIndex = 43;\n            pictureBox1.TabStop = false;\n            // \n            // trackRSMax\n            // \n            trackRSMax.Location = new Point(272, 48);\n            trackRSMax.Margin = new Padding(4, 2, 4, 2);\n            trackRSMax.Maximum = 100;\n            trackRSMax.Minimum = 50;\n            trackRSMax.Name = \"trackRSMax\";\n            trackRSMax.RightToLeft = RightToLeft.No;\n            trackRSMax.Size = new Size(280, 90);\n            trackRSMax.TabIndex = 30;\n            trackRSMax.TickFrequency = 5;\n            trackRSMax.TickStyle = TickStyle.TopLeft;\n            trackRSMax.Value = 100;\n            // \n            // labelRS\n            // \n            labelRS.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold, GraphicsUnit.Point);\n            labelRS.Location = new Point(363, 13);\n            labelRS.Margin = new Padding(4, 0, 4, 0);\n            labelRS.Name = \"labelRS\";\n            labelRS.Size = new Size(176, 32);\n            labelRS.TabIndex = 29;\n            labelRS.Text = \"0 - 100%\";\n            labelRS.TextAlign = ContentAlignment.TopRight;\n            // \n            // trackRSMin\n            // \n            trackRSMin.LargeChange = 100;\n            trackRSMin.Location = new Point(6, 48);\n            trackRSMin.Margin = new Padding(4, 2, 4, 2);\n            trackRSMin.Maximum = 50;\n            trackRSMin.Name = \"trackRSMin\";\n            trackRSMin.RightToLeft = RightToLeft.No;\n            trackRSMin.Size = new Size(280, 90);\n            trackRSMin.SmallChange = 10;\n            trackRSMin.TabIndex = 18;\n            trackRSMin.TickFrequency = 5;\n            trackRSMin.TickStyle = TickStyle.TopLeft;\n            // \n            // labelRSTitle\n            // \n            labelRSTitle.AutoSize = true;\n            labelRSTitle.Location = new Point(56, 14);\n            labelRSTitle.Margin = new Padding(4, 0, 4, 0);\n            labelRSTitle.Name = \"labelRSTitle\";\n            labelRSTitle.Size = new Size(251, 32);\n            labelRSTitle.TabIndex = 17;\n            labelRSTitle.Text = \"Right Stick Deadzones\";\n            // \n            // panelLeft\n            // \n            panelLeft.AutoSize = true;\n            panelLeft.Controls.Add(panelLT);\n            panelLeft.Controls.Add(panelLS);\n            panelLeft.Dock = DockStyle.Left;\n            panelLeft.Location = new Point(0, 0);\n            panelLeft.Margin = new Padding(4);\n            panelLeft.MinimumSize = new Size(560, 0);\n            panelLeft.Name = \"panelLeft\";\n            panelLeft.Padding = new Padding(0, 0, 0, 18);\n            panelLeft.Size = new Size(560, 258);\n            panelLeft.TabIndex = 47;\n            // \n            // panelLT\n            // \n            panelLT.AutoSize = true;\n            panelLT.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelLT.Controls.Add(pictureBox2);\n            panelLT.Controls.Add(trackLTMax);\n            panelLT.Controls.Add(labelLT);\n            panelLT.Controls.Add(trackLTMin);\n            panelLT.Controls.Add(labelLTTitle);\n            panelLT.Dock = DockStyle.Top;\n            panelLT.Location = new Point(0, 124);\n            panelLT.Margin = new Padding(4);\n            panelLT.MaximumSize = new Size(0, 124);\n            panelLT.Name = \"panelLT\";\n            panelLT.Size = new Size(560, 124);\n            panelLT.TabIndex = 51;\n            // \n            // pictureBox2\n            // \n            pictureBox2.BackgroundImage = Properties.Resources.icons8_xbox_lt_32;\n            pictureBox2.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureBox2.ErrorImage = null;\n            pictureBox2.InitialImage = null;\n            pictureBox2.Location = new Point(20, 14);\n            pictureBox2.Margin = new Padding(4, 2, 4, 10);\n            pictureBox2.Name = \"pictureBox2\";\n            pictureBox2.Size = new Size(32, 32);\n            pictureBox2.TabIndex = 42;\n            pictureBox2.TabStop = false;\n            // \n            // trackLTMax\n            // \n            trackLTMax.Location = new Point(272, 48);\n            trackLTMax.Margin = new Padding(4, 2, 4, 2);\n            trackLTMax.Maximum = 100;\n            trackLTMax.Minimum = 50;\n            trackLTMax.Name = \"trackLTMax\";\n            trackLTMax.RightToLeft = RightToLeft.No;\n            trackLTMax.Size = new Size(280, 90);\n            trackLTMax.TabIndex = 30;\n            trackLTMax.TickFrequency = 5;\n            trackLTMax.TickStyle = TickStyle.TopLeft;\n            trackLTMax.Value = 100;\n            // \n            // labelLT\n            // \n            labelLT.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold, GraphicsUnit.Point);\n            labelLT.Location = new Point(363, 13);\n            labelLT.Margin = new Padding(4, 0, 4, 0);\n            labelLT.Name = \"labelLT\";\n            labelLT.Size = new Size(176, 32);\n            labelLT.TabIndex = 29;\n            labelLT.Text = \"0 - 100%\";\n            labelLT.TextAlign = ContentAlignment.TopRight;\n            // \n            // trackLTMin\n            // \n            trackLTMin.LargeChange = 100;\n            trackLTMin.Location = new Point(6, 48);\n            trackLTMin.Margin = new Padding(4, 2, 4, 2);\n            trackLTMin.Maximum = 50;\n            trackLTMin.Name = \"trackLTMin\";\n            trackLTMin.RightToLeft = RightToLeft.No;\n            trackLTMin.Size = new Size(280, 90);\n            trackLTMin.SmallChange = 10;\n            trackLTMin.TabIndex = 18;\n            trackLTMin.TickFrequency = 5;\n            trackLTMin.TickStyle = TickStyle.TopLeft;\n            // \n            // labelLTTitle\n            // \n            labelLTTitle.AutoSize = true;\n            labelLTTitle.Location = new Point(60, 14);\n            labelLTTitle.Margin = new Padding(4, 0, 4, 0);\n            labelLTTitle.Name = \"labelLTTitle\";\n            labelLTTitle.Size = new Size(260, 32);\n            labelLTTitle.TabIndex = 17;\n            labelLTTitle.Text = \"Left Trigger Deadzones\";\n            // \n            // panelLS\n            // \n            panelLS.AutoSize = true;\n            panelLS.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelLS.Controls.Add(pictureBox3);\n            panelLS.Controls.Add(trackLSMax);\n            panelLS.Controls.Add(labelLS);\n            panelLS.Controls.Add(trackLSMin);\n            panelLS.Controls.Add(labelLSTitle);\n            panelLS.Dock = DockStyle.Top;\n            panelLS.Location = new Point(0, 0);\n            panelLS.Margin = new Padding(4);\n            panelLS.MaximumSize = new Size(0, 124);\n            panelLS.Name = \"panelLS\";\n            panelLS.Size = new Size(560, 124);\n            panelLS.TabIndex = 48;\n            // \n            // pictureBox3\n            // \n            pictureBox3.BackgroundImage = Properties.Resources.icons8_joystick_32;\n            pictureBox3.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureBox3.ErrorImage = null;\n            pictureBox3.InitialImage = null;\n            pictureBox3.Location = new Point(20, 13);\n            pictureBox3.Margin = new Padding(4, 2, 4, 10);\n            pictureBox3.Name = \"pictureBox3\";\n            pictureBox3.Size = new Size(32, 32);\n            pictureBox3.TabIndex = 42;\n            pictureBox3.TabStop = false;\n            // \n            // trackLSMax\n            // \n            trackLSMax.Location = new Point(272, 48);\n            trackLSMax.Margin = new Padding(4, 2, 4, 2);\n            trackLSMax.Maximum = 100;\n            trackLSMax.Minimum = 50;\n            trackLSMax.Name = \"trackLSMax\";\n            trackLSMax.RightToLeft = RightToLeft.No;\n            trackLSMax.Size = new Size(280, 90);\n            trackLSMax.TabIndex = 30;\n            trackLSMax.TickFrequency = 5;\n            trackLSMax.TickStyle = TickStyle.TopLeft;\n            trackLSMax.Value = 100;\n            // \n            // labelLS\n            // \n            labelLS.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold, GraphicsUnit.Point);\n            labelLS.Location = new Point(363, 13);\n            labelLS.Margin = new Padding(4, 0, 4, 0);\n            labelLS.Name = \"labelLS\";\n            labelLS.Size = new Size(176, 32);\n            labelLS.TabIndex = 29;\n            labelLS.Text = \"0 - 100%\";\n            labelLS.TextAlign = ContentAlignment.TopRight;\n            // \n            // trackLSMin\n            // \n            trackLSMin.LargeChange = 100;\n            trackLSMin.Location = new Point(6, 48);\n            trackLSMin.Margin = new Padding(4, 2, 4, 2);\n            trackLSMin.Maximum = 50;\n            trackLSMin.Name = \"trackLSMin\";\n            trackLSMin.RightToLeft = RightToLeft.No;\n            trackLSMin.Size = new Size(280, 90);\n            trackLSMin.SmallChange = 10;\n            trackLSMin.TabIndex = 18;\n            trackLSMin.TickFrequency = 5;\n            trackLSMin.TickStyle = TickStyle.TopLeft;\n            // \n            // labelLSTitle\n            // \n            labelLSTitle.AutoSize = true;\n            labelLSTitle.Location = new Point(56, 13);\n            labelLSTitle.Margin = new Padding(4, 0, 4, 0);\n            labelLSTitle.Name = \"labelLSTitle\";\n            labelLSTitle.Size = new Size(235, 32);\n            labelLSTitle.TabIndex = 17;\n            labelLSTitle.Text = \"Left Stick Deadzones\";\n            // \n            // buttonReset\n            // \n            buttonReset.Activated = false;\n            buttonReset.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;\n            buttonReset.BackColor = SystemColors.ControlLight;\n            buttonReset.BorderColor = Color.Transparent;\n            buttonReset.BorderRadius = 2;\n            buttonReset.FlatStyle = FlatStyle.Flat;\n            buttonReset.Location = new Point(944, 39);\n            buttonReset.Margin = new Padding(4, 2, 4, 2);\n            buttonReset.Name = \"buttonReset\";\n            buttonReset.Secondary = true;\n            buttonReset.Size = new Size(165, 50);\n            buttonReset.TabIndex = 55;\n            buttonReset.Text = \"Reset\";\n            buttonReset.UseVisualStyleBackColor = false;\n            // \n            // panelBindings\n            // \n            panelBindings.Controls.Add(panelBinding);\n            panelBindings.Controls.Add(buttonView);\n            panelBindings.Controls.Add(buttonLS);\n            panelBindings.Controls.Add(buttonLT);\n            panelBindings.Controls.Add(buttonLB);\n            panelBindings.Controls.Add(buttonDPR);\n            panelBindings.Controls.Add(buttonDPL);\n            panelBindings.Controls.Add(buttonDPD);\n            panelBindings.Controls.Add(buttonDPU);\n            panelBindings.Controls.Add(buttonM2);\n            panelBindings.Controls.Add(buttonM1);\n            panelBindings.Controls.Add(buttonRS);\n            panelBindings.Controls.Add(buttonMenu);\n            panelBindings.Controls.Add(buttonRT);\n            panelBindings.Controls.Add(buttonRB);\n            panelBindings.Controls.Add(buttonB);\n            panelBindings.Controls.Add(buttonA);\n            panelBindings.Controls.Add(buttonY);\n            panelBindings.Controls.Add(buttonX);\n            panelBindings.Controls.Add(pictureAlly);\n            panelBindings.Dock = DockStyle.Top;\n            panelBindings.Location = new Point(10, 10);\n            panelBindings.Name = \"panelBindings\";\n            panelBindings.Size = new Size(1123, 517);\n            panelBindings.TabIndex = 1;\n            // \n            // panelBinding\n            // \n            panelBinding.Controls.Add(labelBinding);\n            panelBinding.Controls.Add(labelSecondary);\n            panelBinding.Controls.Add(labelPrimary);\n            panelBinding.Controls.Add(comboSecondary);\n            panelBinding.Controls.Add(comboPrimary);\n            panelBinding.Location = new Point(372, 174);\n            panelBinding.Name = \"panelBinding\";\n            panelBinding.Size = new Size(400, 186);\n            panelBinding.TabIndex = 37;\n            panelBinding.Visible = false;\n            // \n            // labelBinding\n            // \n            labelBinding.AutoSize = true;\n            labelBinding.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold, GraphicsUnit.Point);\n            labelBinding.Location = new Point(2, 11);\n            labelBinding.Name = \"labelBinding\";\n            labelBinding.Size = new Size(183, 32);\n            labelBinding.TabIndex = 31;\n            labelBinding.Text = \"Binding: Menu\";\n            // \n            // labelSecondary\n            // \n            labelSecondary.AutoSize = true;\n            labelSecondary.Location = new Point(2, 122);\n            labelSecondary.Name = \"labelSecondary\";\n            labelSecondary.Size = new Size(125, 32);\n            labelSecondary.TabIndex = 30;\n            labelSecondary.Text = \"Secondary\";\n            // \n            // labelPrimary\n            // \n            labelPrimary.AutoSize = true;\n            labelPrimary.Location = new Point(2, 63);\n            labelPrimary.Name = \"labelPrimary\";\n            labelPrimary.Size = new Size(94, 32);\n            labelPrimary.TabIndex = 29;\n            labelPrimary.Text = \"Primary\";\n            // \n            // comboSecondary\n            // \n            comboSecondary.BorderColor = Color.White;\n            comboSecondary.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboSecondary.FlatStyle = FlatStyle.Flat;\n            comboSecondary.Font = new Font(\"Segoe UI\", 9F, FontStyle.Regular, GraphicsUnit.Point);\n            comboSecondary.FormattingEnabled = true;\n            comboSecondary.ItemHeight = 32;\n            comboSecondary.Location = new Point(133, 121);\n            comboSecondary.Margin = new Padding(4, 11, 4, 8);\n            comboSecondary.Name = \"comboSecondary\";\n            comboSecondary.Size = new Size(254, 40);\n            comboSecondary.TabIndex = 28;\n            // \n            // comboPrimary\n            // \n            comboPrimary.BorderColor = Color.White;\n            comboPrimary.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboPrimary.FlatStyle = FlatStyle.Flat;\n            comboPrimary.Font = new Font(\"Segoe UI\", 9F, FontStyle.Regular, GraphicsUnit.Point);\n            comboPrimary.FormattingEnabled = true;\n            comboPrimary.ItemHeight = 32;\n            comboPrimary.Location = new Point(133, 60);\n            comboPrimary.Margin = new Padding(4, 11, 4, 8);\n            comboPrimary.Name = \"comboPrimary\";\n            comboPrimary.Size = new Size(254, 40);\n            comboPrimary.TabIndex = 27;\n            // \n            // buttonView\n            // \n            buttonView.Activated = false;\n            buttonView.BackColor = SystemColors.ControlLight;\n            buttonView.BorderColor = Color.Transparent;\n            buttonView.BorderRadius = 5;\n            buttonView.FlatAppearance.BorderSize = 0;\n            buttonView.FlatStyle = FlatStyle.Flat;\n            buttonView.ForeColor = SystemColors.ControlText;\n            buttonView.ImageAlign = ContentAlignment.MiddleRight;\n            buttonView.Location = new Point(175, 26);\n            buttonView.Margin = new Padding(4);\n            buttonView.Name = \"buttonView\";\n            buttonView.Secondary = true;\n            buttonView.Size = new Size(147, 55);\n            buttonView.TabIndex = 36;\n            buttonView.Text = \"View\";\n            buttonView.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonView.UseVisualStyleBackColor = false;\n            // \n            // buttonLS\n            // \n            buttonLS.Activated = false;\n            buttonLS.BackColor = SystemColors.ControlLight;\n            buttonLS.BorderColor = Color.Transparent;\n            buttonLS.BorderRadius = 5;\n            buttonLS.FlatAppearance.BorderSize = 0;\n            buttonLS.FlatStyle = FlatStyle.Flat;\n            buttonLS.ForeColor = SystemColors.ControlText;\n            buttonLS.ImageAlign = ContentAlignment.MiddleRight;\n            buttonLS.Location = new Point(20, 403);\n            buttonLS.Margin = new Padding(4);\n            buttonLS.Name = \"buttonLS\";\n            buttonLS.Secondary = true;\n            buttonLS.Size = new Size(147, 55);\n            buttonLS.TabIndex = 35;\n            buttonLS.Text = \"LStick\";\n            buttonLS.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonLS.UseVisualStyleBackColor = false;\n            // \n            // buttonLT\n            // \n            buttonLT.Activated = false;\n            buttonLT.BackColor = SystemColors.ControlLight;\n            buttonLT.BorderColor = Color.Transparent;\n            buttonLT.BorderRadius = 5;\n            buttonLT.FlatAppearance.BorderSize = 0;\n            buttonLT.FlatStyle = FlatStyle.Flat;\n            buttonLT.ForeColor = SystemColors.ControlText;\n            buttonLT.ImageAlign = ContentAlignment.MiddleRight;\n            buttonLT.Location = new Point(20, 88);\n            buttonLT.Margin = new Padding(4);\n            buttonLT.Name = \"buttonLT\";\n            buttonLT.Secondary = true;\n            buttonLT.Size = new Size(147, 55);\n            buttonLT.TabIndex = 34;\n            buttonLT.Text = \"LTrigger\";\n            buttonLT.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonLT.UseVisualStyleBackColor = false;\n            // \n            // buttonLB\n            // \n            buttonLB.Activated = false;\n            buttonLB.BackColor = SystemColors.ControlLight;\n            buttonLB.BorderColor = Color.Transparent;\n            buttonLB.BorderRadius = 5;\n            buttonLB.FlatAppearance.BorderSize = 0;\n            buttonLB.FlatStyle = FlatStyle.Flat;\n            buttonLB.ForeColor = SystemColors.ControlText;\n            buttonLB.ImageAlign = ContentAlignment.MiddleRight;\n            buttonLB.Location = new Point(20, 25);\n            buttonLB.Margin = new Padding(4);\n            buttonLB.Name = \"buttonLB\";\n            buttonLB.Secondary = true;\n            buttonLB.Size = new Size(147, 55);\n            buttonLB.TabIndex = 33;\n            buttonLB.Text = \"LBumper\";\n            buttonLB.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonLB.UseVisualStyleBackColor = false;\n            // \n            // buttonDPR\n            // \n            buttonDPR.Activated = false;\n            buttonDPR.BackColor = SystemColors.ControlLight;\n            buttonDPR.BorderColor = Color.Transparent;\n            buttonDPR.BorderRadius = 5;\n            buttonDPR.FlatAppearance.BorderSize = 0;\n            buttonDPR.FlatStyle = FlatStyle.Flat;\n            buttonDPR.ForeColor = SystemColors.ControlText;\n            buttonDPR.ImageAlign = ContentAlignment.MiddleRight;\n            buttonDPR.Location = new Point(20, 340);\n            buttonDPR.Margin = new Padding(4);\n            buttonDPR.Name = \"buttonDPR\";\n            buttonDPR.Secondary = true;\n            buttonDPR.Size = new Size(147, 55);\n            buttonDPR.TabIndex = 32;\n            buttonDPR.Text = \"DpadRight\";\n            buttonDPR.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonDPR.UseVisualStyleBackColor = false;\n            // \n            // buttonDPL\n            // \n            buttonDPL.Activated = false;\n            buttonDPL.BackColor = SystemColors.ControlLight;\n            buttonDPL.BorderColor = Color.Transparent;\n            buttonDPL.BorderRadius = 5;\n            buttonDPL.FlatAppearance.BorderSize = 0;\n            buttonDPL.FlatStyle = FlatStyle.Flat;\n            buttonDPL.ForeColor = SystemColors.ControlText;\n            buttonDPL.ImageAlign = ContentAlignment.MiddleRight;\n            buttonDPL.Location = new Point(20, 277);\n            buttonDPL.Margin = new Padding(4);\n            buttonDPL.Name = \"buttonDPL\";\n            buttonDPL.Secondary = true;\n            buttonDPL.Size = new Size(147, 55);\n            buttonDPL.TabIndex = 31;\n            buttonDPL.Text = \"DpadLeft\";\n            buttonDPL.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonDPL.UseVisualStyleBackColor = false;\n            // \n            // buttonDPD\n            // \n            buttonDPD.Activated = false;\n            buttonDPD.BackColor = SystemColors.ControlLight;\n            buttonDPD.BorderColor = Color.Transparent;\n            buttonDPD.BorderRadius = 5;\n            buttonDPD.FlatAppearance.BorderSize = 0;\n            buttonDPD.FlatStyle = FlatStyle.Flat;\n            buttonDPD.ForeColor = SystemColors.ControlText;\n            buttonDPD.ImageAlign = ContentAlignment.MiddleRight;\n            buttonDPD.Location = new Point(20, 214);\n            buttonDPD.Margin = new Padding(4);\n            buttonDPD.Name = \"buttonDPD\";\n            buttonDPD.Secondary = true;\n            buttonDPD.Size = new Size(147, 55);\n            buttonDPD.TabIndex = 30;\n            buttonDPD.Text = \"DpadDown\";\n            buttonDPD.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonDPD.UseVisualStyleBackColor = false;\n            // \n            // buttonDPU\n            // \n            buttonDPU.Activated = false;\n            buttonDPU.BackColor = SystemColors.ControlLight;\n            buttonDPU.BorderColor = Color.Transparent;\n            buttonDPU.BorderRadius = 5;\n            buttonDPU.FlatAppearance.BorderSize = 0;\n            buttonDPU.FlatStyle = FlatStyle.Flat;\n            buttonDPU.ForeColor = SystemColors.ControlText;\n            buttonDPU.ImageAlign = ContentAlignment.MiddleRight;\n            buttonDPU.Location = new Point(20, 151);\n            buttonDPU.Margin = new Padding(4);\n            buttonDPU.Name = \"buttonDPU\";\n            buttonDPU.Secondary = true;\n            buttonDPU.Size = new Size(147, 55);\n            buttonDPU.TabIndex = 29;\n            buttonDPU.Text = \"DpadUp\";\n            buttonDPU.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonDPU.UseVisualStyleBackColor = false;\n            // \n            // buttonM2\n            // \n            buttonM2.Activated = false;\n            buttonM2.BackColor = SystemColors.ControlLight;\n            buttonM2.BorderColor = Color.Transparent;\n            buttonM2.BorderRadius = 5;\n            buttonM2.FlatAppearance.BorderSize = 0;\n            buttonM2.FlatStyle = FlatStyle.Flat;\n            buttonM2.ForeColor = SystemColors.ControlText;\n            buttonM2.ImageAlign = ContentAlignment.MiddleRight;\n            buttonM2.Location = new Point(330, 26);\n            buttonM2.Margin = new Padding(4);\n            buttonM2.Name = \"buttonM2\";\n            buttonM2.Secondary = true;\n            buttonM2.Size = new Size(147, 55);\n            buttonM2.TabIndex = 28;\n            buttonM2.Text = \"M2\";\n            buttonM2.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonM2.UseVisualStyleBackColor = false;\n            // \n            // buttonM1\n            // \n            buttonM1.Activated = false;\n            buttonM1.BackColor = SystemColors.ControlLight;\n            buttonM1.BorderColor = Color.Transparent;\n            buttonM1.BorderRadius = 5;\n            buttonM1.FlatAppearance.BorderSize = 0;\n            buttonM1.FlatStyle = FlatStyle.Flat;\n            buttonM1.ForeColor = SystemColors.ControlText;\n            buttonM1.ImageAlign = ContentAlignment.MiddleRight;\n            buttonM1.Location = new Point(650, 26);\n            buttonM1.Margin = new Padding(4);\n            buttonM1.Name = \"buttonM1\";\n            buttonM1.Secondary = true;\n            buttonM1.Size = new Size(147, 55);\n            buttonM1.TabIndex = 27;\n            buttonM1.Text = \"M1\";\n            buttonM1.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonM1.UseVisualStyleBackColor = false;\n            // \n            // buttonRS\n            // \n            buttonRS.Activated = false;\n            buttonRS.BackColor = SystemColors.ControlLight;\n            buttonRS.BorderColor = Color.Transparent;\n            buttonRS.BorderRadius = 5;\n            buttonRS.FlatAppearance.BorderSize = 0;\n            buttonRS.FlatStyle = FlatStyle.Flat;\n            buttonRS.ForeColor = SystemColors.ControlText;\n            buttonRS.ImageAlign = ContentAlignment.MiddleRight;\n            buttonRS.Location = new Point(962, 403);\n            buttonRS.Margin = new Padding(4);\n            buttonRS.Name = \"buttonRS\";\n            buttonRS.Secondary = true;\n            buttonRS.Size = new Size(147, 55);\n            buttonRS.TabIndex = 23;\n            buttonRS.Text = \"RStick\";\n            buttonRS.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonRS.UseVisualStyleBackColor = false;\n            // \n            // buttonMenu\n            // \n            buttonMenu.Activated = false;\n            buttonMenu.BackColor = SystemColors.ControlLight;\n            buttonMenu.BorderColor = Color.Transparent;\n            buttonMenu.BorderRadius = 5;\n            buttonMenu.FlatAppearance.BorderSize = 0;\n            buttonMenu.FlatStyle = FlatStyle.Flat;\n            buttonMenu.ForeColor = SystemColors.ControlText;\n            buttonMenu.ImageAlign = ContentAlignment.MiddleRight;\n            buttonMenu.Location = new Point(805, 26);\n            buttonMenu.Margin = new Padding(4);\n            buttonMenu.Name = \"buttonMenu\";\n            buttonMenu.Secondary = true;\n            buttonMenu.Size = new Size(147, 55);\n            buttonMenu.TabIndex = 22;\n            buttonMenu.Text = \"Menu\";\n            buttonMenu.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonMenu.UseVisualStyleBackColor = false;\n            // \n            // buttonRT\n            // \n            buttonRT.Activated = false;\n            buttonRT.BackColor = SystemColors.ControlLight;\n            buttonRT.BorderColor = Color.Transparent;\n            buttonRT.BorderRadius = 5;\n            buttonRT.FlatAppearance.BorderSize = 0;\n            buttonRT.FlatStyle = FlatStyle.Flat;\n            buttonRT.ForeColor = SystemColors.ControlText;\n            buttonRT.ImageAlign = ContentAlignment.MiddleRight;\n            buttonRT.Location = new Point(962, 88);\n            buttonRT.Margin = new Padding(4);\n            buttonRT.Name = \"buttonRT\";\n            buttonRT.Secondary = true;\n            buttonRT.Size = new Size(147, 55);\n            buttonRT.TabIndex = 21;\n            buttonRT.Text = \"RTrigger\";\n            buttonRT.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonRT.UseVisualStyleBackColor = false;\n            // \n            // buttonRB\n            // \n            buttonRB.Activated = false;\n            buttonRB.BackColor = SystemColors.ControlLight;\n            buttonRB.BorderColor = Color.Transparent;\n            buttonRB.BorderRadius = 5;\n            buttonRB.FlatAppearance.BorderSize = 0;\n            buttonRB.FlatStyle = FlatStyle.Flat;\n            buttonRB.ForeColor = SystemColors.ControlText;\n            buttonRB.ImageAlign = ContentAlignment.MiddleRight;\n            buttonRB.Location = new Point(962, 25);\n            buttonRB.Margin = new Padding(4);\n            buttonRB.Name = \"buttonRB\";\n            buttonRB.Secondary = true;\n            buttonRB.Size = new Size(147, 55);\n            buttonRB.TabIndex = 20;\n            buttonRB.Text = \"RBumper\";\n            buttonRB.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonRB.UseVisualStyleBackColor = false;\n            // \n            // buttonB\n            // \n            buttonB.Activated = false;\n            buttonB.BackColor = SystemColors.ControlLight;\n            buttonB.BorderColor = Color.Transparent;\n            buttonB.BorderRadius = 5;\n            buttonB.FlatAppearance.BorderSize = 0;\n            buttonB.FlatStyle = FlatStyle.Flat;\n            buttonB.ForeColor = SystemColors.ControlText;\n            buttonB.ImageAlign = ContentAlignment.MiddleRight;\n            buttonB.Location = new Point(962, 340);\n            buttonB.Margin = new Padding(4);\n            buttonB.Name = \"buttonB\";\n            buttonB.Secondary = true;\n            buttonB.Size = new Size(147, 55);\n            buttonB.TabIndex = 19;\n            buttonB.Text = \"B\";\n            buttonB.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonB.UseVisualStyleBackColor = false;\n            // \n            // buttonA\n            // \n            buttonA.Activated = false;\n            buttonA.BackColor = SystemColors.ControlLight;\n            buttonA.BorderColor = Color.Transparent;\n            buttonA.BorderRadius = 5;\n            buttonA.FlatAppearance.BorderSize = 0;\n            buttonA.FlatStyle = FlatStyle.Flat;\n            buttonA.ForeColor = SystemColors.ControlText;\n            buttonA.ImageAlign = ContentAlignment.MiddleRight;\n            buttonA.Location = new Point(962, 277);\n            buttonA.Margin = new Padding(4);\n            buttonA.Name = \"buttonA\";\n            buttonA.Secondary = true;\n            buttonA.Size = new Size(147, 55);\n            buttonA.TabIndex = 18;\n            buttonA.Text = \"A\";\n            buttonA.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonA.UseVisualStyleBackColor = false;\n            // \n            // buttonY\n            // \n            buttonY.Activated = false;\n            buttonY.BackColor = SystemColors.ControlLight;\n            buttonY.BorderColor = Color.Transparent;\n            buttonY.BorderRadius = 5;\n            buttonY.FlatAppearance.BorderSize = 0;\n            buttonY.FlatStyle = FlatStyle.Flat;\n            buttonY.ForeColor = SystemColors.ControlText;\n            buttonY.ImageAlign = ContentAlignment.MiddleRight;\n            buttonY.Location = new Point(962, 214);\n            buttonY.Margin = new Padding(4);\n            buttonY.Name = \"buttonY\";\n            buttonY.Secondary = true;\n            buttonY.Size = new Size(147, 55);\n            buttonY.TabIndex = 17;\n            buttonY.Text = \"Y\";\n            buttonY.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonY.UseVisualStyleBackColor = false;\n            // \n            // buttonX\n            // \n            buttonX.Activated = false;\n            buttonX.BackColor = SystemColors.ControlLight;\n            buttonX.BorderColor = Color.Transparent;\n            buttonX.BorderRadius = 5;\n            buttonX.FlatAppearance.BorderSize = 0;\n            buttonX.FlatStyle = FlatStyle.Flat;\n            buttonX.ForeColor = SystemColors.ControlText;\n            buttonX.ImageAlign = ContentAlignment.MiddleRight;\n            buttonX.Location = new Point(962, 151);\n            buttonX.Margin = new Padding(4);\n            buttonX.Name = \"buttonX\";\n            buttonX.Secondary = true;\n            buttonX.Size = new Size(147, 55);\n            buttonX.TabIndex = 16;\n            buttonX.Text = \"X\";\n            buttonX.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonX.UseVisualStyleBackColor = false;\n            // \n            // pictureAlly\n            // \n            pictureAlly.BackgroundImage = Properties.Resources.ally;\n            pictureAlly.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureAlly.Location = new Point(185, 97);\n            pictureAlly.Name = \"pictureAlly\";\n            pictureAlly.Size = new Size(767, 354);\n            pictureAlly.TabIndex = 0;\n            pictureAlly.TabStop = false;\n            // \n            // panelVibra\n            // \n            panelVibra.AutoSize = true;\n            panelVibra.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelVibra.Controls.Add(checkController);\n            panelVibra.Controls.Add(buttonReset);\n            panelVibra.Controls.Add(pictureBox5);\n            panelVibra.Controls.Add(labelVibra);\n            panelVibra.Controls.Add(labelVibraTitle);\n            panelVibra.Controls.Add(trackVibra);\n            panelVibra.Dock = DockStyle.Top;\n            panelVibra.Location = new Point(10, 785);\n            panelVibra.Margin = new Padding(4);\n            panelVibra.MaximumSize = new Size(0, 124);\n            panelVibra.Name = \"panelVibra\";\n            panelVibra.Size = new Size(1123, 124);\n            panelVibra.TabIndex = 47;\n            // \n            // checkController\n            // \n            checkController.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;\n            checkController.AutoSize = true;\n            checkController.BackColor = SystemColors.ControlLight;\n            checkController.Location = new Point(650, 41);\n            checkController.Margin = new Padding(0);\n            checkController.Name = \"checkController\";\n            checkController.Padding = new Padding(16, 6, 16, 6);\n            checkController.Size = new Size(269, 48);\n            checkController.TabIndex = 56;\n            checkController.Text = \"Disable Controller\";\n            checkController.UseVisualStyleBackColor = false;\n            // \n            // pictureBox5\n            // \n            pictureBox5.BackgroundImage = Properties.Resources.icons8_soonvibes_32;\n            pictureBox5.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureBox5.ErrorImage = null;\n            pictureBox5.InitialImage = null;\n            pictureBox5.Location = new Point(13, 14);\n            pictureBox5.Margin = new Padding(4, 2, 4, 10);\n            pictureBox5.Name = \"pictureBox5\";\n            pictureBox5.Size = new Size(32, 32);\n            pictureBox5.TabIndex = 45;\n            pictureBox5.TabStop = false;\n            // \n            // labelVibra\n            // \n            labelVibra.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold, GraphicsUnit.Point);\n            labelVibra.Location = new Point(408, 14);\n            labelVibra.Margin = new Padding(4, 0, 4, 0);\n            labelVibra.Name = \"labelVibra\";\n            labelVibra.Size = new Size(124, 32);\n            labelVibra.TabIndex = 44;\n            labelVibra.Text = \"100%\";\n            labelVibra.TextAlign = ContentAlignment.TopRight;\n            // \n            // labelVibraTitle\n            // \n            labelVibraTitle.AutoSize = true;\n            labelVibraTitle.Location = new Point(54, 14);\n            labelVibraTitle.Margin = new Padding(4, 0, 4, 0);\n            labelVibraTitle.Name = \"labelVibraTitle\";\n            labelVibraTitle.Size = new Size(209, 32);\n            labelVibraTitle.TabIndex = 43;\n            labelVibraTitle.Text = \"Vibration Strength\";\n            // \n            // trackVibra\n            // \n            trackVibra.Location = new Point(6, 48);\n            trackVibra.Margin = new Padding(4, 2, 4, 2);\n            trackVibra.Maximum = 100;\n            trackVibra.Name = \"trackVibra\";\n            trackVibra.Size = new Size(546, 90);\n            trackVibra.TabIndex = 42;\n            trackVibra.TickFrequency = 5;\n            trackVibra.TickStyle = TickStyle.TopLeft;\n            trackVibra.Value = 100;\n            // \n            // Handheld\n            // \n            AutoScaleDimensions = new SizeF(13F, 32F);\n            AutoScaleMode = AutoScaleMode.Font;\n            AutoSize = true;\n            ClientSize = new Size(1143, 912);\n            Controls.Add(panelVibra);\n            Controls.Add(panelDeadzones);\n            Controls.Add(panelBindings);\n            MaximizeBox = false;\n            MinimizeBox = false;\n            Name = \"Handheld\";\n            Padding = new Padding(10);\n            ShowIcon = false;\n            ShowInTaskbar = false;\n            Text = \"Controller\";\n            panelDeadzones.ResumeLayout(false);\n            panelDeadzones.PerformLayout();\n            panelRight.ResumeLayout(false);\n            panelRight.PerformLayout();\n            panelRT.ResumeLayout(false);\n            panelRT.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureBox4).EndInit();\n            ((System.ComponentModel.ISupportInitialize)trackRTMax).EndInit();\n            ((System.ComponentModel.ISupportInitialize)trackRTMin).EndInit();\n            panelRS.ResumeLayout(false);\n            panelRS.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit();\n            ((System.ComponentModel.ISupportInitialize)trackRSMax).EndInit();\n            ((System.ComponentModel.ISupportInitialize)trackRSMin).EndInit();\n            panelLeft.ResumeLayout(false);\n            panelLeft.PerformLayout();\n            panelLT.ResumeLayout(false);\n            panelLT.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureBox2).EndInit();\n            ((System.ComponentModel.ISupportInitialize)trackLTMax).EndInit();\n            ((System.ComponentModel.ISupportInitialize)trackLTMin).EndInit();\n            panelLS.ResumeLayout(false);\n            panelLS.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureBox3).EndInit();\n            ((System.ComponentModel.ISupportInitialize)trackLSMax).EndInit();\n            ((System.ComponentModel.ISupportInitialize)trackLSMin).EndInit();\n            panelBindings.ResumeLayout(false);\n            panelBinding.ResumeLayout(false);\n            panelBinding.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureAlly).EndInit();\n            panelVibra.ResumeLayout(false);\n            panelVibra.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureBox5).EndInit();\n            ((System.ComponentModel.ISupportInitialize)trackVibra).EndInit();\n            ResumeLayout(false);\n            PerformLayout();\n        }\n\n        #endregion\n\n        private Panel panelDeadzones;\n        private Panel panelRight;\n        private Panel panelRT;\n        private PictureBox pictureBox4;\n        private TrackBar trackRTMax;\n        private Label labelRT;\n        private TrackBar trackRTMin;\n        private Label labelRTTitle;\n        private Panel panelRS;\n        private PictureBox pictureBox1;\n        private TrackBar trackRSMax;\n        private Label labelRS;\n        private TrackBar trackRSMin;\n        private Label labelRSTitle;\n        private Panel panelLeft;\n        private Panel panelLT;\n        private PictureBox pictureBox2;\n        private TrackBar trackLTMax;\n        private Label labelLT;\n        private TrackBar trackLTMin;\n        private Label labelLTTitle;\n        private Panel panelLS;\n        private PictureBox pictureBox3;\n        private TrackBar trackLSMax;\n        private Label labelLS;\n        private TrackBar trackLSMin;\n        private Label labelLSTitle;\n        private Panel panelBindings;\n        private PictureBox pictureAlly;\n        private UI.RButton buttonX;\n        private UI.RButton buttonRS;\n        private UI.RButton buttonMenu;\n        private UI.RButton buttonRT;\n        private UI.RButton buttonRB;\n        private UI.RButton buttonB;\n        private UI.RButton buttonA;\n        private UI.RButton buttonY;\n        private UI.RButton buttonM1;\n        private UI.RButton buttonM2;\n        private UI.RButton buttonLS;\n        private UI.RButton buttonLT;\n        private UI.RButton buttonLB;\n        private UI.RButton buttonDPR;\n        private UI.RButton buttonDPL;\n        private UI.RButton buttonDPD;\n        private UI.RButton buttonDPU;\n        private UI.RButton buttonView;\n        private UI.RButton buttonReset;\n        private Panel panelBinding;\n        private Label labelBinding;\n        private Label labelSecondary;\n        private Label labelPrimary;\n        private UI.RComboBox comboSecondary;\n        private UI.RComboBox comboPrimary;\n        private Panel panelVibra;\n        private PictureBox pictureBox5;\n        private Label labelVibra;\n        private Label labelVibraTitle;\n        private TrackBar trackVibra;\n        private UI.RCheckBox checkController;\n    }\n}"
  },
  {
    "path": "app/Handheld.cs",
    "content": "﻿using GHelper.Ally;\nusing GHelper.UI;\n\nnamespace GHelper\n{\n    public partial class Handheld : RForm\n    {\n\n        static string activeBinding = \"\";\n        static RButton? activeButton;\n\n        public Handheld()\n        {\n            InitializeComponent();\n            InitTheme(true);\n\n            Text = Properties.Strings.Controller;\n\n            labelLSTitle.Text = Properties.Strings.LSDeadzones;\n            labelRSTitle.Text = Properties.Strings.RSDeadzones;\n            labelLTTitle.Text = Properties.Strings.LTDeadzones;\n            labelRTTitle.Text = Properties.Strings.RTDeadzones;\n            labelVibraTitle.Text = Properties.Strings.VibrationStrength;\n            checkController.Text = Properties.Strings.DisableController;\n            buttonReset.Text = Properties.Strings.Reset;\n\n            labelPrimary.Text = Properties.Strings.BindingPrimary;\n            labelSecondary.Text = Properties.Strings.BindingSecondary;\n\n            Shown += Handheld_Shown;\n\n            Init();\n\n            trackLSMin.Scroll += Controller_Scroll;\n            trackLSMax.Scroll += Controller_Scroll;\n            trackRSMin.Scroll += Controller_Scroll;\n            trackRSMax.Scroll += Controller_Scroll;\n\n            trackLTMin.Scroll += Controller_Scroll;\n            trackLTMax.Scroll += Controller_Scroll;\n            trackRTMin.Scroll += Controller_Scroll;\n            trackRTMax.Scroll += Controller_Scroll;\n\n            trackVibra.Scroll += Controller_Scroll;\n\n            buttonReset.Click += ButtonReset_Click;\n\n            trackLSMin.ValueChanged += Controller_Complete;\n            trackLSMax.ValueChanged += Controller_Complete;\n            trackRSMin.ValueChanged += Controller_Complete;\n            trackRSMax.ValueChanged += Controller_Complete;\n\n            trackLTMin.ValueChanged += Controller_Complete;\n            trackLTMax.ValueChanged += Controller_Complete;\n            trackRTMin.ValueChanged += Controller_Complete;\n            trackRTMax.ValueChanged += Controller_Complete;\n\n            trackVibra.ValueChanged += Controller_Complete;\n\n            ButtonBinding(\"m1\", \"M1\", buttonM1);\n            ButtonBinding(\"m2\", \"M2\", buttonM2);\n\n            ButtonBinding(\"a\", \"A\", buttonA);\n            ButtonBinding(\"b\", \"B\", buttonB);\n            ButtonBinding(\"x\", \"X\", buttonX);\n            ButtonBinding(\"y\", \"Y\", buttonY);\n\n            ButtonBinding(\"du\", \"DPad Up\", buttonDPU);\n            ButtonBinding(\"dd\", \"DPad Down\", buttonDPD);\n\n            ButtonBinding(\"dl\", \"DPad Left\", buttonDPL);\n            ButtonBinding(\"dr\", \"DPad Right\", buttonDPR);\n\n            ButtonBinding(\"rt\", \"Right Trigger\", buttonRT);\n            ButtonBinding(\"lt\", \"Left Trigger\", buttonLT);\n\n            ButtonBinding(\"rb\", \"Right Bumper\", buttonRB);\n            ButtonBinding(\"lb\", \"Left Bumper\", buttonLB);\n\n            ButtonBinding(\"rs\", \"Right Stick\", buttonRS);\n            ButtonBinding(\"ll\", \"Left Stick\", buttonLS);\n\n            ButtonBinding(\"vb\", \"View\", buttonView);\n            ButtonBinding(\"mb\", \"Menu\", buttonMenu);\n\n            ComboBinding(comboPrimary);\n            ComboBinding(comboSecondary);\n\n            checkController.Checked = AppConfig.Is(\"controller_disabled\");\n            checkController.CheckedChanged += CheckController_CheckedChanged;\n\n        }\n\n        private void CheckController_CheckedChanged(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"controller_disabled\", checkController.Checked ? 1 : 0);\n            AllyControl.DisableXBoxController(checkController.Checked);\n        }\n\n        private void ComboBinding(RComboBox combo)\n        {\n\n            combo.DropDownStyle = ComboBoxStyle.DropDownList;\n            combo.DisplayMember = \"Value\";\n            combo.ValueMember = \"Key\";\n            foreach (var item in AllyControl.BindCodes)\n                combo.Items.Add(new KeyValuePair<string, string>(item.Key, item.Value));\n\n            combo.SelectedValueChanged += Binding_SelectedValueChanged;\n\n        }\n\n        private void Binding_SelectedValueChanged(object? sender, EventArgs e)\n        {\n            if (sender is null) return;\n            RComboBox combo = (RComboBox)sender;\n\n            string value = ((KeyValuePair<string, string>)combo.SelectedItem).Key;\n            string binding = \"bind\" + (combo.Name == \"comboPrimary\" ? \"\" : \"2\") + \"_\" + activeBinding;\n\n            if (value != \"\") AppConfig.Set(binding, value);\n            else AppConfig.Remove(binding);\n\n            VisualiseButton(activeButton, activeBinding);\n\n            AllyControl.ApplyMode();\n        }\n\n        private void SetComboValue(RComboBox combo, string value)\n        {\n            foreach (var item in AllyControl.BindCodes)\n                if (item.Key == value)\n                {\n                    combo.SelectedItem = item;\n                    return;\n                }\n\n            combo.SelectedIndex = 0;\n        }\n\n        private void VisualiseButton(RButton button, string binding)\n        {\n            if (button == null) return;\n\n            string primary = AppConfig.GetString(\"bind_\" + binding, \"\");\n            string secondary = AppConfig.GetString(\"bind2_\" + binding, \"\");\n\n            if (primary != \"\" || secondary != \"\")\n            {\n                button.BorderColor = colorStandard;\n                button.Activated = true;\n            }\n            else\n            {\n                button.Activated = false;\n            }\n        }\n\n        private void ButtonBinding(string binding, string label, RButton button)\n        {\n            button.Click += (sender, EventArgs) => { buttonBinding_Click(sender, EventArgs, binding, label); };\n            VisualiseButton(button, binding);\n        }\n\n        void buttonBinding_Click(object sender, EventArgs e, string binding, string label)\n        {\n\n            if (sender is null) return;\n            RButton button = (RButton)sender;\n\n            panelBinding.Visible = true;\n\n            activeButton = button;\n            activeBinding = binding;\n\n            labelBinding.Text = Properties.Strings.Binding + \": \" + label;\n\n            SetComboValue(comboPrimary, AppConfig.GetString(\"bind_\" + binding, \"\"));\n            SetComboValue(comboSecondary, AppConfig.GetString(\"bind2_\" + binding, \"\"));\n\n        }\n\n\n\n        private void Controller_Complete(object? sender, EventArgs e)\n        {\n            AllyControl.SetDeadzones();\n        }\n\n        private void ButtonReset_Click(object? sender, EventArgs e)\n        {\n            trackLSMin.Value = 0;\n            trackLSMax.Value = 100;\n            trackRSMin.Value = 0;\n            trackRSMax.Value = 100;\n\n            trackLTMin.Value = 0;\n            trackLTMax.Value = 100;\n            trackRTMin.Value = 0;\n            trackRTMax.Value = 100;\n\n            trackVibra.Value = 100;\n\n            AppConfig.Remove(\"ls_min\");\n            AppConfig.Remove(\"ls_max\");\n            AppConfig.Remove(\"rs_min\");\n            AppConfig.Remove(\"rs_max\");\n\n            AppConfig.Remove(\"lt_min\");\n            AppConfig.Remove(\"lt_max\");\n            AppConfig.Remove(\"rt_min\");\n            AppConfig.Remove(\"rt_max\");\n            AppConfig.Remove(\"vibra\");\n\n            VisualiseController();\n\n        }\n\n        private void Init()\n        {\n            trackLSMin.Value = AppConfig.Get(\"ls_min\", 0);\n            trackLSMax.Value = AppConfig.Get(\"ls_max\", 100);\n            trackRSMin.Value = AppConfig.Get(\"rs_min\", 0);\n            trackRSMax.Value = AppConfig.Get(\"rs_max\", 100);\n\n            trackLTMin.Value = AppConfig.Get(\"lt_min\", 0);\n            trackLTMax.Value = AppConfig.Get(\"lt_max\", 100);\n            trackRTMin.Value = AppConfig.Get(\"rt_min\", 0);\n            trackRTMax.Value = AppConfig.Get(\"rt_max\", 100);\n\n            trackVibra.Value = AppConfig.Get(\"vibra\", 100);\n\n            VisualiseController();\n        }\n\n        private void VisualiseController()\n        {\n            labelLS.Text = $\"{trackLSMin.Value} - {trackLSMax.Value}%\";\n            labelRS.Text = $\"{trackRSMin.Value} - {trackRSMax.Value}%\";\n\n            labelLT.Text = $\"{trackLTMin.Value} - {trackLTMax.Value}%\";\n            labelRT.Text = $\"{trackRTMin.Value} - {trackRTMax.Value}%\";\n\n            labelVibra.Text = $\"{trackVibra.Value}%\";\n        }\n\n        private void Controller_Scroll(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"ls_min\", trackLSMin.Value);\n            AppConfig.Set(\"ls_max\", trackLSMax.Value);\n            AppConfig.Set(\"rs_min\", trackRSMin.Value);\n            AppConfig.Set(\"rs_max\", trackRSMax.Value);\n\n            AppConfig.Set(\"lt_min\", trackLTMin.Value);\n            AppConfig.Set(\"lt_max\", trackLTMax.Value);\n            AppConfig.Set(\"rt_min\", trackRTMin.Value);\n            AppConfig.Set(\"rt_max\", trackRTMax.Value);\n\n            AppConfig.Set(\"vibra\", trackVibra.Value);\n\n            VisualiseController();\n\n        }\n\n        private void Handheld_Shown(object? sender, EventArgs e)\n        {\n            Height = Program.settingsForm.Height;\n            Top = Program.settingsForm.Top;\n            Left = Program.settingsForm.Left - Width - 5;\n        }\n\n    }\n}\n"
  },
  {
    "path": "app/Handheld.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!--\n    Microsoft ResX Schema \n\n    Version 2.0\n\n    The primary goals of this format is to allow a simple XML format\n    that is mostly human readable. The generation and parsing of the\n    various data types are done through the TypeConverter classes\n    associated with the data types.\n\n    Example:\n\n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n\n    There are any number of \"resheader\" rows that contain simple\n    name/value pairs.\n\n    Each data row contains a name, and value. The row also contains a\n    type or mimetype. Type corresponds to a .NET class that support\n    text/value conversion through the TypeConverter architecture.\n    Classes that don't support this are serialized and stored with the\n    mimetype set.\n\n    The mimetype is used for serialized objects, and tells the\n    ResXResourceReader how to depersist the object. This is currently not\n    extensible. For a given mimetype the value must be set accordingly:\n\n    Note - application/x-microsoft.net.object.binary.base64 is the format\n    that the ResXResourceWriter will generate, however the reader can\n    read any of the formats listed below.\n\n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array\n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "app/HardwareControl.cs",
    "content": "﻿using GHelper;\nusing GHelper.Battery;\nusing GHelper.Fan;\nusing GHelper.Gpu;\nusing GHelper.Gpu.AMD;\nusing GHelper.Gpu.NVidia;\nusing GHelper.Helpers;\nusing System.Diagnostics;\nusing System.Management;\n\npublic static class HardwareControl\n{\n\n    public static IGpuControl? GpuControl;\n\n    public static float? cpuTemp = -1;\n    public static float? gpuTemp = -1;\n\n    public static decimal? batteryRate = 0;\n    public static decimal batteryHealth = -1;\n    public static decimal batteryCapacity = -1;\n\n    public static decimal? designCapacity;\n    public static decimal? fullCapacity;\n    public static decimal? chargeCapacity;\n\n    public static string? batteryCharge;\n\n    public static string? cpuFan;\n    public static string? gpuFan;\n    public static string? midFan;\n\n    public static int? gpuUse;\n\n    static long lastUpdate;\n    static bool isPZ13 = AppConfig.IsPZ13();\n\n    static bool _chargeWatt = AppConfig.Is(\"charge_watt\");\n    public static bool chargeWatt\n    {\n        get\n        {\n            return _chargeWatt;\n        }\n        set\n        {\n            AppConfig.Set(\"charge_watt\", value ? 1 : 0);\n            _chargeWatt = value;\n        }\n    }\n\n    private static int GetGpuUse()\n    {\n        try\n        {\n            int? gpuUse = GpuControl?.GetGpuUse();\n            Logger.WriteLine(\"GPU usage: \" + GpuControl?.FullName + \" \" + gpuUse + \"%\");\n            if (gpuUse is not null) return (int)gpuUse;\n        }\n        catch (Exception ex)\n        {\n            Debug.WriteLine(ex.ToString());\n        }\n\n        return 0;\n    }\n\n\n    public static void GetBatteryStatus()\n    {\n\n        batteryRate = 0;\n        chargeCapacity = 0;\n\n        try\n        {\n            ManagementScope scope = new ManagementScope(\"root\\\\WMI\");\n            ObjectQuery query = new ObjectQuery(\"SELECT * FROM BatteryStatus\");\n\n            using ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);\n            foreach (ManagementObject obj in searcher.Get().Cast<ManagementObject>())\n            {\n\n                chargeCapacity = Convert.ToDecimal(obj[\"RemainingCapacity\"]);\n\n                decimal? discharge = Program.acpi.GetBatteryDischarge();\n                if (discharge is not null)\n                {\n                    batteryRate = discharge;\n                    return;\n                }\n\n                decimal chargeRate = Convert.ToDecimal(obj[\"ChargeRate\"]);\n                decimal dischargeRate = Convert.ToDecimal(obj[\"DischargeRate\"]);\n\n                if (chargeRate > 0)\n                    batteryRate = chargeRate / 1000;\n                else\n                    batteryRate = -dischargeRate / 1000;\n\n            }\n\n        }\n        catch (Exception ex)\n        {\n            Debug.WriteLine(\"Discharge Reading: \" + ex.Message);\n        }\n\n    }\n    public static void ReadFullChargeCapacity()\n    {\n        if (fullCapacity > 0) return;\n\n        try\n        {\n            ManagementScope scope = new ManagementScope(\"root\\\\WMI\");\n            ObjectQuery query = new ObjectQuery(\"SELECT * FROM BatteryFullChargedCapacity\");\n\n            using ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);\n            foreach (ManagementObject obj in searcher.Get().Cast<ManagementObject>())\n            {\n                fullCapacity = Convert.ToDecimal(obj[\"FullChargedCapacity\"]);\n            }\n\n        }\n        catch (Exception ex)\n        {\n            Debug.WriteLine(\"Full Charge Reading: \" + ex.Message);\n        }\n\n    }\n\n    public static void ReadDesignCapacity()\n    {\n        if (designCapacity > 0) return;\n\n        try\n        {\n            ManagementScope scope = new ManagementScope(\"root\\\\WMI\");\n            ObjectQuery query = new ObjectQuery(\"SELECT * FROM BatteryStaticData\");\n\n            using ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);\n            foreach (ManagementObject obj in searcher.Get().Cast<ManagementObject>())\n            {\n                designCapacity = Convert.ToDecimal(obj[\"DesignedCapacity\"]);\n            }\n\n        }\n        catch (Exception ex)\n        {\n            Debug.WriteLine(\"Design Capacity Reading: \" + ex.Message);\n        }\n    }\n\n    public static void RefreshBatteryHealth()\n    {\n        batteryHealth = GetBatteryHealth() * 100;\n    }\n\n\n    public static decimal GetBatteryHealth()\n    {\n        if (designCapacity is null)\n        {\n            ReadDesignCapacity();\n        }\n        ReadFullChargeCapacity();\n\n        if (designCapacity is null || fullCapacity is null || designCapacity == 0 || fullCapacity == 0)\n        {\n            return -1;\n        }\n\n        decimal health = (decimal)fullCapacity / (decimal)designCapacity;\n        Logger.WriteLine(\"Design Capacity: \" + designCapacity + \"mWh, Full Charge Capacity: \" + fullCapacity + \"mWh, Health: \" + health + \"%\");\n\n        return health;\n    }\n\n    public static float? GetCPUTemp()\n    {\n        var last = DateTimeOffset.Now.ToUnixTimeSeconds();\n        if (Math.Abs(last - lastUpdate) < 2) return cpuTemp;\n        lastUpdate = last;\n\n        if (isPZ13) return (float)GetCPUTempWMI();\n        cpuTemp = Program.acpi.DeviceGet(AsusACPI.Temp_CPU);\n\n        if (cpuTemp < 0) try\n            {\n                using (var ct = new PerformanceCounter(\"Thermal Zone Information\", \"Temperature\", @\"\\_TZ.THRM\", true))\n                {\n                    cpuTemp = ct.NextValue() - 273;\n                }\n            }\n            catch (Exception ex)\n            {\n                //Debug.WriteLine(\"Failed reading CPU temp :\" + ex.Message);\n            }\n\n\n        return cpuTemp;\n    }\n\n    static double GetCPUTempWMI()\n    {\n        try\n        {\n            string wmiNamespace = @\"root\\WMI\";\n            string wmiQuery = @\"SELECT * FROM MSAcpi_ThermalZoneTemperature WHERE InstanceName = 'ACPI\\\\QCOM0C5A\\\\1_0'\";  // ACPI\\\\ThermalZone\\\\THRM_0\n            using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(wmiNamespace, wmiQuery))\n            {\n                foreach (ManagementObject obj in searcher.Get())\n                {\n                    double tempKelvin = Convert.ToDouble(obj[\"CurrentTemperature\"]);\n                    return (tempKelvin / 10) - 273.15;\n                }\n            }\n        }\n        catch (Exception ex)\n        {\n            //Logger.WriteLine(\"Error retrieving temperature: \" + ex.Message);\n        }\n        return -1;\n    }\n\n    public static float? GetGPUTemp()\n    {\n        try\n        {\n            gpuTemp = GpuControl?.GetCurrentTemperature();\n\n        }\n        catch (Exception ex)\n        {\n            gpuTemp = -1;\n            //Debug.WriteLine(\"Failed reading GPU temp :\" + ex.Message);\n        }\n\n        if (gpuTemp is null || gpuTemp < 0)\n        {\n            gpuTemp = Program.acpi.DeviceGet(AsusACPI.Temp_GPU);\n        }\n\n        return gpuTemp;\n    }\n\n\n    public static void ReadSensors(bool log = false)\n    {\n        batteryRate = 0;\n        gpuUse = -1;\n\n        if (Program.acpi is null) return;\n\n        cpuFan = FanSensorControl.FormatFan(AsusFan.CPU, Program.acpi.GetFan(AsusFan.CPU));\n        gpuFan = FanSensorControl.FormatFan(AsusFan.GPU, Program.acpi.GetFan(AsusFan.GPU));\n        midFan = FanSensorControl.FormatFan(AsusFan.Mid, Program.acpi.GetFan(AsusFan.Mid));\n\n        cpuTemp = GetCPUTemp();\n        gpuTemp = GetGPUTemp();\n\n        if (log) Logger.WriteLine($\"Temps: {cpuTemp} {gpuTemp} {cpuFan} {gpuFan} {midFan}\");\n\n        ReadFullChargeCapacity();\n        GetBatteryStatus();\n\n        if (fullCapacity > 0 && chargeCapacity > 0)\n        {\n            batteryCapacity = Math.Min(100, (decimal)chargeCapacity / (decimal)fullCapacity * 100);\n            if (batteryCapacity > 99 && BatteryControl.chargeFull) BatteryControl.UnSetBatteryLimitFull();\n            if (chargeWatt)\n            {\n                batteryCharge = Math.Round((decimal)chargeCapacity / 1000, 1).ToString() + \"Wh\";\n            }\n            else\n            {\n                batteryCharge = Math.Round(batteryCapacity, 1) + \"%\";\n            }\n        }\n    }\n\n    public static double GetBatteryChargePercentage()\n    {\n        double batteryCharge = 0;\n        try\n        {\n            ManagementObjectSearcher searcher = new ManagementObjectSearcher(\"SELECT * FROM Win32_Battery\");\n            foreach (ManagementObject battery in searcher.Get())\n            {\n                batteryCharge = Convert.ToDouble(battery[\"EstimatedChargeRemaining\"]);\n                break; // Assuming only one battery\n            }\n        }\n        catch (ManagementException e)\n        {\n            Console.WriteLine(\"An error occurred while querying for WMI data: \" + e.Message);\n        }\n        return batteryCharge;\n    }\n\n    public static bool IsUsedGPU(int threshold = 10)\n    {\n        if (GetGpuUse() > threshold)\n        {\n            Thread.Sleep(1000);\n            return (GetGpuUse() > threshold);\n        }\n        return false;\n    }\n\n\n    public static NvidiaGpuControl? GetNvidiaGpuControl()\n    {\n        if ((bool)GpuControl?.IsNvidia)\n            return (NvidiaGpuControl)GpuControl;\n        else\n            return null;\n    }\n\n    public static void RecreateGpuControlWithDelay(int delay = 5)\n    {\n        // Re-enabling the discrete GPU takes a bit of time,\n        // so a simple workaround is to refresh again after that happens\n        Task.Run(async () =>\n        {\n            await Task.Delay(TimeSpan.FromSeconds(delay));\n            RecreateGpuControl();\n        });\n    }\n\n    public static void RecreateGpuControl()\n    {\n        if (AppConfig.NoGpu()) return;\n        try\n        {\n            GpuControl?.Dispose();\n\n            IGpuControl _gpuControl = new NvidiaGpuControl();\n\n            if (_gpuControl.IsValid)\n            {\n                GpuControl = _gpuControl;\n                Logger.WriteLine(GpuControl.FullName);\n                return;\n            }\n\n            _gpuControl.Dispose();\n\n            _gpuControl = new AmdGpuControl();\n            if (_gpuControl.IsValid)\n            {\n                GpuControl = _gpuControl;\n                if (GpuControl.FullName.Contains(\"6850M\")) AppConfig.Set(\"xgm_special\", 1);\n                Logger.WriteLine(GpuControl.FullName);\n                return;\n            }\n            _gpuControl.Dispose();\n\n            Logger.WriteLine(\"dGPU not found\");\n            GpuControl = null;\n\n\n        }\n        catch (Exception ex)\n        {\n            Debug.WriteLine(\"Can't connect to GPU \" + ex.ToString());\n        }\n    }\n\n\n    public static void KillGPUApps()\n    {\n\n        List<string> tokill = new() { \"EADesktop\", \"epicgameslauncher\", \"ASUSSmartDisplayControl\" };\n\n        foreach (string kill in tokill) ProcessHelper.KillByName(kill);\n\n        if (AppConfig.Is(\"kill_gpu_apps\") && GpuControl is not null)\n        {\n            GpuControl.KillGPUApps();\n        }\n    }\n}\n"
  },
  {
    "path": "app/Helpers/AsusService.cs",
    "content": "﻿using System.Diagnostics;\n\nnamespace GHelper.Helpers\n{\n    public static class AsusService\n    {\n\n        static List<string> services = new() {\n                \"ArmouryCrateControlInterface\",\n                \"ArmouryCrateProArtService\",\n                \"AsHidService\",\n                \"ASUSOptimization\",\n                \"AsusAppService\",\n                \"ASUSLinkNear\",\n                \"ASUSLinkRemote\",\n                \"ASUSSoftwareManager\",\n                \"ASUSLiveUpdateAgent\",\n                \"ASUSSwitch\",\n                \"ASUSSystemAnalysis\",\n                \"ASUSSystemDiagnosis\",\n                \"AsusCertService\"\n        };\n\n        //\"AsusPTPService\",\n\n        static List<string> processesAC = new() {\n                \"ArmouryCrateSE.Service\",\n                \"ArmouryCrate.Service\",\n                \"LightingService\",\n        };\n\n        static List<string> servicesAC = new() {\n                \"ArmouryCrateSEService\",\n                \"ArmouryCrateService\",\n                \"LightingService\",\n        };\n\n        public static bool IsAsusOptimizationRunning()\n        {\n            return Process.GetProcessesByName(\"AsusOptimization\").Length > 0;\n        }\n\n        public static bool IsArmouryRunning()\n        {\n            var acService = Process.GetProcessesByName(\"ArmouryCrate.Service\").Length > 0;\n            var lightingService = Process.GetProcessesByName(\"LightingService\").Length > 0;   \n            Logger.WriteLine($\"AC Service: {acService}, Lighting Service: {lightingService}\");\n            return acService || lightingService;\n        }\n\n        public static void RunArmouryUninstaller()\n        {\n            Process.Start(new ProcessStartInfo(\"https://dlcdnets.asus.com/pub/ASUS/mb/14Utilities/Armoury_Crate_Uninstall_Tool.zip\") { UseShellExecute = true });\n        }\n\n        public static bool IsOSDRunning()\n        {\n            return Process.GetProcessesByName(\"AsusOSD\").Length > 0;\n        }\n\n\n        public static int GetRunningCount()\n        {\n            int count = 0;\n            foreach (string service in services)\n            {\n                if (Process.GetProcessesByName(service).Count() > 0) count++;\n            }\n\n            if (AppConfig.IsStopAC())\n                foreach (string service in processesAC)\n                {\n                    if (Process.GetProcessesByName(service).Count() > 0)\n                    {\n                        count++;\n                        Logger.WriteLine(service);\n                    }\n                }\n\n            return count;\n        }\n\n\n        public static void StopAsusServices()\n        {\n            foreach (string service in services)\n            {\n                ProcessHelper.StopDisableService(service);\n            }\n\n            if (AppConfig.IsStopAC())\n            {\n                foreach (string service in servicesAC)\n                {\n                    ProcessHelper.StopDisableService(service, \"Manual\");\n                }\n                Thread.Sleep(1000);\n            }\n\n        }\n\n        public static void StartAsusServices()\n        {\n            foreach (string service in services)\n            {\n                ProcessHelper.StartEnableService(service);\n            }\n\n            if (AppConfig.IsStopAC())\n            {\n                foreach (string service in servicesAC)\n                {\n                    ProcessHelper.StartEnableService(service);\n                }\n                Thread.Sleep(1000);\n            }\n\n        }\n\n    }\n\n}"
  },
  {
    "path": "app/Helpers/Audio.cs",
    "content": "﻿using NAudio.CoreAudioApi;\n\nnamespace GHelper.Helpers\n{\n    internal class Audio\n    {\n        public static bool ToggleMicMute()\n        {\n            using (var enumerator = new MMDeviceEnumerator())\n            {\n                var commDevice = enumerator.GetDefaultAudioEndpoint(DataFlow.Capture, Role.Communications);\n                var consoleDevice = enumerator.GetDefaultAudioEndpoint(DataFlow.Capture, Role.Console);\n                var mmDevice = enumerator.GetDefaultAudioEndpoint(DataFlow.Capture, Role.Multimedia);\n\n                bool status = !commDevice.AudioEndpointVolume.Mute;\n                \n                commDevice.AudioEndpointVolume.Mute = status;\n                consoleDevice.AudioEndpointVolume.Mute = status;\n                mmDevice.AudioEndpointVolume.Mute = status;\n\n                Logger.WriteLine(commDevice.ToString() + \":\" + status);\n                Logger.WriteLine(consoleDevice.ToString() + \":\" + status);\n                Logger.WriteLine(mmDevice.ToString() + \":\" + status);\n\n                return status;\n            }\n        }\n\n        public static bool IsMicMuted()\n        {\n            try\n            {\n                using (var deviceEnumerator = new MMDeviceEnumerator())\n                {\n                    var commDevice = deviceEnumerator.GetDefaultAudioEndpoint(DataFlow.Capture, Role.Communications);\n                    return commDevice.AudioEndpointVolume.Mute;\n                }\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine(\"Error checking mic mute status: \" + ex.Message);\n                return false; // Assume not muted in case of error\n            }\n        }\n\n        public static bool IsMuted()\n        {\n            try\n            {\n                using (var deviceEnumerator = new MMDeviceEnumerator())\n                {\n                    var defaultDevice = deviceEnumerator.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);\n                    return defaultDevice.AudioEndpointVolume.Mute;\n                }\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine(\"Error checking mute status: \" + ex.Message);\n                return false; // Assume not muted in case of error\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/Helpers/ClamshellModeControl.cs",
    "content": "﻿using GHelper.Display;\nusing GHelper.Mode;\nusing Microsoft.Win32;\n\nnamespace GHelper.Helpers\n{\n    internal class ClamshellModeControl\n    {\n\n        public ClamshellModeControl()\n        {\n            //Save current setting if hibernate or shutdown to prevent reverting the user set option.\n            CheckAndSaveLidAction();\n        }\n\n        public bool IsExternalDisplayConnected()\n        {\n            try\n            {\n                var devicesList = ScreenInterrogatory.GetAllDevices();\n                var devices = devicesList.ToArray();\n\n                string internalName = AppConfig.GetString(\"internal_display\");\n\n                foreach (var device in devices)\n                {\n                    if (device.outputTechnology != ScreenInterrogatory.DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY.DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL &&\n                        device.outputTechnology != ScreenInterrogatory.DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY.DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED\n                        && device.monitorFriendlyDeviceName != internalName)\n                    {\n                        Logger.WriteLine(\"Found external screen: \" + device.monitorFriendlyDeviceName + \":\" + device.outputTechnology.ToString());\n\n                        //Already found one, we do not have to check whether there are more\n                        return true;\n                    }\n\n                }\n            } catch (Exception ex)\n            {\n                Logger.WriteLine(ex.ToString());\n            }\n\n            return false;\n        }\n\n        public bool IsClamshellEnabled()\n        {\n            return AppConfig.Is(\"toggle_clamshell_mode\");\n        }\n\n        public bool IsChargerConnected()\n        {\n            return SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online;\n        }\n\n        public bool IsClamshellReady()\n        {\n            return IsExternalDisplayConnected() && (IsChargerConnected() || AppConfig.Is(\"clamshell_battery\"));\n        }\n\n        public void ToggleLidAction()\n        {\n            if (!IsClamshellEnabled())\n            {\n                return;\n            }\n\n            if (IsClamshellReady())\n            {\n                EnableClamshellMode();\n            }\n            else\n            {\n                DisableClamshellMode();\n            }\n        }\n        public static void DisableClamshellMode()\n        {\n            if (PowerNative.GetLidAction(true) == GetDefaultLidAction()) return;\n            PowerNative.SetLidAction(GetDefaultLidAction(), true);\n            Logger.WriteLine(\"Disengaging Clamshell Mode\");\n        }\n\n        public static void EnableClamshellMode()\n        {\n            if (PowerNative.GetLidAction(true) == 0) return;\n            PowerNative.SetLidAction(0, true);\n            Logger.WriteLine(\"Engaging Clamshell Mode\");\n        }\n\n        public void UnregisterDisplayEvents()\n        {\n            SystemEvents.DisplaySettingsChanged -= SystemEvents_DisplaySettingsChanged;\n        }\n\n        public void RegisterDisplayEvents()\n        {\n            SystemEvents.DisplaySettingsChanged += SystemEvents_DisplaySettingsChanged;\n        }\n\n        private void SystemEvents_DisplaySettingsChanged(object? sender, EventArgs e)\n        {\n            Logger.WriteLine(\"Display configuration changed.\");\n\n            if (IsClamshellEnabled())\n                ToggleLidAction();\n\n            if (Program.settingsForm.Visible)\n                ScreenControl.InitScreen();\n\n            if (AppConfig.IsForceMiniled())\n                ScreenControl.InitMiniled();\n\n        }\n\n        private static int CheckAndSaveLidAction()\n        {\n            if (AppConfig.Get(\"clamshell_default_lid_action\", -1) != -1)\n            {\n                //Seting was alredy set. Do not touch it\n                return AppConfig.Get(\"clamshell_default_lid_action\", -1);\n            }\n\n            try\n            {\n                int val = PowerNative.GetLidAction(true);\n                //If it is 0 then it is likely already set by clamshell mdoe\n                //If 0 was set by the user, then why do they even use clamshell mode?\n                //We only care about hibernate or shutdown setting here\n                if (val == 2 || val == 3)\n                {\n                    AppConfig.Set(\"clamshell_default_lid_action\", val);\n                    return val;\n                }\n            } catch (Exception ex)\n            {\n                Logger.WriteLine(\"Can't get Lid Action: \" + ex.ToString());\n            }\n\n            return 1;\n        }\n\n        //Power users can change that setting.\n        //0 = Do nothing\n        //1 = Sleep (default)\n        //2 = Hibernate\n        //3 = Shutdown\n        private static int GetDefaultLidAction()\n        {\n            int val = AppConfig.Get(\"clamshell_default_lid_action\", 1);\n\n            if (val < 0 || val > 3)\n            {\n                val = 1;\n            }\n\n            return val;\n        }\n    }\n}\n"
  },
  {
    "path": "app/Helpers/ColorUtilities.cs",
    "content": "﻿using System.Runtime.CompilerServices;\n\nnamespace GHelper.Helpers\n{\n    public class ColorUtils\n    {\n        // Method to get the weighted average between two colors\n        public static Color GetWeightedAverage(Color color1, Color color2, float weight)\n        {\n\n            int red = (int)Math.Round(color1.R * (1 - weight) + color2.R * weight);\n            int green = (int)Math.Round(color1.G * (1 - weight) + color2.G * weight);\n            int blue = (int)Math.Round(color1.B * (1 - weight) + color2.B * weight);\n\n            red = Math.Min(255, Math.Max(0, red));\n            green = Math.Min(255, Math.Max(0, green));\n            blue = Math.Min(255, Math.Max(0, blue));\n\n            return Color.FromArgb(red, green, blue);\n        }\n\n        public static Color GetMidColor(Color color1, Color color2)\n        {\n            return Color.FromArgb((color1.R + color2.R) / 2,\n                (color1.G + color2.G) / 2,\n                (color1.B + color2.B) / 2);\n        }\n\n        public static Color GetDominantColor(Bitmap bmp)\n        {\n\n            //Used for tally\n            int r = 0;\n            int g = 0;\n            int b = 0;\n\n            int total = 0;\n\n            for (int x = 0; x < bmp.Width; x++)\n            {\n                for (int y = 0; y < bmp.Height; y++)\n                {\n                    Color clr = bmp.GetPixel(x, y);\n\n                    r += clr.R;\n                    g += clr.G;\n                    b += clr.B;\n\n                    total++;\n                }\n            }\n\n            //Calculate average\n            r /= total;\n            g /= total;\n            b /= total;\n\n            return Color.FromArgb(r, g, b);\n        }\n\n        public class HSV\n        {\n            public double Hue { get; set; }\n            public double Saturation { get; set; }\n            public double Value { get; set; }\n\n            public Color ToRGB()\n            {\n                var hue = Hue * 6;\n                var saturation = Saturation;\n                var value = Value;\n\n                double red;\n                double green;\n                double blue;\n\n                if (saturation == 0)\n                {\n                    red = green = blue = value;\n                }\n                else\n                {\n                    var i = Convert.ToInt32(Math.Floor(hue));\n                    var f = hue - i;\n                    var p = value * (1 - saturation);\n                    var q = value * (1 - saturation * f);\n                    var t = value * (1 - saturation * (1 - f));\n                    int mod = i % 6;\n\n                    red = new[] { value, q, p, p, t, value }[mod];\n                    green = new[] { t, value, value, q, p, p }[mod];\n                    blue = new[] { p, p, t, value, value, q }[mod];\n                }\n\n                return Color.FromArgb(Convert.ToInt32(red * 255), Convert.ToInt32(green * 255), Convert.ToInt32(blue * 255));\n            }\n\n            public static HSV ToHSV(Color rgb)\n            {\n                double red = rgb.R / 255.0;\n                double green = rgb.G / 255.0;\n                double blue = rgb.B / 255.0;\n                var min = Math.Min(red, Math.Min(green, blue));\n                var max = Math.Max(red, Math.Max(green, blue));\n                var delta = max - min;\n                double hue;\n                double saturation = 0;\n                var value = max;\n\n                if (max != 0)\n                    saturation = delta / max;\n\n                if (delta == 0)\n                    hue = 0;\n                else\n                {\n                    if (red == max)\n                        hue = (green - blue) / delta + (green < blue ? 6 : 0);\n                    else if (green == max)\n                        hue = 2 + (blue - red) / delta;\n                    else\n                        hue = 4 + (red - green) / delta;\n\n                    hue /= 6;\n                }\n\n                return new HSV { Hue = hue, Saturation = saturation, Value = value };\n            }\n\n            public static Color UpSaturation(Color rgb, float increse = 0.2f) //make color more colored\n            {\n                if (rgb.R == rgb.G && rgb.G == rgb.B)\n                    return rgb;\n                var hsv_color = ToHSV(rgb);\n                hsv_color.Saturation = Math.Min(hsv_color.Saturation + increse, 1.00f);\n                return hsv_color.ToRGB();\n            }\n\n        }\n\n        public class SmoothColor\n        {\n            public Color RGB\n            {\n                get { return Interpolate(); }\n                set { clr = value; }\n            }\n\n            Color Interpolate()\n            {\n                clr_ = ColorInterpolator.InterpolateBetween(clr, clr_, smooth);\n                return clr_;\n            }\n\n            private float smooth = 0.65f; //smooth\n            private Color clr = new Color();\n            private Color clr_ = new Color();\n\n            static class ColorInterpolator\n            {\n                delegate byte ComponentSelector(Color color);\n                static ComponentSelector _redSelector = color => color.R;\n                static ComponentSelector _greenSelector = color => color.G;\n                static ComponentSelector _blueSelector = color => color.B;\n\n                public static Color InterpolateBetween(Color endPoint1, Color endPoint2, double lambda)\n                {\n                    if (lambda < 0 || lambda > 1)\n                        throw new ArgumentOutOfRangeException(\"lambda\");\n\n                    if (endPoint1 != endPoint2)\n                    {\n                        return Color.FromArgb(\n                        InterpolateComponent(endPoint1, endPoint2, lambda, _redSelector),\n                        InterpolateComponent(endPoint1, endPoint2, lambda, _greenSelector),\n                        InterpolateComponent(endPoint1, endPoint2, lambda, _blueSelector)\n                        );\n                    }\n\n                    return endPoint1;\n                }\n\n                [MethodImpl(MethodImplOptions.AggressiveInlining)]\n                static byte InterpolateComponent(Color end1, Color end2, double lambda, ComponentSelector selector)\n                {\n                    return (byte)(selector(end1) + (selector(end2) - selector(end1)) * lambda);\n                }\n            }\n\n        }\n    }\n\n}"
  },
  {
    "path": "app/Helpers/DynamicLightingHelper.cs",
    "content": "﻿using Microsoft.Win32;\n\nnamespace GHelper.Helpers\n{\n    public static class DynamicLightingHelper\n    {\n\n        const string LightingKey = @\"HKEY_CURRENT_USER\\Software\\Microsoft\\Lighting\";\n        const string LightingValue = \"AmbientLightingEnabled\";\n\n        public enum DynamicLightingEffect\n        {\n            Solid = 0,\n            Breathing = 1,\n            Rainbow = 2,\n            Wave = 4,\n            Wheel = 5,\n            Gradient = 6\n        }\n\n        public static bool IsEnabled()\n        {\n            if (Environment.OSVersion.Version.Build < 22000) return false;\n            if (ProcessHelper.IsRunningAsSystem()) return false;\n            Logger.WriteLine(\"Dynamic lighting status: \" + Registry.GetValue(LightingKey, LightingValue, 0));\n            return (int?)Registry.GetValue(LightingKey, LightingValue, 0) > 0;\n        }\n\n        public static void SetRegStatus(int status = 1)\n        {\n            try\n            {\n                Registry.SetValue(LightingKey, LightingValue, status, RegistryValueKind.DWord);\n                SetDynamicLightingOnAllDevices(status);\n                Logger.WriteLine($\"Dynamic lighting: {status}\");\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine($\"Error setting value for dynamic lighting: {ex.Message}\");\n            }\n        }\n\n        static void WriteLightingValue(string name, object value, RegistryValueKind kind)\n        {\n            Registry.SetValue(LightingKey, name, value, kind);\n            using var devicesKey = Registry.CurrentUser.OpenSubKey(@\"Software\\Microsoft\\Lighting\\Devices\", true);\n\n            if (devicesKey == null) return;\n            foreach (var dev in devicesKey.GetSubKeyNames())\n            {\n                using var dk = devicesKey.OpenSubKey(dev, true);\n                if (dk == null) continue;\n\n                dk.SetValue(name, value, kind);\n            }\n        }\n\n        static int ToDlColorDword(System.Drawing.Color c)\n        {\n            // Dynamic Lighting registry expects AABBGGRR on this system (R/B swapped vs AARRGGBB).\n            unchecked\n            {\n                return (c.A << 24) | (c.B << 16) | (c.G << 8) | c.R;\n            }\n        }\n\n        public static void SetEffect(\n            DynamicLightingEffect effect,\n            Color? color = null,\n            Color? color2 = null,\n            int? brightness = null,\n            int? speed = null)\n        {\n            try\n            {\n                // Let Windows own the device\n                WriteLightingValue(\"ControlledByForegroundApp\", 0, RegistryValueKind.DWord);\n\n                // Enable lighting if needed\n                WriteLightingValue(\"AmbientLightingEnabled\", 1, RegistryValueKind.DWord);\n\n                // Core selector\n                WriteLightingValue(\"EffectType\", (int)effect, RegistryValueKind.DWord);\n                WriteLightingValue(\"EffectMode\", 0, RegistryValueKind.DWord);\n\n                if (brightness.HasValue)\n                    WriteLightingValue(\"Brightness\",\n                        Math.Clamp(brightness.Value, 0, 100),\n                        RegistryValueKind.DWord);\n\n                if (speed.HasValue)\n                    WriteLightingValue(\"Speed\",\n                        Math.Clamp(speed.Value, 0, 10),\n                        RegistryValueKind.DWord);\n\n                if (color.HasValue)\n                {\n                    WriteLightingValue(\"Color\", ToDlColorDword(color.Value), RegistryValueKind.DWord);\n                }\n\n                if (color2.HasValue)\n                {\n                    WriteLightingValue(\"Color2\", ToDlColorDword(color2.Value), RegistryValueKind.DWord);\n                }\n\n                Logger.WriteLine($\"Dynamic lighting effect set: {effect}\");\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine($\"Dynamic lighting effect error: {ex}\");\n            }\n        }\n\n        static void SetDynamicLightingOnAllDevices(int status = 1)\n        {\n            RegistryKey? devicesKey = Registry.CurrentUser.OpenSubKey(@\"Software\\Microsoft\\Lighting\\Devices\", true);\n\n            if (devicesKey != null)\n            {\n                foreach (string deviceKeyName in devicesKey.GetSubKeyNames())\n                {\n                    RegistryKey? deviceKey = devicesKey.OpenSubKey(deviceKeyName, true);\n                    if (deviceKey != null && deviceKey.GetValue(LightingValue) != null)\n                    {\n                        deviceKey.SetValue(LightingValue, status, RegistryValueKind.DWord);\n                    }\n                }\n            }\n        }\n\n        public static void Init()\n        {\n            if (!AppConfig.IsDynamicLightingInit()) return;\n            if (Environment.OSVersion.Version.Build < 22000) return;\n            if (IsEnabled()) return;\n\n            SetRegStatus(1);\n            Thread.Sleep(500);\n            SetRegStatus(0);\n        }\n\n        public static void OpenSettings()\n        {\n            ProcessHelper.RunCMD(\"explorer\", \"ms-settings:personalization-lighting\");\n        }\n\n\n    }\n}\n"
  },
  {
    "path": "app/Helpers/Logger.cs",
    "content": "﻿using System.Diagnostics;\n\npublic static class Logger\n{\n    public static string appPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + \"\\\\GHelper\";\n    public static string logFile = appPath + \"\\\\log.txt\";\n\n    public static void WriteLine(string logMessage)\n    {\n        Debug.WriteLine($\"{DateTime.Now}: {logMessage}\");\n        if (!Directory.Exists(appPath)) Directory.CreateDirectory(appPath);\n\n        try\n        {\n            using (StreamWriter w = File.AppendText(logFile))\n            {\n                w.WriteLine($\"{DateTime.Now}: {logMessage}\");\n                w.Close();\n            }\n        }\n        catch { }\n\n        if (new Random().Next(100) == 1) Cleanup();\n\n\n    }\n\n    public static void Cleanup()\n    {\n        try\n        {\n            var file = File.ReadAllLines(logFile);\n            int skip = Math.Max(0, file.Count() - 2000);\n            File.WriteAllLines(logFile, file.Skip(skip).ToArray());\n        }\n        catch { }\n    }\n\n}\n"
  },
  {
    "path": "app/Helpers/OSDBase.cs",
    "content": "﻿using System.Drawing.Imaging;\nusing System.Runtime.InteropServices;\n\nnamespace GHelper.Helpers\n{\n\n    public class OSDNativeForm : NativeWindow, IDisposable\n    {\n\n        private bool _disposed = false;\n        private byte _alpha = 250;\n        private Size _size = new Size(350, 50);\n        private Point _location = new Point(50, 50);\n\n\n        protected virtual void PerformPaint(PaintEventArgs e)\n        {\n        }\n\n        protected internal void Invalidate()\n        {\n            UpdateLayeredWindow();\n        }\n        private void UpdateLayeredWindow()\n        {\n            Bitmap bitmap1 = new Bitmap(Size.Width, Size.Height, PixelFormat.Format32bppArgb);\n            using (Graphics graphics1 = Graphics.FromImage(bitmap1))\n            {\n                Rectangle rectangle1;\n                SIZE size1;\n                POINT point1;\n                POINT point2;\n                BLENDFUNCTION blendfunction1;\n                rectangle1 = new Rectangle(0, 0, Size.Width, Size.Height);\n                PerformPaint(new PaintEventArgs(graphics1, rectangle1));\n                nint ptr1 = User32.GetDC(nint.Zero);\n                nint ptr2 = Gdi32.CreateCompatibleDC(ptr1);\n                nint ptr3 = bitmap1.GetHbitmap(Color.FromArgb(0));\n                nint ptr4 = Gdi32.SelectObject(ptr2, ptr3);\n                size1.cx = Size.Width;\n                size1.cy = Size.Height;\n                point1.x = Location.X;\n                point1.x = Location.X;\n                point1.y = Location.Y;\n                point2.x = 0;\n                point2.y = 0;\n                blendfunction1 = new BLENDFUNCTION();\n                blendfunction1.BlendOp = 0;\n                blendfunction1.BlendFlags = 0;\n                blendfunction1.SourceConstantAlpha = _alpha;\n                blendfunction1.AlphaFormat = 1;\n                User32.UpdateLayeredWindow(Handle, ptr1, ref point1, ref size1, ptr2, ref point2, 0, ref blendfunction1, 2); //2=ULW_ALPHA\n                Gdi32.SelectObject(ptr2, ptr4);\n                User32.ReleaseDC(nint.Zero, ptr1);\n                Gdi32.DeleteObject(ptr3);\n                Gdi32.DeleteDC(ptr2);\n            }\n        }\n\n        public virtual void Show()\n        {\n            if (Handle == nint.Zero) //if handle don't equal to zero - window was created and just hided\n                CreateWindowOnly();\n            User32.ShowWindow(Handle, User32.SW_SHOWNOACTIVATE);\n        }\n\n\n        public virtual void Hide()\n        {\n            if (Handle == nint.Zero)\n                return;\n            User32.ShowWindow(Handle, User32.SW_HIDE);\n            DestroyHandle();\n        }\n\n\n        public virtual void Close()\n        {\n            Hide();\n            Dispose();\n        }\n\n        private void CreateWindowOnly()\n        {\n\n            CreateParams params1 = new CreateParams();\n            params1.Caption = \"FloatingNativeWindow\";\n            int nX = _location.X;\n            int nY = _location.Y;\n            Screen screen1 = Screen.FromHandle(Handle);\n            if (nX + _size.Width > screen1.Bounds.Width)\n            {\n                nX = screen1.Bounds.Width - _size.Width;\n            }\n            if (nY + _size.Height > screen1.Bounds.Height)\n            {\n                nY = screen1.Bounds.Height - _size.Height;\n            }\n            _location = new Point(nX, nY);\n            Size size1 = _size;\n            Point point1 = _location;\n            params1.X = nX;\n            params1.Y = nY;\n            params1.Height = size1.Height;\n            params1.Width = size1.Width;\n            params1.Parent = nint.Zero;\n            uint ui = User32.WS_POPUP;\n            params1.Style = (int)ui;\n            params1.ExStyle = User32.WS_EX_TOPMOST | User32.WS_EX_TOOLWINDOW | User32.WS_EX_LAYERED | User32.WS_EX_NOACTIVATE | User32.WS_EX_TRANSPARENT;\n            CreateHandle(params1);\n            UpdateLayeredWindow();\n        }\n\n\n\n        protected virtual void SetBoundsCore(int x, int y, int width, int height)\n        {\n            if (X != x || Y != y || Width != width || Height != height)\n            {\n                if (Handle != nint.Zero)\n                {\n                    int num1 = 20;\n                    if (X == x && Y == y)\n                    {\n                        num1 |= 2;\n                    }\n                    if (Width == width && Height == height)\n                    {\n                        num1 |= 1;\n                    }\n                    User32.SetWindowPos(Handle, nint.Zero, x, y, width, height, (uint)num1);\n                }\n                else\n                {\n                    Location = new Point(x, y);\n                    Size = new Size(width, height);\n                }\n            }\n        }\n\n\n\n\n        #region #  Properties  #\n        /// <summary>\n        /// Get or set position of top-left corner of floating native window in screen coordinates\n        /// </summary>\n        public virtual Point Location\n        {\n            get { return _location; }\n            set\n            {\n                if (Handle != nint.Zero)\n                {\n                    SetBoundsCore(value.X, value.Y, _size.Width, _size.Height);\n                    RECT rect = new RECT();\n                    User32.GetWindowRect(Handle, ref rect);\n                    _location = new Point(rect.left, rect.top);\n                    UpdateLayeredWindow();\n                }\n                else\n                {\n                    _location = value;\n                }\n            }\n        }\n        /// <summary>\n        /// Get or set size of client area of floating native window\n        /// </summary>\n        public virtual Size Size\n        {\n            get { return _size; }\n            set\n            {\n                if (Handle != nint.Zero)\n                {\n                    SetBoundsCore(_location.X, _location.Y, value.Width, value.Height);\n                    RECT rect = new RECT();\n                    User32.GetWindowRect(Handle, ref rect);\n                    _size = new Size(rect.right - rect.left, rect.bottom - rect.top);\n                    UpdateLayeredWindow();\n                }\n                else\n                {\n                    _size = value;\n                }\n            }\n        }\n        /// <summary>\n        /// Gets or sets the height of the floating native window\n        /// </summary>\n\t\tpublic int Height\n        {\n            get { return _size.Height; }\n            set\n            {\n                _size = new Size(_size.Width, value);\n            }\n        }\n        /// <summary>\n        /// Gets or sets the width of the floating native window\n        /// </summary>\n        public int Width\n        {\n            get { return _size.Width; }\n            set\n            {\n                _size = new Size(value, _size.Height);\n            }\n        }\n        /// <summary>\n        /// Get or set x-coordinate of top-left corner of floating native window in screen coordinates\n        /// </summary>\n\t\tpublic int X\n        {\n            get { return _location.X; }\n            set\n            {\n                Location = new Point(value, Location.Y);\n            }\n        }\n        /// <summary>\n        /// Get or set y-coordinate of top-left corner of floating native window in screen coordinates\n        /// </summary>\n        public int Y\n        {\n            get { return _location.Y; }\n            set\n            {\n                Location = new Point(Location.X, value);\n            }\n        }\n        /// <summary>\n        /// Get rectangle represented client area of floating native window in client coordinates(top-left corner always has coord. 0,0)\n        /// </summary>\n\t\tpublic Rectangle Bound\n        {\n            get\n            {\n                return new Rectangle(new Point(0, 0), _size);\n            }\n        }\n        /// <summary>\n        /// Get or set full opacity(255) or full transparency(0) or any intermediate state for floating native window transparency\n        /// </summary>\n\t\tpublic byte Alpha\n        {\n            get { return _alpha; }\n            set\n            {\n                if (_alpha == value) return;\n                _alpha = value;\n                UpdateLayeredWindow();\n            }\n        }\n        #endregion\n\n        #region IDisposable Members\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n        private void Dispose(bool disposing)\n        {\n            if (!_disposed)\n            {\n                DestroyHandle();\n                _disposed = true;\n            }\n        }\n        #endregion\n    }\n\n    #region #  Win32  #\n\n    [StructLayout(LayoutKind.Sequential)]\n    internal struct POINT\n    {\n        public int x;\n        public int y;\n    }\n    [StructLayout(LayoutKind.Sequential)]\n    internal struct RECT\n    {\n        public int left;\n        public int top;\n        public int right;\n        public int bottom;\n    }\n    [StructLayout(LayoutKind.Sequential)]\n    internal struct SIZE\n    {\n        public int cx;\n        public int cy;\n    }\n    [StructLayout(LayoutKind.Sequential)]\n    internal struct TRACKMOUSEEVENTS\n    {\n        public uint cbSize;\n        public uint dwFlags;\n        public nint hWnd;\n        public uint dwHoverTime;\n    }\n    [StructLayout(LayoutKind.Sequential)]\n    internal struct MSG\n    {\n        public nint hwnd;\n        public int message;\n        public nint wParam;\n        public nint lParam;\n        public int time;\n        public int pt_x;\n        public int pt_y;\n    }\n    [StructLayout(LayoutKind.Sequential, Pack = 1)]\n    internal struct BLENDFUNCTION\n    {\n        public byte BlendOp;\n        public byte BlendFlags;\n        public byte SourceConstantAlpha;\n        public byte AlphaFormat;\n    }\n    internal class User32\n    {\n        public const uint WS_POPUP = 0x80000000;\n        public const int WS_EX_TOPMOST = 0x8;\n        public const int WS_EX_TOOLWINDOW = 0x80;\n        public const int WS_EX_LAYERED = 0x80000;\n        public const int WS_EX_TRANSPARENT = 0x20;\n        public const int WS_EX_NOACTIVATE = 0x08000000;\n        public const int SW_SHOWNOACTIVATE = 4;\n        public const int SW_HIDE = 0;\n        public const uint AW_HOR_POSITIVE = 0x1;\n        public const uint AW_HOR_NEGATIVE = 0x2;\n        public const uint AW_VER_POSITIVE = 0x4;\n        public const uint AW_VER_NEGATIVE = 0x8;\n        public const uint AW_CENTER = 0x10;\n        public const uint AW_HIDE = 0x10000;\n        public const uint AW_ACTIVATE = 0x20000;\n        public const uint AW_SLIDE = 0x40000;\n        public const uint AW_BLEND = 0x80000;\n        // Methods\n        private User32()\n        {\n        }\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern bool AnimateWindow(nint hWnd, uint dwTime, uint dwFlags);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern bool ClientToScreen(nint hWnd, ref POINT pt);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern bool DispatchMessage(ref MSG msg);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern bool DrawFocusRect(nint hWnd, ref RECT rect);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern nint GetDC(nint hWnd);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern nint GetFocus();\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern ushort GetKeyState(int virtKey);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern bool GetMessage(ref MSG msg, int hWnd, uint wFilterMin, uint wFilterMax);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern nint GetParent(nint hWnd);\n        [DllImport(\"user32.dll\", CharSet = CharSet.Auto, ExactSpelling = true)]\n        public static extern bool GetClientRect(nint hWnd, [In, Out] ref RECT rect);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern int GetWindowLong(nint hWnd, int nIndex);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern nint GetWindow(nint hWnd, int cmd);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern bool GetWindowRect(nint hWnd, ref RECT rect);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern bool HideCaret(nint hWnd);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern bool InvalidateRect(nint hWnd, ref RECT rect, bool erase);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern nint LoadCursor(nint hInstance, uint cursor);\n        [DllImport(\"user32.dll\", CharSet = CharSet.Auto, ExactSpelling = true)]\n        public static extern int MapWindowPoints(nint hWndFrom, nint hWndTo, [In, Out] ref RECT rect, int cPoints);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern bool MoveWindow(nint hWnd, int x, int y, int width, int height, bool repaint);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern bool PeekMessage(ref MSG msg, int hWnd, uint wFilterMin, uint wFilterMax, uint wFlag);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern bool PostMessage(nint hWnd, int Msg, uint wParam, uint lParam);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern bool ReleaseCapture();\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern int ReleaseDC(nint hWnd, nint hDC);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern bool ScreenToClient(nint hWnd, ref POINT pt);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern uint SendMessage(nint hWnd, int Msg, uint wParam, uint lParam);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern nint SetCursor(nint hCursor);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern nint SetFocus(nint hWnd);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern int SetWindowLong(nint hWnd, int nIndex, int newLong);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern int SetWindowPos(nint hWnd, nint hWndAfter, int X, int Y, int Width, int Height, uint flags);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern bool SetWindowRgn(nint hWnd, nint hRgn, bool redraw);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern bool ShowCaret(nint hWnd);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern bool SetCapture(nint hWnd);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern int ShowWindow(nint hWnd, short cmdShow);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern bool SystemParametersInfo(uint uiAction, uint uiParam, ref int bRetValue, uint fWinINI);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern bool TrackMouseEvent(ref TRACKMOUSEEVENTS tme);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern bool TranslateMessage(ref MSG msg);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern bool UpdateLayeredWindow(nint hwnd, nint hdcDst, ref POINT pptDst, ref SIZE psize, nint hdcSrc, ref POINT pprSrc, int crKey, ref BLENDFUNCTION pblend, int dwFlags);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern bool UpdateWindow(nint hwnd);\n        [DllImport(\"User32.dll\", CharSet = CharSet.Auto)]\n        internal static extern bool WaitMessage();\n        [DllImport(\"user32.dll\", CharSet = CharSet.Auto, ExactSpelling = true)]\n        public static extern bool AdjustWindowRectEx(ref RECT lpRect, int dwStyle, bool bMenu, int dwExStyle);\n    }\n\n    internal class Gdi32\n    {\n        // Methods\n        private Gdi32()\n        {\n        }\n        [DllImport(\"gdi32.dll\", CharSet = CharSet.Auto)]\n        internal static extern int CombineRgn(nint dest, nint src1, nint src2, int flags);\n        [DllImport(\"gdi32.dll\", CharSet = CharSet.Auto)]\n        internal static extern nint CreateBrushIndirect(ref LOGBRUSH brush);\n        [DllImport(\"gdi32.dll\", CharSet = CharSet.Auto)]\n        internal static extern nint CreateCompatibleDC(nint hDC);\n        [DllImport(\"gdi32.dll\", CharSet = CharSet.Auto)]\n        internal static extern nint CreateRectRgnIndirect(ref RECT rect);\n        [DllImport(\"gdi32.dll\", CharSet = CharSet.Auto)]\n        internal static extern bool DeleteDC(nint hDC);\n        [DllImport(\"gdi32.dll\", CharSet = CharSet.Auto)]\n        internal static extern nint DeleteObject(nint hObject);\n        [DllImport(\"gdi32.dll\", CharSet = CharSet.Auto)]\n        internal static extern int GetClipBox(nint hDC, ref RECT rectBox);\n        [DllImport(\"gdi32.dll\", CharSet = CharSet.Auto)]\n        internal static extern bool PatBlt(nint hDC, int x, int y, int width, int height, uint flags);\n        [DllImport(\"gdi32.dll\", CharSet = CharSet.Auto)]\n        internal static extern int SelectClipRgn(nint hDC, nint hRgn);\n        [DllImport(\"gdi32.dll\", CharSet = CharSet.Auto)]\n        internal static extern nint SelectObject(nint hDC, nint hObject);\n    }\n    [StructLayout(LayoutKind.Sequential)]\n    public struct LOGBRUSH\n    {\n        public uint lbStyle;\n        public uint lbColor;\n        public uint lbHatch;\n    }\n\n    #endregion\n}\n"
  },
  {
    "path": "app/Helpers/OnScreenKeyboard.cs",
    "content": "﻿using System.Diagnostics;\nusing System.Runtime.InteropServices;\n\nnamespace GHelper.Helpers\n{\n    public static class OnScreenKeyboard\n    {\n        static OnScreenKeyboard()\n        {\n            var version = Environment.OSVersion.Version;\n            switch (version.Major)\n            {\n                case 6:\n                    switch (version.Minor)\n                    {\n                        case 2:\n                            // Windows 10 (ok)\n                            break;\n                    }\n                    break;\n                default:\n                    break;\n            }\n        }\n\n        private static void StartTabTip()\n        {\n            var p = Process.Start(@\"C:\\Program Files\\Common Files\\Microsoft Shared\\ink\\TabTip.exe\");\n            int handle = 0;\n            while ((handle = NativeMethods.FindWindow(\"IPTIP_Main_Window\", \"\")) <= 0)\n            {\n                Thread.Sleep(100);\n            }\n        }\n\n        public static void ToggleVisibility()\n        {\n            var type = Type.GetTypeFromCLSID(Guid.Parse(\"4ce576fa-83dc-4F88-951c-9d0782b4e376\"));\n            var instance = (ITipInvocation)Activator.CreateInstance(type);\n            instance.Toggle(NativeMethods.GetDesktopWindow());\n            Marshal.ReleaseComObject(instance);\n        }\n\n        public static void Show()\n        {\n            int handle = NativeMethods.FindWindow(\"IPTIP_Main_Window\", \"\");\n            if (handle <= 0) // nothing found\n            {\n                StartTabTip();\n                Thread.Sleep(100);\n            }\n            // on some devices starting TabTip don't show keyboard, on some does  ¯\\_(ツ)_/¯\n            if (!IsOpen())\n            {\n                ToggleVisibility();\n            }\n        }\n\n        public static void Hide()\n        {\n            if (IsOpen())\n            {\n                ToggleVisibility();\n            }\n        }\n\n\n        public static bool Close()\n        {\n            // find it\n            int handle = NativeMethods.FindWindow(\"IPTIP_Main_Window\", \"\");\n            bool active = handle > 0;\n            if (active)\n            {\n                // don't check style - just close\n                NativeMethods.SendMessage(handle, NativeMethods.WM_SYSCOMMAND, NativeMethods.SC_CLOSE, 0);\n            }\n            return active;\n        }\n\n        public static bool IsOpen()\n        {\n            return GetIsOpen1709() ?? GetIsOpenLegacy();\n        }\n\n\n        [DllImport(\"user32.dll\", SetLastError = false)]\n        private static extern IntPtr FindWindowEx(IntPtr parent, IntPtr after, string className, string title = null);\n\n        [DllImport(\"user32.dll\", SetLastError = false)]\n        private static extern uint GetWindowLong(IntPtr wnd, int index);\n\n        private static bool? GetIsOpen1709()\n        {\n            // if there is a top-level window - the keyboard is closed\n            var wnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, WindowClass1709, WindowCaption1709);\n            if (wnd != IntPtr.Zero)\n                return false;\n\n            var parent = IntPtr.Zero;\n            for (; ; )\n            {\n                parent = FindWindowEx(IntPtr.Zero, parent, WindowParentClass1709);\n                if (parent == IntPtr.Zero)\n                    return null; // no more windows, keyboard state is unknown\n\n                // if it's a child of a WindowParentClass1709 window - the keyboard is open\n                wnd = FindWindowEx(parent, IntPtr.Zero, WindowClass1709, WindowCaption1709);\n                if (wnd != IntPtr.Zero)\n                    return true;\n            }\n        }\n\n        private static bool GetIsOpenLegacy()\n        {\n            var wnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, WindowClass);\n            if (wnd == IntPtr.Zero)\n                return false;\n\n            var style = GetWindowStyle(wnd);\n            return style.HasFlag(WindowStyle.Visible)\n                && !style.HasFlag(WindowStyle.Disabled);\n        }\n\n        private const string WindowClass = \"IPTip_Main_Window\";\n        private const string WindowParentClass1709 = \"ApplicationFrameWindow\";\n        private const string WindowClass1709 = \"Windows.UI.Core.CoreWindow\";\n        private const string WindowCaption1709 = \"Microsoft Text Input Application\";\n\n        private enum WindowStyle : uint\n        {\n            Disabled = 0x08000000,\n            Visible = 0x10000000,\n        }\n\n        private static WindowStyle GetWindowStyle(IntPtr wnd)\n        {\n            return (WindowStyle)GetWindowLong(wnd, -16);\n        }\n\n    }\n\n\n    [ComImport]\n    [Guid(\"37c994e7-432b-4834-a2f7-dce1f13b834b\")]\n    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]\n    interface ITipInvocation\n    {\n        void Toggle(IntPtr hwnd);\n    }\n\n    internal static class NativeMethods\n    {\n        [DllImport(\"user32.dll\", EntryPoint = \"FindWindow\")]\n        internal static extern int FindWindow(string lpClassName, string lpWindowName);\n\n        [DllImport(\"user32.dll\", EntryPoint = \"SendMessage\")]\n        internal static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);\n\n        [DllImport(\"user32.dll\", EntryPoint = \"GetDesktopWindow\", SetLastError = false)]\n        internal static extern IntPtr GetDesktopWindow();\n\n        [DllImport(\"user32.dll\", EntryPoint = \"GetWindowLong\")]\n        internal static extern int GetWindowLong(int hWnd, int nIndex);\n\n        internal const int GWL_STYLE = -16;\n        internal const int GWL_EXSTYLE = -20;\n        internal const int WM_SYSCOMMAND = 0x0112;\n        internal const int SC_CLOSE = 0xF060;\n\n        internal const int WS_DISABLED = 0x08000000;\n\n        internal const int WS_VISIBLE = 0x10000000;\n\n    }\n}"
  },
  {
    "path": "app/Helpers/ProcessHelper.cs",
    "content": "﻿using System.Diagnostics;\nusing System.Security.Principal;\n\nnamespace GHelper.Helpers\n{\n    public static class ProcessHelper\n    {\n        private static long lastAdmin;\n\n        private static bool? _isSystem;\n        public static bool IsRunningAsSystem()\n        {\n            if (_isSystem.HasValue)\n                return _isSystem.Value;\n\n            using (WindowsIdentity identity = WindowsIdentity.GetCurrent())\n            {\n                if (identity == null)\n                    _isSystem = false;\n                else\n                    _isSystem = string.Equals(identity.Name, @\"NT AUTHORITY\\SYSTEM\", StringComparison.OrdinalIgnoreCase);\n            }\n\n            return _isSystem.Value;\n        }\n\n        public static void CheckAlreadyRunning()\n        {\n            Process currentProcess = Process.GetCurrentProcess();\n            Process[] processes = Process.GetProcessesByName(currentProcess.ProcessName);\n\n            if (processes.Length > 1)\n            {\n                foreach (Process process in processes)\n                    if (process.Id != currentProcess.Id)\n                        try\n                        {\n                            process.Kill();\n                        }\n                        catch (Exception ex)\n                        {\n                            Logger.WriteLine(ex.ToString());\n                            MessageBox.Show(Properties.Strings.AppAlreadyRunningText, Properties.Strings.AppAlreadyRunning, MessageBoxButtons.OK);\n                            Application.Exit();\n                            return;\n                        }\n            }\n        }\n\n        public static bool IsUserAdministrator()\n        {\n            WindowsIdentity identity = WindowsIdentity.GetCurrent();\n            WindowsPrincipal principal = new WindowsPrincipal(identity);\n            return principal.IsInRole(WindowsBuiltInRole.Administrator);\n        }\n\n        public static void RunAsAdmin(string? param = null, bool force = false)\n        {\n\n            if (Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastAdmin) < 2000) return;\n            lastAdmin = DateTimeOffset.Now.ToUnixTimeMilliseconds();\n\n            // Check if the current user is an administrator\n            if (!IsUserAdministrator() || force)\n            {\n                ProcessStartInfo startInfo = new ProcessStartInfo();\n                startInfo.UseShellExecute = true;\n                startInfo.WorkingDirectory = Environment.CurrentDirectory;\n                startInfo.FileName = Application.ExecutablePath;\n                startInfo.Arguments = param;\n                startInfo.Verb = \"runas\";\n                try\n                {\n                    Process.Start(startInfo);\n                    Application.Exit();\n                }\n                catch (Exception ex)\n                {\n                    Logger.WriteLine(ex.Message);\n                }\n            }\n        }\n\n\n        public static void KillByName(string name)\n        {\n            foreach (var process in Process.GetProcessesByName(name))\n            {\n                try\n                {\n                    process.Kill();\n                    Logger.WriteLine($\"Stopped: {process.ProcessName}\");\n                }\n                catch (Exception ex)\n                {\n                    Logger.WriteLine($\"Failed to stop: {process.ProcessName} {ex.Message}\");\n                }\n            }\n        }\n\n        public static void KillByProcess(Process process)\n        {\n            try\n            {\n                process.Kill();\n                Logger.WriteLine($\"Stopped: {process.ProcessName}\");\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine($\"Failed to stop: {process.ProcessName} {ex.Message}\");\n            }\n        }\n\n        public static void StopDisableService(string serviceName, string disable = \"Disabled\")\n        {\n            try\n            {\n                string script = $\"Get-Service -Name \\\"{serviceName}\\\" | Stop-Service -Force -PassThru | Set-Service -StartupType {disable}\";\n                Logger.WriteLine(script);\n                RunCMD(\"powershell\", script);\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine(ex.ToString());\n            }\n        }\n\n        public static void StartEnableService(string serviceName, bool automatic = true)\n        {\n            try\n            {\n                string script = $\"Set-Service -Name \\\"{serviceName}\\\" -Status running\" + (automatic? \" -StartupType Automatic\":\"\");\n                Logger.WriteLine(script);\n                RunCMD(\"powershell\", script);\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine(ex.ToString());\n            }\n        }\n\n        public static string RunCMD(string name, string args, string? directory = null)\n        {\n            var cmd = new Process();\n            cmd.StartInfo.UseShellExecute = false;\n            cmd.StartInfo.CreateNoWindow = true;\n            cmd.StartInfo.RedirectStandardOutput = true;\n            cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;\n            cmd.StartInfo.FileName = name;\n            cmd.StartInfo.Arguments = args;\n            if (directory != null) cmd.StartInfo.WorkingDirectory = directory;\n            cmd.Start();\n\n\n            var watch = Stopwatch.StartNew();\n            string result = cmd.StandardOutput.ReadToEnd().Replace(Environment.NewLine, \" \").Trim(' ');\n            watch.Stop();\n            Logger.WriteLine(name + \" \" + args);\n            Logger.WriteLine(watch.ElapsedMilliseconds + \" ms: \" + result);\n            cmd.WaitForExit();\n\n            return result;\n        }\n\n        public static void SetPriority(ProcessPriorityClass priorityClass = ProcessPriorityClass.Normal)\n        {\n            try\n            {\n                using (Process p = Process.GetCurrentProcess())\n                    p.PriorityClass = priorityClass;\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine(ex.ToString());\n            }\n        }\n\n\n    }\n}\n"
  },
  {
    "path": "app/Helpers/RestrictedProcessHelper.cs",
    "content": "﻿using System.Diagnostics;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\npublic static class RestrictedProcessHelper\n{\n    /// Runs a process as a non-elevated version of the current user.\n    public static Process? RunAsRestrictedUser(string fileName, string? args = null)\n    {\n        if (string.IsNullOrWhiteSpace(fileName))\n            throw new ArgumentException(\"Value cannot be null or whitespace.\", nameof(fileName));\n\n        if (!GetRestrictedSessionUserToken(out var hRestrictedToken))\n        {\n            return null;\n        }\n\n        try\n        {\n            var si = new STARTUPINFO();\n            si.cb = Marshal.SizeOf(si);\n            si.dwFlags = 0x1;\n            si.wShowWindow = 0x00; // Set the window to be hidden\n\n            var pi = new PROCESS_INFORMATION();\n            var cmd = new StringBuilder();\n            cmd.Append('\"').Append(fileName).Append('\"');\n            if (!string.IsNullOrWhiteSpace(args))\n            {\n                cmd.Append(' ').Append(args);\n            }\n\n            Logger.WriteLine($\"Launching {cmd}\");\n\n            if (!CreateProcessAsUser(\n                hRestrictedToken,\n                null,\n                cmd,\n                IntPtr.Zero,\n                IntPtr.Zero,\n                true, // inherit handle\n                0,\n                IntPtr.Zero,\n                Path.GetDirectoryName(fileName),\n                ref si,\n                out pi))\n            {\n                return null;\n            }\n\n            return Process.GetProcessById(pi.dwProcessId);\n        }\n        finally\n        {\n            CloseHandle(hRestrictedToken);\n        }\n    }\n\n    private static bool GetRestrictedSessionUserToken(out IntPtr token)\n    {\n        token = IntPtr.Zero;\n        if (!SaferCreateLevel(SaferScope.User, SaferLevel.NormalUser, SaferOpenFlags.Open, out var hLevel, IntPtr.Zero))\n        {\n            return false;\n        }\n\n        IntPtr hRestrictedToken = IntPtr.Zero;\n        TOKEN_MANDATORY_LABEL tml = default;\n        tml.Label.Sid = IntPtr.Zero;\n        IntPtr tmlPtr = IntPtr.Zero;\n\n        try\n        {\n            if (!SaferComputeTokenFromLevel(hLevel, IntPtr.Zero, out hRestrictedToken, 0, IntPtr.Zero))\n            {\n                return false;\n            }\n\n            // Set the token to medium integrity.\n            tml.Label.Attributes = SE_GROUP_INTEGRITY;\n            tml.Label.Sid = IntPtr.Zero;\n            if (!ConvertStringSidToSid(\"S-1-16-8192\", out tml.Label.Sid))\n            {\n                return false;\n            }\n\n            tmlPtr = Marshal.AllocHGlobal(Marshal.SizeOf(tml));\n            Marshal.StructureToPtr(tml, tmlPtr, false);\n            if (!SetTokenInformation(hRestrictedToken,\n                TOKEN_INFORMATION_CLASS.TokenIntegrityLevel,\n                tmlPtr, (uint)Marshal.SizeOf(tml)))\n            {\n                return false;\n            }\n\n            token = hRestrictedToken;\n            hRestrictedToken = IntPtr.Zero; // make sure finally() doesn't close the handle\n        }\n        finally\n        {\n            SaferCloseLevel(hLevel);\n            SafeCloseHandle(hRestrictedToken);\n            if (tml.Label.Sid != IntPtr.Zero)\n            {\n                LocalFree(tml.Label.Sid);\n            }\n            if (tmlPtr != IntPtr.Zero)\n            {\n                Marshal.FreeHGlobal(tmlPtr);\n            }\n        }\n\n        return true;\n    }\n\n    [StructLayout(LayoutKind.Sequential)]\n    private struct PROCESS_INFORMATION\n    {\n        public IntPtr hProcess;\n        public IntPtr hThread;\n        public int dwProcessId;\n        public int dwThreadId;\n    }\n\n    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]\n    private struct STARTUPINFO\n    {\n        public Int32 cb;\n        public string lpReserved;\n        public string lpDesktop;\n        public string lpTitle;\n        public Int32 dwX;\n        public Int32 dwY;\n        public Int32 dwXSize;\n        public Int32 dwYSize;\n        public Int32 dwXCountChars;\n        public Int32 dwYCountChars;\n        public Int32 dwFillAttribute;\n        public Int32 dwFlags;\n        public Int16 wShowWindow;\n        public Int16 cbReserved2;\n        public IntPtr lpReserved2;\n        public IntPtr hStdInput;\n        public IntPtr hStdOutput;\n        public IntPtr hStdError;\n    }\n\n    [StructLayout(LayoutKind.Sequential)]\n    private struct SID_AND_ATTRIBUTES\n    {\n        public IntPtr Sid;\n        public uint Attributes;\n    }\n\n    [StructLayout(LayoutKind.Sequential)]\n    private struct TOKEN_MANDATORY_LABEL\n    {\n        public SID_AND_ATTRIBUTES Label;\n    }\n\n    public enum SaferLevel : uint\n    {\n        Disallowed = 0,\n        Untrusted = 0x1000,\n        Constrained = 0x10000,\n        NormalUser = 0x20000,\n        FullyTrusted = 0x40000\n    }\n\n    public enum SaferScope : uint\n    {\n        Machine = 1,\n        User = 2\n    }\n\n    [Flags]\n    public enum SaferOpenFlags : uint\n    {\n        Open = 1\n    }\n\n    [DllImport(\"advapi32\", SetLastError = true, CallingConvention = CallingConvention.StdCall)]\n    private static extern bool SaferCreateLevel(SaferScope scope, SaferLevel level, SaferOpenFlags openFlags, out IntPtr pLevelHandle, IntPtr lpReserved);\n\n    [DllImport(\"advapi32\", SetLastError = true, CallingConvention = CallingConvention.StdCall)]\n    private static extern bool SaferComputeTokenFromLevel(IntPtr LevelHandle, IntPtr InAccessToken, out IntPtr OutAccessToken, int dwFlags, IntPtr lpReserved);\n\n    [DllImport(\"advapi32\", SetLastError = true)]\n    private static extern bool SaferCloseLevel(IntPtr hLevelHandle);\n\n    [DllImport(\"advapi32.dll\", SetLastError = true, CharSet = CharSet.Unicode)]\n    private static extern bool ConvertStringSidToSid(string StringSid, out IntPtr ptrSid);\n\n    [DllImport(\"kernel32.dll\", CharSet = CharSet.Auto, SetLastError = true)]\n    [return: MarshalAs(UnmanagedType.Bool)]\n    private static extern bool CloseHandle(IntPtr hObject);\n\n    private static bool SafeCloseHandle(IntPtr hObject)\n    {\n        return (hObject == IntPtr.Zero) ? true : CloseHandle(hObject);\n    }\n\n    [DllImport(\"kernel32.dll\", SetLastError = true)]\n    static extern IntPtr LocalFree(IntPtr hMem);\n\n    enum TOKEN_INFORMATION_CLASS\n    {\n        /// <summary>\n        /// The buffer receives a TOKEN_USER structure that contains the user account of the token.\n        /// </summary>\n        TokenUser = 1,\n\n        /// <summary>\n        /// The buffer receives a TOKEN_GROUPS structure that contains the group accounts associated with the token.\n        /// </summary>\n        TokenGroups,\n\n        /// <summary>\n        /// The buffer receives a TOKEN_PRIVILEGES structure that contains the privileges of the token.\n        /// </summary>\n        TokenPrivileges,\n\n        /// <summary>\n        /// The buffer receives a TOKEN_OWNER structure that contains the default owner security identifier (SID) for newly created objects.\n        /// </summary>\n        TokenOwner,\n\n        /// <summary>\n        /// The buffer receives a TOKEN_PRIMARY_GROUP structure that contains the default primary group SID for newly created objects.\n        /// </summary>\n        TokenPrimaryGroup,\n\n        /// <summary>\n        /// The buffer receives a TOKEN_DEFAULT_DACL structure that contains the default DACL for newly created objects.\n        /// </summary>\n        TokenDefaultDacl,\n\n        /// <summary>\n        /// The buffer receives a TOKEN_SOURCE structure that contains the source of the token. TOKEN_QUERY_SOURCE access is needed to retrieve this information.\n        /// </summary>\n        TokenSource,\n\n        /// <summary>\n        /// The buffer receives a TOKEN_TYPE value that indicates whether the token is a primary or impersonation token.\n        /// </summary>\n        TokenType,\n\n        /// <summary>\n        /// The buffer receives a SECURITY_IMPERSONATION_LEVEL value that indicates the impersonation level of the token. If the access token is not an impersonation token, the function fails.\n        /// </summary>\n        TokenImpersonationLevel,\n\n        /// <summary>\n        /// The buffer receives a TOKEN_STATISTICS structure that contains various token statistics.\n        /// </summary>\n        TokenStatistics,\n\n        /// <summary>\n        /// The buffer receives a TOKEN_GROUPS structure that contains the list of restricting SIDs in a restricted token.\n        /// </summary>\n        TokenRestrictedSids,\n\n        /// <summary>\n        /// The buffer receives a DWORD value that indicates the Terminal Services session identifier that is associated with the token.\n        /// </summary>\n        TokenSessionId,\n\n        /// <summary>\n        /// The buffer receives a TOKEN_GROUPS_AND_PRIVILEGES structure that contains the user SID, the group accounts, the restricted SIDs, and the authentication ID associated with the token.\n        /// </summary>\n        TokenGroupsAndPrivileges,\n\n        /// <summary>\n        /// Reserved.\n        /// </summary>\n        TokenSessionReference,\n\n        /// <summary>\n        /// The buffer receives a DWORD value that is nonzero if the token includes the SANDBOX_INERT flag.\n        /// </summary>\n        TokenSandBoxInert,\n\n        /// <summary>\n        /// Reserved.\n        /// </summary>\n        TokenAuditPolicy,\n\n        /// <summary>\n        /// The buffer receives a TOKEN_ORIGIN value.\n        /// </summary>\n        TokenOrigin,\n\n        /// <summary>\n        /// The buffer receives a TOKEN_ELEVATION_TYPE value that specifies the elevation level of the token.\n        /// </summary>\n        TokenElevationType,\n\n        /// <summary>\n        /// The buffer receives a TOKEN_LINKED_TOKEN structure that contains a handle to another token that is linked to this token.\n        /// </summary>\n        TokenLinkedToken,\n\n        /// <summary>\n        /// The buffer receives a TOKEN_ELEVATION structure that specifies whether the token is elevated.\n        /// </summary>\n        TokenElevation,\n\n        /// <summary>\n        /// The buffer receives a DWORD value that is nonzero if the token has ever been filtered.\n        /// </summary>\n        TokenHasRestrictions,\n\n        /// <summary>\n        /// The buffer receives a TOKEN_ACCESS_INFORMATION structure that specifies security information contained in the token.\n        /// </summary>\n        TokenAccessInformation,\n\n        /// <summary>\n        /// The buffer receives a DWORD value that is nonzero if virtualization is allowed for the token.\n        /// </summary>\n        TokenVirtualizationAllowed,\n\n        /// <summary>\n        /// The buffer receives a DWORD value that is nonzero if virtualization is enabled for the token.\n        /// </summary>\n        TokenVirtualizationEnabled,\n\n        /// <summary>\n        /// The buffer receives a TOKEN_MANDATORY_LABEL structure that specifies the token's integrity level.\n        /// </summary>\n        TokenIntegrityLevel,\n\n        /// <summary>\n        /// The buffer receives a DWORD value that is nonzero if the token has the UIAccess flag set.\n        /// </summary>\n        TokenUIAccess,\n\n        /// <summary>\n        /// The buffer receives a TOKEN_MANDATORY_POLICY structure that specifies the token's mandatory integrity policy.\n        /// </summary>\n        TokenMandatoryPolicy,\n\n        /// <summary>\n        /// The buffer receives the token's logon security identifier (SID).\n        /// </summary>\n        TokenLogonSid,\n\n        /// <summary>\n        /// The maximum value for this enumeration\n        /// </summary>\n        MaxTokenInfoClass\n    }\n\n    [DllImport(\"advapi32.dll\", SetLastError = true)]\n    static extern Boolean SetTokenInformation(\n        IntPtr TokenHandle,\n        TOKEN_INFORMATION_CLASS TokenInformationClass,\n        IntPtr TokenInformation,\n        UInt32 TokenInformationLength);\n\n    const uint SE_GROUP_INTEGRITY = 0x00000020;\n\n    [DllImport(\"advapi32.dll\", SetLastError = true, CharSet = CharSet.Unicode)]\n    static extern bool CreateProcessAsUser(\n        IntPtr hToken,\n        string? lpApplicationName,\n        StringBuilder? lpCommandLine,\n        IntPtr lpProcessAttributes,\n        IntPtr lpThreadAttributes,\n        bool bInheritHandles,\n        uint dwCreationFlags,\n        IntPtr lpEnvironment,\n        string? lpCurrentDirectory,\n        ref STARTUPINFO lpStartupInfo,\n        out PROCESS_INFORMATION lpProcessInformation);\n}"
  },
  {
    "path": "app/Helpers/Startup.cs",
    "content": "﻿using GHelper.Helpers;\nusing Microsoft.Win32.TaskScheduler;\nusing System.Diagnostics;\nusing System.Reflection;\nusing System.Security.Principal;\n\npublic class Startup\n{\n\n    static string taskName = \"GHelper\";\n    static string chargeTaskName = taskName + \"Charge\";\n    static string strExeFilePath = Application.ExecutablePath.Trim();\n\n    public static bool IsScheduled()\n    {\n        try\n        {\n            using (TaskService taskService = new TaskService())\n                return (taskService.RootFolder.AllTasks.Any(t => t.Name == taskName));\n        }\n        catch (Exception e)\n        {\n            Logger.WriteLine(\"Can't check startup task status: \" + e.Message);\n            return false;\n        }\n    }\n\n    public static void ReScheduleAdmin()\n    {\n        if (ProcessHelper.IsUserAdministrator() && IsScheduled())\n        {\n            UnSchedule();\n            Schedule();\n        }\n    }\n\n    public static void StartupCheck()\n    {\n        using (TaskService taskService = new TaskService())\n        {\n            var task = taskService.RootFolder.AllTasks.FirstOrDefault(t => t.Name == taskName);\n            if (task != null)\n            {\n                try\n                {\n                    string action = task.Definition.Actions.FirstOrDefault()!.ToString().Trim();\n                    bool needsReschedule = false;\n\n                    if (!strExeFilePath.Equals(action, StringComparison.OrdinalIgnoreCase))\n                    {\n                        if (!File.Exists(action))\n                        {\n                            Logger.WriteLine(\"Startup file doesn't exist: \" + action);\n                            needsReschedule = true;\n                        }\n                        else\n                        {\n                            try\n                            {\n                                var currentVer = Assembly.GetEntryAssembly().GetName().Version;\n                                var fv = FileVersionInfo.GetVersionInfo(action).FileVersion.Split('.');\n                                var scheduledVer = new Version(\n                                    int.Parse(fv[0]),\n                                    fv.Length > 1 ? int.Parse(fv[1]) : 0,\n                                    fv.Length > 2 ? int.Parse(fv[2]) : 0,\n                                    fv.Length > 3 ? int.Parse(fv[3]) : 0\n                                );\n                                if (currentVer > scheduledVer)\n                                {\n                                    Logger.WriteLine($\"Startup file is older {scheduledVer}, current is {currentVer}\");\n                                    needsReschedule = true;\n                                }\n                            }\n                            catch (Exception ex)\n                            {\n                                Logger.WriteLine(\"Can't compare assembly versions: \" + ex.Message);\n                            }\n                        }\n                    }\n\n                    if (needsReschedule)\n                    {\n                        if (task.Definition.Principal.RunLevel == TaskRunLevel.Highest && !ProcessHelper.IsUserAdministrator())\n                        {\n                            ProcessHelper.RunAsAdmin();\n                            return;\n                        }\n                        Logger.WriteLine(\"Rescheduling to: \" + strExeFilePath);\n                        UnSchedule();\n                        Schedule();\n                    }\n                }\n                catch (Exception ex)\n                {\n                    Logger.WriteLine($\"Can't check startup task: {ex.Message}\");\n                }\n\n                if (taskService.RootFolder.AllTasks.FirstOrDefault(t => t.Name == chargeTaskName) == null) ScheduleCharge();\n\n            }\n        }\n    }\n\n    public static void UnscheduleCharge()\n    {\n        using (TaskService taskService = new TaskService())\n        {\n            try\n            {\n                taskService.RootFolder.DeleteTask(chargeTaskName);\n            }\n            catch (Exception e)\n            {\n                Logger.WriteLine(\"Can't remove charge limit task: \" + e.Message);\n            }\n        }\n    }\n\n    public static void ScheduleCharge()\n    {\n\n        if (strExeFilePath is null) return;\n\n        using (TaskDefinition td = TaskService.Instance.NewTask())\n        {\n            td.RegistrationInfo.Description = \"G-Helper Charge Limit\";\n            td.Triggers.Add(new BootTrigger());\n            td.Triggers.Add(new EventTrigger\n            {\n                Subscription = \"<QueryList><Query Id='0' Path='System'><Select Path='System'>*[System[Provider[@Name='Microsoft-Windows-Kernel-Boot'] and EventID=27]]</Select></Query></QueryList>\"\n            }); \n            td.Actions.Add(strExeFilePath, \"charge\");\n\n            td.Principal.UserId = \"SYSTEM\";\n            td.Principal.LogonType = TaskLogonType.ServiceAccount;\n            td.Principal.RunLevel = TaskRunLevel.Highest;\n\n            td.Settings.MultipleInstances = TaskInstancesPolicy.IgnoreNew;\n            td.Settings.StopIfGoingOnBatteries = false;\n            td.Settings.DisallowStartIfOnBatteries = false;\n            td.Settings.ExecutionTimeLimit = TimeSpan.FromSeconds(30);\n\n            try\n            {\n                TaskService.Instance.RootFolder.RegisterTaskDefinition(chargeTaskName, td);\n                Logger.WriteLine(\"Charge limit task scheduled: \" + strExeFilePath);\n            }\n            catch (Exception e)\n            {\n                Logger.WriteLine(\"Can't create a charge limit task: \" + e.Message);\n            }\n        }\n    }\n\n    public static void Schedule()\n    {\n\n        using (TaskDefinition td = TaskService.Instance.NewTask())\n        {\n\n            td.RegistrationInfo.Description = \"G-Helper Auto Start\";\n            td.Triggers.Add(new LogonTrigger { Delay = TimeSpan.FromSeconds(1) });\n            td.Actions.Add(strExeFilePath);\n\n            td.Principal.LogonType = TaskLogonType.InteractiveToken;\n            if (ProcessHelper.IsUserAdministrator())\n                td.Principal.RunLevel = TaskRunLevel.Highest;\n\n            td.Settings.StopIfGoingOnBatteries = false;\n            td.Settings.DisallowStartIfOnBatteries = false;\n            td.Settings.ExecutionTimeLimit = TimeSpan.Zero;\n\n            try\n            {\n                TaskService.Instance.RootFolder.RegisterTaskDefinition(taskName, td);\n            }\n            catch (Exception e)\n            {\n                if (ProcessHelper.IsUserAdministrator())\n                    MessageBox.Show(\"Can't create a start up task. Try running Task Scheduler by hand and manually deleting GHelper task if it exists there.\", \"Scheduler Error\", MessageBoxButtons.OK);\n                else\n                    ProcessHelper.RunAsAdmin();\n            }\n\n            Logger.WriteLine(\"Startup task scheduled: \" + strExeFilePath);\n        }\n\n        ScheduleCharge();\n\n    }\n\n    public static void UnSchedule()\n    {\n        using (TaskService taskService = new TaskService())\n        {\n            try\n            {\n                taskService.RootFolder.DeleteTask(taskName);\n            }\n            catch (Exception e)\n            {\n                if (ProcessHelper.IsUserAdministrator())\n                    MessageBox.Show(\"Can't remove task. Try running Task Scheduler by hand and manually deleting GHelper task if it exists there.\", \"Scheduler Error\", MessageBoxButtons.OK);\n                else\n                    ProcessHelper.RunAsAdmin();\n            }\n        }\n\n        UnscheduleCharge();\n    }\n}\n"
  },
  {
    "path": "app/Helpers/ToastForm.cs",
    "content": "﻿using System.Diagnostics;\nusing System.Drawing.Drawing2D;\n\nnamespace GHelper.Helpers\n{\n\n    static class Drawing\n    {\n\n        public static GraphicsPath RoundedRect(Rectangle bounds, int radius)\n        {\n            int diameter = radius * 2;\n            Size size = new Size(diameter, diameter);\n            Rectangle arc = new Rectangle(bounds.Location, size);\n            GraphicsPath path = new GraphicsPath();\n\n            if (radius == 0)\n            {\n                path.AddRectangle(bounds);\n                return path;\n            }\n\n            path.AddArc(arc, 180, 90);\n            arc.X = bounds.Right - diameter;\n            path.AddArc(arc, 270, 90);\n            arc.Y = bounds.Bottom - diameter;\n            path.AddArc(arc, 0, 90);\n            arc.X = bounds.Left;\n            path.AddArc(arc, 90, 90);\n            path.CloseFigure();\n            return path;\n        }\n\n        public static void FillRoundedRectangle(this Graphics graphics, Brush brush, Rectangle bounds, int cornerRadius)\n        {\n            using (GraphicsPath path = RoundedRect(bounds, cornerRadius))\n            {\n                graphics.FillPath(brush, path);\n            }\n        }\n    }\n\n    public enum ToastIcon\n    {\n        BrightnessUp,\n        BrightnessDown,\n        BacklightUp,\n        BacklightDown,\n        Touchpad,\n        Microphone,\n        MicrophoneMute,\n        FnLock,\n        Battery,\n        Charger,\n        Controller\n    }\n\n    public class ToastForm : OSDNativeForm\n    {\n\n        protected static string toastText = \"Balanced\";\n        protected static ToastIcon? toastIcon = null;\n\n        protected static System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();\n\n        public ToastForm()\n        {\n            timer.Tick += timer_Tick;\n            timer.Enabled = false;\n            timer.Interval = 2000;\n        }\n\n        protected override void PerformPaint(PaintEventArgs e)\n        {\n            Brush brush = new SolidBrush(Color.FromArgb(150, Color.Black));\n\n            e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;\n            e.Graphics.FillRoundedRectangle(brush, Bound, 10);\n\n            StringFormat format = new StringFormat();\n            format.LineAlignment = StringAlignment.Center;\n            format.Alignment = StringAlignment.Center;\n\n            Bitmap? icon = null;\n\n            switch (toastIcon)\n            {\n                case ToastIcon.BrightnessUp:\n                    icon = Properties.Resources.brightness_up;\n                    break;\n                case ToastIcon.BrightnessDown:\n                    icon = Properties.Resources.brightness_down;\n                    break;\n                case ToastIcon.BacklightUp:\n                    icon = Properties.Resources.backlight_up;\n                    break;\n                case ToastIcon.BacklightDown:\n                    icon = Properties.Resources.backlight_down;\n                    break;\n                case ToastIcon.Microphone:\n                    icon = Properties.Resources.icons8_microphone_96;\n                    break;\n                case ToastIcon.MicrophoneMute:\n                    icon = Properties.Resources.icons8_mute_unmute_96;\n                    break;\n                case ToastIcon.Touchpad:\n                    icon = Properties.Resources.icons8_touchpad_96;\n                    break;\n                case ToastIcon.FnLock:\n                    icon = Properties.Resources.icons8_function;\n                    break;\n                case ToastIcon.Battery:\n                    icon = Properties.Resources.icons8_charged_battery_96;\n                    break;\n                case ToastIcon.Charger:\n                    icon = Properties.Resources.icons8_charging_battery_96;\n                    break;\n                case ToastIcon.Controller:\n                    icon = Properties.Resources.icons8_controller_96;\n                    break;\n\n            }\n\n            int shiftX = 0;\n\n            if (icon is not null)\n            {\n                e.Graphics.DrawImage(icon, 18, 18, 64, 64);\n                shiftX = 40;\n            }\n\n            e.Graphics.DrawString(toastText,\n                new Font(\"Segoe UI\", 36f, FontStyle.Bold, GraphicsUnit.Pixel),\n                new SolidBrush(Color.White),\n                new PointF(Bound.Width / 2 + shiftX, Bound.Height / 2),\n            format);\n\n        }\n\n        public static void ReadText(string text)\n        {\n            ProcessStartInfo startInfo = new ProcessStartInfo();\n            startInfo.FileName = \"PowerShell.exe\";\n            startInfo.Arguments = $\"-Command \\\"Add-Type -AssemblyName System.Speech; (New-Object System.Speech.Synthesis.SpeechSynthesizer).Speak('{text}')\\\"\";\n            startInfo.CreateNoWindow = true;\n            Process.Start(startInfo);\n        }\n\n\n        public void RunToast(string text, ToastIcon? icon = null)\n        {\n\n            if (AppConfig.Is(\"disable_osd\")) return;\n\n            Program.settingsForm.Invoke(delegate\n            {\n                //Hide();\n                timer.Stop();\n\n                toastText = text;\n                toastIcon = icon;\n\n                Screen screen1 = Screen.FromHandle(Handle);\n\n                Width = Math.Max(300, 100 + toastText.Length * 22);\n                Height = 100;\n                X = (screen1.Bounds.Width - Width) / 2;\n                Y = screen1.Bounds.Height - 300 - Height;\n\n                Show();\n                timer.Start();\n\n                //if (AppConfig.Is(\"narrator\")) ReadText(text);\n\n                Program.settingsForm.AccessibilityObject.RaiseAutomationNotification(\n                    System.Windows.Forms.Automation.AutomationNotificationKind.ActionCompleted,\n                    System.Windows.Forms.Automation.AutomationNotificationProcessing.MostRecent,\n                    text);\n\n            });\n\n        }\n\n        private void timer_Tick(object? sender, EventArgs e)\n        {\n            //Debug.WriteLine(\"Toast end\");\n            Hide();\n            timer.Stop();\n        }\n    }\n}\n"
  },
  {
    "path": "app/Helpers/TouchscreenHelper.cs",
    "content": "﻿using GHelper.Helpers;\n\npublic static class TouchscreenHelper\n{\n\n    public static bool? GetStatus()\n    {\n        try\n        {\n            ProcessHelper.RunAsAdmin();\n            return ProcessHelper.RunCMD(\"powershell\", \"(Get-PnpDevice -FriendlyName '*touch*screen*').Status\").Contains(\"OK\");\n        }\n        catch (Exception ex)\n        {\n            Logger.WriteLine($\"Can't get touchscreen status: {ex.Message}\");\n            return null;\n        }\n    }\n\n    public static void ToggleTouchscreen(bool status)\n    {\n        try\n        {\n            ProcessHelper.RunAsAdmin();\n            ProcessHelper.RunCMD(\"powershell\", (status ? \"Enable-PnpDevice\" : \"Disable-PnpDevice\") + \" -InstanceId (Get-PnpDevice -FriendlyName '*touch*screen*').InstanceId -Confirm:$false\");\n        }\n        catch (Exception ex)\n        {\n            Logger.WriteLine($\"Can't toggle touchscreen: {ex.Message}\");\n        }\n\n    }\n}\n"
  },
  {
    "path": "app/Input/InputDispatcher.cs",
    "content": "using GHelper.Display;\nusing GHelper.Helpers;\nusing GHelper.Mode;\nusing GHelper.USB;\nusing Microsoft.Win32;\nusing System.Diagnostics;\nusing System.Management;\nusing System.Text.RegularExpressions;\n\nnamespace GHelper.Input\n{\n\n    public class InputDispatcher\n    {\n        System.Timers.Timer timer = new System.Timers.Timer(AppConfig.Get(\"keyboard_timeout_refresh\", 1000));\n        public static bool backlightActivity = true;\n        public static bool lidClose = false;\n        public static bool tentMode = false;\n        private static bool? _fnLock = null;\n        private static string? _asusPath = null;\n\n        private static long lastSleep;\n\n        public static Keys keyProfile = (Keys)AppConfig.Get(\"keybind_profile\", (int)Keys.F5);\n        public static Keys keyApp = (Keys)AppConfig.Get(\"keybind_app\", (int)Keys.F12);\n\n        public static Keys keyProfile0 = (Keys)AppConfig.Get(\"keybind_profile_0\", (int)Keys.F17);\n        public static Keys keyProfile1 = (Keys)AppConfig.Get(\"keybind_profile_1\", (int)Keys.F18);\n        public static Keys keyProfile2 = (Keys)AppConfig.Get(\"keybind_profile_2\", (int)Keys.F16);\n        public static Keys keyProfile3 = (Keys)AppConfig.Get(\"keybind_profile_3\", (int)Keys.F19);\n        public static Keys keyProfile4 = (Keys)AppConfig.Get(\"keybind_profile_4\", (int)Keys.F20);\n        public static Keys keyXGM = (Keys)AppConfig.Get(\"keybind_xgm\", (int)Keys.F21);\n\n        public static ModifierKeys keyModifier = GetModifierKeys(\"modifier_keybind\", ModifierKeys.Shift | ModifierKeys.Control);\n        public static ModifierKeys keyModifierAlt = GetModifierKeys(\"modifier_keybind_alt\", ModifierKeys.Shift | ModifierKeys.Control | ModifierKeys.Alt);\n\n        static ModeControl modeControl = Program.modeControl;\n\n        static bool isTUF = AppConfig.IsTUF();\n\n        KeyboardListener listener;\n        KeyboardHook hook = new KeyboardHook();\n\n        public InputDispatcher()\n        {\n\n            byte[] result = Program.acpi.DeviceInit();\n            Debug.WriteLine($\"Init: {BitConverter.ToString(result)}\");\n\n            Program.acpi.SubscribeToEvents(WatcherEventArrived);\n            //Task.Run(Program.acpi.RunListener);\n\n            hook.KeyPressed += new EventHandler<KeyPressedEventArgs>(KeyPressed);\n\n            RegisterKeys();\n\n            timer.Elapsed += Timer_Elapsed;\n\n        }\n\n        private void Timer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)\n        {\n            if (GetBacklight() == 0) return;\n\n            TimeSpan iddle = NativeMethods.GetIdleTime();\n            int kb_timeout;\n\n            if (SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online)\n                kb_timeout = AppConfig.Get(\"keyboard_ac_timeout\", 0);\n            else\n                kb_timeout = AppConfig.Get(\"keyboard_timeout\", 60);\n\n            if (kb_timeout == 0) return;\n\n            if (backlightActivity && iddle.TotalSeconds > kb_timeout)\n            {\n                backlightActivity = false;\n                Aura.ApplyBrightness(0, \"Timeout\");\n            }\n\n            if (!backlightActivity && iddle.TotalSeconds < kb_timeout)\n            {\n                backlightActivity = true;\n                SetBacklightAuto();\n            }\n\n            //Logger.WriteLine(\"Iddle: \" + iddle.TotalSeconds);\n        }\n\n        public void Init()\n        {\n            if (listener is not null) listener.Dispose();\n\n            Program.acpi.DeviceInit();\n\n            if (!AsusService.IsAsusOptimizationRunning())\n            {\n                Program.acpi.DeviceGet(AsusACPI.CameraShutter);\n                listener = new KeyboardListener(HandleEvent);\n            }\n            else\n            {\n                Logger.WriteLine(\"Optimization service is running\");\n            }\n\n            InitBacklightTimer();\n            MuteLEDInit();\n            InitCamera();\n        }\n\n        public static void InitFNLock()\n        {\n            if (IsHardwareFnLock()) HardwareFnLock(AppConfig.Is(\"fn_lock\"));\n        }\n\n        public void InitBacklightTimer()\n        {\n            timer.Enabled = AppConfig.Get(\"keyboard_timeout\") > 0 && SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Online ||\n                            AppConfig.Get(\"keyboard_ac_timeout\") > 0 && SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online;\n        }\n\n        private static ModifierKeys GetModifierKeys(string configKey, ModifierKeys defaultModifiers)\n        {\n            string configValue = AppConfig.GetString(configKey, \"\");\n                \n            if (string.IsNullOrWhiteSpace(configValue))\n                return defaultModifiers;\n\n            ModifierKeys modifiers = ModifierKeys.None;\n            HashSet<string> keys = new HashSet<string>(configValue.Split('-'), StringComparer.OrdinalIgnoreCase);\n\n            if (keys.Contains(\"win\")) modifiers |= ModifierKeys.Win;\n            if (keys.Contains(\"shift\")) modifiers |= ModifierKeys.Shift;\n            if (keys.Contains(\"control\")) modifiers |= ModifierKeys.Control;\n            if (keys.Contains(\"alt\")) modifiers |= ModifierKeys.Alt;\n\n            return modifiers;\n        }\n\n        public void RegisterKeys()\n        {\n            hook.UnregisterAll();\n\n            string actionM1 = AppConfig.GetString(\"m1\");\n            string actionM2 = AppConfig.GetString(\"m2\");\n\n            if (keyProfile != Keys.None)\n            {\n                hook.RegisterHotKey(keyModifier, keyProfile);\n                hook.RegisterHotKey(keyModifierAlt, keyProfile);\n            }\n\n            if (keyApp != Keys.None) hook.RegisterHotKey(keyModifier, keyApp);\n\n            if (!AppConfig.Is(\"skip_hotkeys\"))\n            {\n                if (AppConfig.IsDUO() || (AppConfig.IsVivoZenbook() && AppConfig.IsOLED()))\n                {\n                    hook.RegisterHotKey(keyModifierAlt, Keys.F7);\n                    hook.RegisterHotKey(keyModifierAlt, Keys.F8);\n                }\n\n                hook.RegisterHotKey(keyModifierAlt, Keys.F13);\n\n                hook.RegisterHotKey(keyModifierAlt, Keys.F14);\n                hook.RegisterHotKey(keyModifierAlt, Keys.F15);\n\n                hook.RegisterHotKey(keyModifierAlt, keyProfile0);\n                hook.RegisterHotKey(keyModifierAlt, keyProfile1);\n                hook.RegisterHotKey(keyModifierAlt, keyProfile2);\n                hook.RegisterHotKey(keyModifierAlt, keyProfile3);\n                hook.RegisterHotKey(keyModifierAlt, keyProfile4);\n                hook.RegisterHotKey(keyModifierAlt, keyXGM);\n\n                hook.RegisterHotKey(ModifierKeys.Control, Keys.VolumeDown);\n                hook.RegisterHotKey(ModifierKeys.Control, Keys.VolumeUp);\n                hook.RegisterHotKey(ModifierKeys.Shift, Keys.VolumeDown);\n                hook.RegisterHotKey(ModifierKeys.Shift, Keys.VolumeUp);\n                hook.RegisterHotKey(keyModifier, Keys.F20);\n            }\n\n            if (!AppConfig.IsZ13() && !AppConfig.IsAlly() && !AppConfig.IsVivoZenPro())\n            {\n                if (actionM1 is not null && actionM1.Length > 0) hook.RegisterHotKey(ModifierKeys.None, Keys.VolumeDown);\n                if (actionM2 is not null && actionM2.Length > 0) hook.RegisterHotKey(ModifierKeys.None, Keys.VolumeUp);\n            }\n\n            if (AppConfig.IsAlly())\n            {\n                hook.RegisterHotKey(keyModifierAlt, Keys.F1);\n                hook.RegisterHotKey(keyModifierAlt, Keys.F2);\n                hook.RegisterHotKey(keyModifierAlt, Keys.F3);\n                hook.RegisterHotKey(keyModifierAlt, Keys.F4);\n                hook.RegisterHotKey(keyModifierAlt, Keys.F6);\n                hook.RegisterHotKey(keyModifierAlt, Keys.F9);\n            }\n\n            // FN-Lock group\n\n            if (AppConfig.Is(\"fn_lock\") && !IsHardwareFnLock())\n                for (Keys i = Keys.F1; i <= Keys.F11; i++) hook.RegisterHotKey(ModifierKeys.None, i);\n\n            // Arrow-lock group\n            if (AppConfig.Is(\"arrow_lock\") && AppConfig.IsDUO())\n            {\n                hook.RegisterHotKey(ModifierKeys.None, Keys.Left);\n                hook.RegisterHotKey(ModifierKeys.None, Keys.Right);\n                hook.RegisterHotKey(ModifierKeys.None, Keys.Up);\n                hook.RegisterHotKey(ModifierKeys.None, Keys.Down);\n            }\n\n        }\n\n\n        public static int[] ParseHexValues(string input)\n        {\n            string pattern = @\"\\b(0x[0-9A-Fa-f]{1,2}|[0-9A-Fa-f]{1,2})\\b\";\n\n            if (!Regex.IsMatch(input, $\"^{pattern}(\\\\s+{pattern})*$\")) return new int[0];\n\n            MatchCollection matches = Regex.Matches(input, pattern);\n\n            int[] hexValues = new int[matches.Count];\n\n            for (int i = 0; i < matches.Count; i++)\n            {\n                string hexValueStr = matches[i].Value;\n                int hexValue = int.Parse(hexValueStr.StartsWith(\"0x\", StringComparison.OrdinalIgnoreCase)\n                    ? hexValueStr.Substring(2)\n                    : hexValueStr, System.Globalization.NumberStyles.HexNumber);\n\n                hexValues[i] = hexValue;\n            }\n\n            return hexValues;\n        }\n\n\n        static void CustomKey(string configKey = \"m3\")\n        {\n            string command = AppConfig.GetString(configKey + \"_custom\");\n            int[] hexKeys = new int[0];\n\n            try\n            {\n                hexKeys = ParseHexValues(command);\n            }\n            catch\n            {\n            }\n\n            switch (hexKeys.Length)\n            {\n                case 1:\n                    KeyboardHook.KeyPress((Keys)hexKeys[0]);\n                    break;\n                case 2:\n                    KeyboardHook.KeyKeyPress((Keys)hexKeys[0], (Keys)hexKeys[1]);\n                    break;\n                case 3:\n                    KeyboardHook.KeyKeyKeyPress((Keys)hexKeys[0], (Keys)hexKeys[1], (Keys)hexKeys[2]);\n                    break;\n                case 4:\n                    KeyboardHook.KeyKeyKeyKeyPress((Keys)hexKeys[0], (Keys)hexKeys[1], (Keys)hexKeys[2], (Keys)hexKeys[3]);\n                    break;\n                default:\n                    LaunchProcess(command);\n                    break;\n            }\n\n        }\n\n\n        static void SetBrightness(bool up, bool hotkey = false)\n        {\n            int brightness = -1;\n\n            if (isTUF) brightness = ScreenBrightness.Get();\n            if (AppConfig.SwappedBrightness() && !hotkey) up = !up;\n\n            int step = AppConfig.Get(\"brightness_step\", 10);\n            if (step != 10)\n            {\n                Program.toast.RunToast(ScreenBrightness.Adjust(up ? step : -step) + \"%\", up ? ToastIcon.BrightnessUp : ToastIcon.BrightnessDown);\n                return;\n            }\n\n            Program.acpi.DeviceSet(AsusACPI.UniversalControl, up ? AsusACPI.Brightness_Up : AsusACPI.Brightness_Down, \"Brightness\");\n\n            if (isTUF)\n            {\n                if (AppConfig.SwappedBrightness()) return;\n                if (!up && brightness <= 0) return;\n                if (up && brightness >= 100) return;\n\n                Thread.Sleep(100);\n                if (brightness == ScreenBrightness.Get())\n                    Program.toast.RunToast(ScreenBrightness.Adjust(up ? step : -step) + \"%\", up ? ToastIcon.BrightnessUp : ToastIcon.BrightnessDown);\n            }\n\n        }\n\n        static void SetBrightnessDimming(int delta)\n        {\n            int brightness = VisualControl.SetBrightness(delta: delta);\n            if (brightness >= 0)\n                Program.toast.RunToast(brightness + \"%\", (delta < 0) ? ToastIcon.BrightnessDown : ToastIcon.BrightnessUp);\n        }\n\n        public void KeyPressed(object sender, KeyPressedEventArgs e)\n        {\n\n            Logger.WriteLine(e.Key.ToString() + \" \" + e.Modifier.ToString());\n\n            if (e.Modifier == ModifierKeys.None)\n            {\n                if (AppConfig.NoMKeys())\n                {\n                    switch (e.Key)\n                    {\n                        case Keys.F2:\n                            KeyboardHook.KeyPress(Keys.VolumeDown);\n                            return;\n                        case Keys.F3:\n                            KeyboardHook.KeyPress(Keys.VolumeUp);\n                            return;\n                        case Keys.F4:\n                            ToggleMic();\n                            return;\n                    }\n                }\n\n                if (AppConfig.IsProArt())\n                {\n                    switch (e.Key)\n                    {\n                        case Keys.F2:\n                            KeyboardHook.KeyPress(Keys.VolumeDown);\n                            return;\n                        case Keys.F3:\n                            KeyboardHook.KeyPress(Keys.VolumeUp);\n                            return;\n                        case Keys.F4:\n                            HandleEvent(199); // Backlight cycle\n                            return;\n                        case Keys.F5:\n                            SetBrightness(false);\n                            return;\n                        case Keys.F6:\n                            SetBrightness(true);\n                            return;\n                        case Keys.F7:\n                            KeyboardHook.KeyKeyPress(Keys.LWin, Keys.P);\n                            return;\n                        case Keys.F8:\n                            HandleEvent(126); // Emojis\n                            return;\n                        case Keys.F9:\n                            ToggleMic(); // MicMute\n                            return;\n                        case Keys.F10:\n                            HandleEvent(133); // Camera Toggle\n                            return;\n                        case Keys.F11:\n                            KeyboardHook.KeyPress(Keys.Snapshot); // PrintScreen\n                            return;\n                    }\n                }\n\n                if (AppConfig.IsZ13() || AppConfig.IsDUO())\n                {\n                    switch (e.Key)\n                    {\n                        case Keys.F11:\n                            HandleEvent(199);\n                            return;\n                    }\n                }\n\n                if (AppConfig.MediaKeys())\n                {\n                    switch (e.Key)\n                    {\n                        case Keys.F2:\n                            KeyboardHook.KeyPress(Keys.MediaPreviousTrack);\n                            return;\n                        case Keys.F3:\n                            KeyboardHook.KeyPress(Keys.MediaPlayPause);\n                            return;\n                        case Keys.F4:\n                            KeyboardHook.KeyPress(Keys.MediaNextTrack);\n                            return;\n                    }\n                }\n\n\n                switch (e.Key)\n                {\n                    case Keys.F1:\n                        KeyboardHook.KeyPress(Keys.VolumeMute);\n                        break;\n                    case Keys.F2:\n                        SetBacklight(-1, true);\n                        break;\n                    case Keys.F3:\n                        SetBacklight(1, true);\n                        break;\n                    case Keys.F4:\n                        KeyProcess(\"fnf4\");\n                        break;\n                    case Keys.F5:\n                        KeyProcess(\"fnf5\");\n                        break;\n                    case Keys.F6:\n                        KeyboardHook.KeyPress(Keys.Snapshot);\n                        break;\n                    case Keys.F7:\n                        SetBrightness(false);\n                        break;\n                    case Keys.F8:\n                        SetBrightness(true);\n                        break;\n                    case Keys.F9:\n                        KeyboardHook.KeyKeyPress(Keys.LWin, Keys.P);\n                        break;\n                    case Keys.F10:\n                        ToggleTouchpadEvent(true);\n                        break;\n                    case Keys.F11:\n                        SleepEvent();\n                        break;\n                    case Keys.VolumeDown:\n                        KeyProcess(\"m1\");\n                        break;\n                    case Keys.VolumeUp:\n                        KeyProcess(\"m2\");\n                        break;\n                    case Keys.Left:\n                        KeyboardHook.KeyPress(Keys.Home);\n                        break;\n                    case Keys.Right:\n                        KeyboardHook.KeyPress(Keys.End);\n                        break;\n                    case Keys.Up:\n                        KeyboardHook.KeyPress(Keys.PageUp);\n                        break;\n                    case Keys.Down:\n                        KeyboardHook.KeyPress(Keys.PageDown);\n                        break;\n                    default:\n                        break;\n                }\n\n            }\n\n            if (e.Modifier == keyModifier)\n            {\n                if (e.Key == keyProfile) modeControl.CyclePerformanceMode();\n                if (e.Key == keyApp) Program.SettingsToggle();\n                if (e.Key == Keys.F20) ToggleMic();\n            }\n\n            if (e.Modifier == keyModifierAlt)\n            {\n                if (e.Key == keyProfile) modeControl.CyclePerformanceMode(true);\n\n                if (e.Key == keyProfile0) modeControl.SetPerformanceMode(0, true);\n                if (e.Key == keyProfile1) modeControl.SetPerformanceMode(1, true);\n                if (e.Key == keyProfile2) modeControl.SetPerformanceMode(2, true);\n                if (e.Key == keyProfile3) modeControl.SetPerformanceMode(3, true);\n                if (e.Key == keyProfile4) modeControl.SetPerformanceMode(4, true);\n                if (e.Key == keyXGM) Program.settingsForm.gpuControl.ToggleXGM(true);\n\n                switch (e.Key)\n                {\n                    case Keys.F1:\n                        SetBrightness(false);\n                        break;\n                    case Keys.F2:\n                        SetBrightness(true);\n                        break;\n                    case Keys.F3:\n                        Program.settingsForm.gpuControl.ToggleXGM(true);\n                        break;\n                    case Keys.F4:\n                        Program.settingsForm.BeginInvoke(Program.settingsForm.allyControl.ToggleModeHotkey);\n                        break;\n                    case Keys.F6:\n                        ToggleTouchScreen();\n                        break;\n                    case Keys.F7:\n                        if (AppConfig.IsDUO()) SetScreenpad(-10);\n                        else SetBrightnessDimming(-10);\n                        break;\n                    case Keys.F8:\n                        if (AppConfig.IsDUO()) SetScreenpad(10);\n                        else SetBrightnessDimming(10);\n                        break;\n                    case Keys.F9:\n                        Program.settingsForm.BeginInvoke(Program.settingsForm.allyControl.ToggleFPSLimit, true);\n                        break;\n                    case Keys.F13:\n                        ToggleScreenRate();\n                        break;\n                    case Keys.F14:\n                        Program.toast.RunToast(Properties.Strings.EcoMode);\n                        Program.settingsForm.gpuControl.SetGPUMode(AsusACPI.GPUModeEco);\n                        break;\n                    case Keys.F15:\n                        Program.toast.RunToast(Properties.Strings.StandardMode);\n                        Program.settingsForm.gpuControl.SetGPUMode(AsusACPI.GPUModeStandard);\n                        break;\n                }\n            }\n\n\n            if (e.Modifier == (ModifierKeys.Control))\n            {\n                switch (e.Key)\n                {\n                    case Keys.VolumeDown:\n                        // Screen brightness down on CTRL+VolDown\n                        SetBrightness(false);\n                        break;\n                    case Keys.VolumeUp:\n                        // Screen brightness up on CTRL+VolUp\n                        SetBrightness(true);\n                        break;\n                }\n            }\n\n            if (e.Modifier == (ModifierKeys.Shift))\n            {\n                switch (e.Key)\n                {\n                    case Keys.VolumeDown:\n                        // Keyboard backlight down on SHIFT+VolDown\n                        SetBacklight(-1);\n                        break;\n                    case Keys.VolumeUp:\n                        // Keyboard backlight up on SHIFT+VolUp\n                        SetBacklight(1);\n                        break;\n                }\n            }\n        }\n\n\n        public static void KeyProcess(string name = \"m3\")\n        {\n            string action = AppConfig.GetString(name);\n\n            if (action is null || action.Length <= 1)\n            {\n                if (name == \"m4\")\n                    action = \"ghelper\";\n                if (name == \"fnf4\")\n                    action = \"aura\";\n                if (name == \"fnf5\")\n                    action = \"performance\";\n                if (name == \"m3\" && !AsusService.IsAsusOptimizationRunning())\n                    action = \"micmute\";\n                if (name == \"fnc\")\n                    action = \"fnlock\";\n                if (name == \"fnv\")\n                    action = \"visual\";\n                if (name == \"fne\")\n                    action = \"calculator\";\n            }\n\n            switch (action)\n            {\n                case \"mute\":\n                    KeyboardHook.KeyPress(Keys.VolumeMute);\n                    break;\n                case \"play\":\n                    KeyboardHook.KeyPress(Keys.MediaPlayPause);\n                    break;\n                case \"screenshot\":\n                    KeyboardHook.KeyPress(Keys.Snapshot);\n                    break;\n                case \"lock\":\n                    Logger.WriteLine(\"Screen lock\");\n                    NativeMethods.LockScreen();\n                    break;\n                case \"screen\":\n                    Logger.WriteLine(\"Screen off toggle\");\n                    NativeMethods.TurnOffScreen();\n                    break;\n                case \"miniled\":\n                    if (ScreenCCD.GetHDRStatus()) return;\n                    string miniledName = ScreenControl.ToogleMiniled();\n                    Program.toast.RunToast(miniledName, miniledName == Properties.Strings.OneZone ? ToastIcon.BrightnessDown : ToastIcon.BrightnessUp);\n                    break;\n                case \"aura\":\n                    Program.settingsForm.BeginInvoke(Program.settingsForm.CycleAuraMode, Control.ModifierKeys == Keys.Shift ? -1 : 1);\n                    break;\n                case \"visual\":\n                    Program.settingsForm.BeginInvoke(Program.settingsForm.CycleVisualMode, Control.ModifierKeys == Keys.Shift ? -1 : 1);\n                    break;\n                case \"performance\":\n                    modeControl.CyclePerformanceMode(Control.ModifierKeys == Keys.Shift);\n                    break;\n                case \"ghelper\":\n                    try\n                    {\n                        Program.settingsForm.BeginInvoke(delegate\n                        {\n                            Program.SettingsToggle();\n                        });\n                    }\n                    catch (Exception ex)\n                    {\n                        Debug.WriteLine(ex);\n                    }\n                    break;\n                case \"fnlock\":\n                    ToggleFnLock();\n                    break;\n                case \"micmute\":\n                    ToggleMic();\n                    break;\n                case \"brightness_up\":\n                    SetBrightness(true);\n                    break;\n                case \"brightness_down\":\n                    SetBrightness(false);\n                    break;\n                case \"screenpad_up\":\n                    SetScreenpad(10);\n                    break;\n                case \"screenpad_down\":\n                    SetScreenpad(-10);\n                    break;\n                case \"custom\":\n                    CustomKey(name);\n                    break;\n                case \"calculator\":\n                    LaunchProcess(\"calc\");\n                    break;\n                case \"controller\":\n                    Program.settingsForm.BeginInvoke(Program.settingsForm.allyControl.ToggleModeHotkey);\n                    break;\n                case \"touchscreen\":\n                    ToggleTouchScreen();\n                    break;\n                default:\n                    break;\n            }\n        }\n\n\n        static void MuteLED()\n        {\n            Thread.Sleep(500);\n            Program.acpi.DeviceSet(AsusACPI.SoundMuteLed, Audio.IsMuted() ? 1 : 0, \"SoundLed\");\n        }\n\n        static void ToggleTouchScreen()\n        {\n            var status = !TouchscreenHelper.GetStatus();\n            Logger.WriteLine(\"Touchscreen status: \" + status);\n            if (status is not null)\n            {\n                Program.toast.RunToast(Properties.Strings.Touchscreen + \" \" + ((bool)status ? Properties.Strings.On : Properties.Strings.Off), ToastIcon.Touchpad);\n                TouchscreenHelper.ToggleTouchscreen((bool)status);\n            }\n        }\n\n        static void ToggleMic()\n        {\n            bool muteStatus = Audio.ToggleMicMute();\n            Program.toast.RunToast(muteStatus ? Properties.Strings.Muted : Properties.Strings.Unmuted, muteStatus ? ToastIcon.MicrophoneMute : ToastIcon.Microphone);\n            if (AppConfig.IsVivoZenbook()) Program.acpi.DeviceSet(AsusACPI.MicMuteLed, muteStatus ? 1 : 0, \"MicmuteLed\");\n        }\n\n        static void MuteLEDInit()\n        {\n            if (!AppConfig.IsVivoZenbook()) return;\n            if (Program.acpi.DeviceGet(AsusACPI.MicMuteLed) >= 0) Program.acpi.DeviceSet(AsusACPI.MicMuteLed, Audio.IsMicMuted() ? 1 : 0, \"MicmuteLedInit\");\n            if (Program.acpi.DeviceGet(AsusACPI.SoundMuteLed) >= 0) Program.acpi.DeviceSet(AsusACPI.SoundMuteLed, Audio.IsMuted() ? 1 : 0, \"SoundLedInit\");\n        }\n\n        static bool GetTouchpadState()\n        {\n            using (var key = Registry.CurrentUser.OpenSubKey(@\"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\PrecisionTouchPad\\Status\", false))\n            {\n                Logger.WriteLine(\"Touchpad status:\" + key?.GetValue(\"Enabled\")?.ToString());\n                return key?.GetValue(\"Enabled\")?.ToString() == \"1\";\n            }\n        }\n\n        static void ToggleTouchpadEvent(bool hotkey = false)\n        {\n            if (hotkey || !AppConfig.IsHardwareTouchpadToggle()) ToggleTouchpad();\n            Thread.Sleep(200);\n            Program.toast.RunToast(GetTouchpadState() ? Properties.Strings.On : Properties.Strings.Off, ToastIcon.Touchpad);\n        }\n\n        static void ToggleTouchpad()\n        {\n            if (AppConfig.IsROG())\n            {\n                AsusHid.WriteInput([AsusHid.INPUT_ID, 0xF4, 0x6B], \"USB Touchpad\");\n            } else\n            {\n                KeyboardHook.KeyKeyKeyPress(Keys.LWin, Keys.LControlKey, Keys.F24, 50);\n            }\n\n        }\n\n        static void SleepEvent()\n        {\n            if (Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastSleep) < 1000) return;\n            lastSleep = DateTimeOffset.Now.ToUnixTimeMilliseconds();\n            Program.acpi.DeviceSet(AsusACPI.UniversalControl, AsusACPI.KB_Sleep, \"Sleep\");\n        }\n\n        public static void ToggleArrowLock()\n        {\n            int arLock = AppConfig.Is(\"arrow_lock\") ? 0 : 1;\n            AppConfig.Set(\"arrow_lock\", arLock);\n\n            Program.settingsForm.BeginInvoke(Program.inputDispatcher.RegisterKeys);\n            Program.toast.RunToast(\"Arrow-Lock \" + (arLock == 1 ? Properties.Strings.On : Properties.Strings.Off), ToastIcon.FnLock);\n        }\n\n        public static bool IsHardwareFnLock()\n        {\n            if (AppConfig.IsHardwareFnLock()) return true;\n            if (_fnLock is null)\n            {\n                var fnLockStatus = Program.acpi.DeviceGet(AsusACPI.FnLock);\n                Logger.WriteLine(\"FnLock Support: \" + fnLockStatus);\n                _fnLock = fnLockStatus >= 0;\n            }\n            return (bool)_fnLock;\n        }\n\n        public static void HardwareFnLock(bool fnLock)\n        {\n            Program.acpi.DeviceSet(AsusACPI.FnLock, fnLock ^ AppConfig.IsInvertedFNLock() ? 1 : 0, \"FnLock\");\n            AsusHid.WriteInput([AsusHid.INPUT_ID, 0xD0, 0x4E, fnLock ? (byte)0x00 : (byte)0x01], \"USB FnLock\");\n        }\n\n        public static void ToggleFnLock()\n        {\n            bool fnLock = !AppConfig.Is(\"fn_lock\");\n            AppConfig.Set(\"fn_lock\", fnLock ? 1 : 0);\n\n            if (IsHardwareFnLock())\n                HardwareFnLock(fnLock);\n            else\n                Program.settingsForm.BeginInvoke(Program.inputDispatcher.RegisterKeys);\n\n            Program.settingsForm.BeginInvoke(Program.settingsForm.VisualiseFnLock);\n\n            Program.toast.RunToast(fnLock ? Properties.Strings.FnLockOn : Properties.Strings.FnLockOff, ToastIcon.FnLock);\n        }\n\n        public static void SetSlateMode(int status)\n        {\n            try\n            {\n                Registry.SetValue(@\"HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\PriorityControl\", \"ConvertibleSlateMode\", status, RegistryValueKind.DWord);\n                Logger.WriteLine(\"Setting ConvertibleSlateMode : \" + status);\n            } catch (Exception ex)\n            {\n                Logger.WriteLine(\"Can't set ConvertibleSlateMode: \" + ex.Message);\n            }\n        }\n\n        public static void TabletMode()\n        {\n            if (AppConfig.Is(\"disable_tablet\")) return;\n\n            bool touchpadState = GetTouchpadState();\n            bool tabletState = Program.acpi.DeviceGet(AsusACPI.TabletState) > 0;\n            int slateState = Program.acpi.DeviceGet(AsusACPI.SlateMode);\n\n            Logger.WriteLine($\"Tablet: {tabletState} | SlateMode: {slateState} | Touchpad: {touchpadState}\");\n\n            if (slateState >= 0) SetSlateMode(slateState);\n            if (tabletState && touchpadState || !tabletState && !touchpadState) ToggleTouchpad();\n\n        }\n\n        static int GetTentState()\n        {\n            var tentState = Program.acpi.DeviceGet(AsusACPI.TentState);\n            Logger.WriteLine($\"Tent: {tentState}\");\n            return tentState;\n        }\n\n        public static void TentMode()\n        {\n            var tentState = GetTentState();\n            if (tentState < 0) return;\n            tentMode = tentState > 0;\n            Aura.ApplyBrightness(tentMode ? 0 : GetBacklight(), \"Tent\");\n        }\n\n        static void HandleEvent(int EventID)\n        {\n            // The ROG Ally uses different M-key codes.\n            // We'll special-case the translation of those.\n            if (AppConfig.IsAlly())\n            {\n                switch (EventID)\n                {\n\n                    // This is both the M1 and M2 keys.\n                    // There's a way to differentiate, apparently, but it isn't over USB or any other obvious protocol.\n                    case 165:\n                        KeyProcess(\"paddle\");\n                        return;\n                    // The Command Center (\"play-looking\") button below the select key.\n                    case 166:\n                        KeyProcess(\"cc\");\n                        return;\n                    // The M4/ROG key.\n                    case 56:\n                    case 147:\n                        KeyProcess(\"m4\");\n                        return;\n                    case 162:\n                        OnScreenKeyboard.Show();\n                        return;\n                    case 124:\n                        KeyProcess(\"m3\");\n                        return;\n\n                }\n            }\n            // All other devices seem to use the same HID key-codes,\n            // so we can process them all the same.\n            else\n            {\n                switch (EventID)\n                {\n                    case 95:     // Z13 Side button\n                        KeyProcess(\"m4\");\n                        return;\n                    case 134:     // FN + F12 ON OLD DEVICES\n                    case 139:     // ProArt F12\n                        KeyProcess(\"m4\");\n                        return;\n                    case 124:    // M3\n                        KeyProcess(\"m3\");\n                        return;\n                    case 56:    // M4 / Rog button\n                        KeyProcess(\"m4\");\n                        return;\n                    case 55:    // Arconym\n                        KeyProcess(\"m6\");\n                        return;\n                    case 181:    // FN + Numpad Enter\n                        KeyProcess(\"fne\");\n                        return;\n                    case 174:   // FN+F5\n                    case 153:   // FN+F5 OLD MODELS\n                        modeControl.CyclePerformanceMode(Control.ModifierKeys == Keys.Shift);\n                        return;\n                    case 178:   // FN+LEFT ARROW / FN + F4\n                        Program.settingsForm.BeginInvoke(Program.settingsForm.CycleAuraMode, -1);\n                        return;\n                    case 179:   // FN+F4\n                        KeyProcess(\"fnf4\");\n                        return;\n                    case 138:   // Fn + V\n                        KeyProcess(\"fnv\");\n                        return;\n                    case 158:   // Fn + C\n                        KeyProcess(\"fnc\");\n                        return;\n                    case 189: // Tablet mode\n                        TabletMode();\n                        return;\n                    case 197: // FN+F2\n                        SetBacklight(-1);\n                        return;\n                    case 196: // FN+F3\n                        SetBacklight(1);\n                        return;\n                    case 199: // ON Z13 - FN+F11 - cycles backlight\n                        SetBacklight(4);\n                        return;\n                    case 46: // Fn + F4 Vivobook Brightness down\n                        if (Control.ModifierKeys == Keys.Control && AppConfig.IsOLED())\n                        {\n                            SetBrightnessDimming(-10);\n                        }\n                        break;\n                    case 47: // Fn + F5 Vivobook Brightness up\n                        if (Control.ModifierKeys == Keys.Control && AppConfig.IsOLED())\n                        {\n                            SetBrightnessDimming(10);\n                        }\n                        break;\n                }\n            }\n\n            if (!AsusService.IsAsusOptimizationRunning())\n                HandleOptimizationEvent(EventID);\n\n        }\n\n        // Asus Optimization service Events \n        static void HandleOptimizationEvent(int EventID)\n        {\n            switch (EventID)\n            {\n                case 16: // FN+F7\n                    if (Control.ModifierKeys == Keys.Shift)\n                    {\n                        if (AppConfig.IsDUO()) SetScreenpad(-10);\n                        else Program.settingsForm.BeginInvoke(Program.settingsForm.CycleMatrix, -1);\n                    }\n                    else if (Control.ModifierKeys == Keys.Control && AppConfig.IsOLED())\n                    {\n                        SetBrightnessDimming(-10);\n                    }\n                    else\n                    {\n                        SetBrightness(false, true);\n                    }\n                    break;\n                case 32: // FN+F8\n                    if (Control.ModifierKeys == Keys.Shift)\n                    {\n                        if (AppConfig.IsDUO()) SetScreenpad(10);\n                        else Program.settingsForm.BeginInvoke(Program.settingsForm.CycleMatrix, 1);\n                    }\n                    else if (Control.ModifierKeys == Keys.Control && AppConfig.IsOLED())\n                    {\n                        SetBrightnessDimming(10);\n                    }\n                    else\n                    {\n                        SetBrightness(true, true);\n                    }\n                    break;\n                case 133: // Camera Toggle\n                    ToggleCamera();\n                    break;\n                case 107: // FN+F10\n                    ToggleTouchpadEvent();\n                    break;\n                case 108: // FN+F11\n                    if (!AppConfig.IsHardwareHotkeys()) SleepEvent();\n                    else lastSleep = DateTimeOffset.Now.ToUnixTimeMilliseconds();\n                    break;\n                case 106: // Screenpad button on DUO\n                    if (Control.ModifierKeys == Keys.Shift)\n                        ToggleScreenpad();\n                    else\n                        SetScreenpad(100);\n                    break;\n                case 51:    // Fn+F6 on old TUFs\n                case 53:    // Fn+F6 on GA-502DU model\n                    NativeMethods.TurnOffScreen();\n                    return;\n                case 126:    // Fn+F8 emojis popup\n                    KeyboardHook.KeyKeyPress(Keys.LWin, Keys.OemSemicolon);\n                    return;\n                case 78:    // Fn + ESC\n                    ToggleFnLock();\n                    return;\n                case 75:    // Fn + Arrow Lock\n                    ToggleArrowLock();\n                    return;\n                case 136:    // FN + F12\n                    if (!AppConfig.IsHardwareHotkeys()) Program.acpi.DeviceSet(AsusACPI.UniversalControl, AsusACPI.Airplane, \"Airplane\");\n                    return;\n                case 50:\n                    // Sound Mute Event\n                    MuteLED();\n                    return;\n                case 157:   // Zenbook DUO FN+F\n                    modeControl.CyclePerformanceMode(Control.ModifierKeys == Keys.Shift);\n                    return;\n                case 250:\n                    // Tent Mode\n                    TentMode();\n                    return;\n            }\n        }\n\n\n        public static int GetBacklight()\n        {\n            int backlight_power = AppConfig.Get(\"keyboard_brightness\", 1);\n            int backlight_battery = AppConfig.Get(\"keyboard_brightness_ac\", 1);\n            bool onBattery = SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Online;\n\n            int backlight;\n\n            //backlight = onBattery ? Math.Min(backlight_battery, backlight_power) : Math.Max(backlight_battery, backlight_power);\n            backlight = onBattery ? backlight_battery : backlight_power;\n\n            return Math.Max(Math.Min(3, backlight), 0);\n        }\n\n        public static void AutoKeyboard()\n        {\n            if (AppConfig.HasTabletMode()) TabletMode();\n            if (lidClose)\n            {\n                Logger.WriteLine(\"Skipping Backlight Init: Lid Closed\");\n                return;\n            }\n\n            if (tentMode)\n            {\n                tentMode = GetTentState() > 0; \n                if (tentMode)\n                {\n                    Logger.WriteLine(\"Skipping Backlight Init: Tent Mode\");\n                    return;\n                }\n            }\n\n            if (!AppConfig.Is(\"skip_aura\"))\n            {\n                Aura.Init();\n                Aura.ApplyPower();\n                Aura.ApplyAura();\n            }\n\n            SetBacklightAuto(true);\n        }\n\n\n        public static void SetBacklightAuto(bool init = false)\n        {\n            if (lidClose || tentMode) return;\n            Aura.ApplyBrightness(GetBacklight(), \"Auto\", init);\n            backlightActivity = true;\n        }\n\n        public static void StartupBacklight()\n        {\n            Aura.DirectBrightness(GetBacklight(), \"Startup\");\n        }\n\n        public static void SetBacklight(int delta, bool force = false)\n        {\n            int backlight_power = AppConfig.Get(\"keyboard_brightness\", 1);\n            int backlight_battery = AppConfig.Get(\"keyboard_brightness_ac\", 1);\n            bool onBattery = SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Online;\n\n            int backlight = onBattery ? backlight_battery : backlight_power;\n            int backlightMax = AppConfig.Get(\"max_brightness\", 3);\n\n            if (delta > backlightMax)\n                backlight = ++backlight % (backlightMax + 1);\n            else\n                backlight = Math.Max(Math.Min(backlightMax, backlight + delta), 0);\n\n            if (onBattery)\n                AppConfig.Set(\"keyboard_brightness_ac\", backlight);\n            else\n                AppConfig.Set(\"keyboard_brightness\", backlight);\n\n            if (force || !AsusService.IsAsusOptimizationRunning())\n            {\n                Aura.ApplyBrightness(backlight, \"HotKey\");\n            }\n\n            if (!AsusService.IsOSDRunning())\n            {\n                string[] backlightNames = new string[] { Properties.Strings.BacklightOff, Properties.Strings.BacklightLow, Properties.Strings.BacklightMid, Properties.Strings.BacklightMax };\n                Program.toast.RunToast(backlightNames[backlight], delta > 0 ? ToastIcon.BacklightUp : ToastIcon.BacklightDown);\n            }\n\n        }\n\n        public static void ToggleScreenpad()\n        {\n            int toggle = AppConfig.Is(\"screenpad_toggle\") ? 0 : 1;\n            int brightness = toggle == 0 ? -10 : AppConfig.Get(\"screenpad\", 100);\n\n            Debug.WriteLine($\"Screenpad toggle = {toggle}\");\n\n            ApplyScreenpadAction(brightness, true);\n\n            AppConfig.Set(\"screenpad_toggle\", toggle);\n\n            Program.toast.RunToast($\"Screen Pad \" + (toggle == 1 ? \"On\" : \"Off\"), toggle > 0 ? ToastIcon.BrightnessUp : ToastIcon.BrightnessDown);\n        }\n\n        public static void ToggleScreenRate()\n        {\n            AppConfig.Set(\"screen_auto\", 0);\n            ScreenControl.ToggleScreenRate();\n        }\n\n\n        private static string GetAsusPath()\n        {\n            if (_asusPath == null)\n            {\n                try\n                {\n                    using (var searcher = new ManagementObjectSearcher(@\"Select * from Win32_SystemDriver WHERE Name='ATKWMIACPIIO'\"))\n                    {\n                        foreach (var driver in searcher.Get())\n                        {\n                            string path = driver[\"PathName\"].ToString();\n                            _asusPath = Path.GetDirectoryName(path);\n                            break;\n                        }\n                    }\n                }\n                catch (Exception ex)\n                {\n                    Logger.WriteLine(ex.Message);\n                }\n            }\n\n            return _asusPath;\n        }\n\n        public static void ToggleCamera()\n        {\n            int cameraShutter = Program.acpi.DeviceGet(AsusACPI.CameraShutter);\n            Logger.WriteLine(\"Camera Shutter status: \" + cameraShutter);\n\n            if (cameraShutter == 0)\n            {\n                Program.acpi.DeviceSet(AsusACPI.CameraShutter, 1, \"CameraShutterOn\");\n                Program.toast.RunToast($\"Camera Off\");\n            }\n            else if (cameraShutter == 1)\n            {\n                Program.acpi.DeviceSet(AsusACPI.CameraShutter, 0, \"CameraShutterOff\");\n                Program.toast.RunToast($\"Camera On\");\n            }\n            else if (cameraShutter == 1048577)\n            {\n                Program.acpi.DeviceSet(AsusACPI.CameraShutter, 5, \"CameraShutter\");\n                Program.toast.RunToast($\"Camera Off\");\n            }\n            else if (cameraShutter == 1048576)\n            {\n                Program.acpi.DeviceSet(AsusACPI.CameraShutter, 4, \"CameraShutter\");\n                Program.toast.RunToast($\"Camera On\");\n            }\n            else if (cameraShutter == 262144)\n            {\n                Program.toast.RunToast($\"Camera Off\");\n            }\n            else if (cameraShutter == 262145)\n            {\n                Program.toast.RunToast($\"Camera On\");\n            }\n            else\n            {\n                SetCamera(2);\n            }\n        }\n\n        private static void SetCamera(int status, bool toast = true)\n        {\n            string asusPath = GetAsusPath();\n\n            var cameraStatus = AppConfig.Get(\"camera_status\");\n            if (status == 2 && cameraStatus >= 0) status = cameraStatus > 0 ? 0 : 1;\n\n            var result = ProcessHelper.RunCMD($\"{asusPath}\\\\AsusHotkey.exe\", $\"-MFCameraCommand {status} 1 0\", asusPath);\n            var cameraLedStatus = Program.acpi.DeviceGet(AsusACPI.CameraLed);\n            Logger.WriteLine(\"Camera LED: \" + cameraLedStatus);\n            AppConfig.Set(\"camera_status\", cameraLedStatus);\n            if (toast)\n            {\n                string statusText = cameraLedStatus switch\n                {\n                    0 => \"On\",\n                    1 => \"Off\",\n                    _ => \"Toggled\"\n                };\n                Program.toast.RunToast($\"Camera {statusText}\");\n            }\n        }\n\n        private static void InitCamera()\n        {\n            var cameraStatus = AppConfig.Get(\"camera_status\");\n            if (cameraStatus >= 0) SetCamera(cameraStatus, false);\n        }\n\n        private static System.Threading.Timer screenpadActionTimer;\n        private static int screenpadBrightnessToSet;\n        public static void ApplyScreenpadAction(int brightness, bool instant = true)\n        {\n            var delay = AppConfig.Get(\"screenpad_delay\", 1500);\n\n            //Action\n            Action<int> action = (b) =>\n            {\n                if (b >= 0) Program.acpi.DeviceSet(AsusACPI.ScreenPadToggle, 1, \"ScreenpadOn\");\n                int[] brightnessValues = [0, 4, 9, 14, 21, 32, 48, 73, 111, 169, 255];\n                Program.acpi.DeviceSet(AsusACPI.ScreenPadBrightness, brightnessValues[Math.Min(brightnessValues.Length - 1, Math.Max(0, b / 10))], \"Screenpad\");\n                if (b < 0) Program.acpi.DeviceSet(AsusACPI.ScreenPadToggle, 0, \"ScreenpadOff\");\n            };\n\n            if (delay <= 0 || instant) //instant action\n            {\n                action(brightness);\n            }\n            else //delayed action\n            {\n                //Timer Approach\n                if (screenpadActionTimer == null)\n                {\n                    screenpadActionTimer = new System.Threading.Timer(_ => action(screenpadBrightnessToSet), null, Timeout.Infinite, Timeout.Infinite);\n                }\n                //Start Timer\n                screenpadBrightnessToSet = brightness;\n                screenpadActionTimer.Change(delay, Timeout.Infinite);\n            }\n        }\n\n        public static void SetScreenpad(int delta)\n        {\n            int brightness = AppConfig.Get(\"screenpad\", 100);\n\n            if (delta == 100)\n            {\n                if (brightness < 0) brightness = 100;\n                else if (brightness >= 100) brightness = 0;\n                else brightness = -10;\n                ApplyScreenpadAction(brightness, false);\n            }\n            else\n            {\n                brightness = Math.Max(Math.Min(100, brightness + delta), 0);\n                ApplyScreenpadAction(brightness);\n            }\n\n            AppConfig.Set(\"screenpad\", brightness);\n\n            string toast;\n\n            if (brightness < 0) toast = \"Off\";\n            else toast = brightness.ToString() + \"%\";\n\n            Program.toast.RunToast($\"Screen Pad {toast}\", delta > 0 ? ToastIcon.BrightnessUp : ToastIcon.BrightnessDown);\n        }\n\n        public static void InitScreenpad()\n        {\n            if (!AppConfig.IsDUO()) return;\n            int brightness = AppConfig.Get(\"screenpad\");\n            if (brightness != -1) ApplyScreenpadAction(brightness);\n        }\n\n        public static void SetStatusLED(bool status)\n        {\n            Program.acpi.DeviceSet(AsusACPI.StatusLed, status ? 7 : 0, \"StatusLED\");\n        }\n\n        public static void InitStatusLed()\n        {\n            if (AppConfig.IsAutoStatusLed()) SetStatusLED(true);\n        }\n\n        public static void ShutdownStatusLed()\n        {\n            if (AppConfig.IsAutoStatusLed()) SetStatusLED(false);\n        }\n\n        static void LaunchProcess(string command = \"\")\n        {\n            if (string.IsNullOrEmpty(command)) return;\n            try\n            {\n                if (command.StartsWith(\"shutdown\"))\n                    ProcessHelper.RunCMD(\"cmd\", \"/C \" + command);\n                else\n                    RestrictedProcessHelper.RunAsRestrictedUser(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), \"cmd.exe\"), \"/C \" + command);\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine($\"Failed to run: {command} {ex.Message}\");\n            }\n        }\n\n        static void WatcherEventArrived(object sender, EventArrivedEventArgs e)\n        {\n            if (e.NewEvent is null) return;\n            int EventID = int.Parse(e.NewEvent[\"EventID\"].ToString());\n            Logger.WriteLine(\"WMI event \" + EventID);\n            if (AppConfig.NoWMI()) return;\n            HandleEvent(EventID);\n        }\n    }\n}\n"
  },
  {
    "path": "app/Input/KeyboardHook.cs",
    "content": "﻿using System.Runtime.InteropServices;\n\npublic sealed class KeyboardHook : IDisposable\n{\n    // Registers a hot key with Windows.\n    [DllImport(\"user32.dll\")]\n    private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);\n    // Unregisters the hot key with Windows.\n    [DllImport(\"user32.dll\")]\n    private static extern bool UnregisterHotKey(IntPtr hWnd, int id);\n\n    [DllImport(\"user32.dll\")]\n    private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);\n\n    [DllImport(\"user32.dll\", SetLastError = true)]\n    public static extern void keybd_event(byte virtualKey, byte scanCode, uint flags, IntPtr extraInfo);\n\n    public const int KEYEVENTF_EXTENDEDKEY = 1;\n    public const int KEYEVENTF_KEYUP = 2;\n\n    private const byte VK_LWIN = 0x5B;\n    private const byte VK_LCONTROL = 0xA2;\n\n    [DllImport(\"user32.dll\")]\n    public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo);\n    //Mouse actions\n    private const int MOUSEEVENTF_LEFTDOWN = 0x02;\n    private const int MOUSEEVENTF_LEFTUP = 0x04;\n\n    private const int MOUSEEVENTF_RIGHTDOWN = 0x08;\n    private const int MOUSEEVENTF_RIGHTUP = 0x10;\n\n    private const int MOUSEEVENTF_MIDDOWN = 0x20;\n    private const int MOUSEEVENTF_MIDTUP = 0x40;\n\n    public static void KeyPress(Keys key)\n    {\n        switch (key)\n        {\n            case Keys.LButton:\n                mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, (uint)Cursor.Position.X, (uint)Cursor.Position.Y, 0, 0);\n                return;\n            case Keys.RButton:\n                mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, (uint)Cursor.Position.X, (uint)Cursor.Position.Y, 0, 0);\n                return;\n            case Keys.MButton:\n                mouse_event(MOUSEEVENTF_MIDDOWN | MOUSEEVENTF_MIDTUP, (uint)Cursor.Position.X, (uint)Cursor.Position.Y, 0, 0);\n                return;\n        }\n\n        keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);\n        Thread.Sleep(1);\n        keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);\n    }\n\n    public static void KeyKeyPress(Keys key, Keys key2)\n    {\n        keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);\n        keybd_event((byte)key2, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);\n\n        Thread.Sleep(1);\n\n        keybd_event((byte)key2, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);\n        keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);\n    }\n\n    public static void KeyKeyKeyPress(Keys key, Keys key2, Keys key3, int sleep = 1)\n    {\n        keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);\n        keybd_event((byte)key2, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);\n        keybd_event((byte)key3, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);\n\n        Thread.Sleep(sleep);\n\n        keybd_event((byte)key3, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);\n        keybd_event((byte)key2, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);\n        keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);\n    }\n\n    public static void KeyKeyKeyKeyPress(Keys key, Keys key2, Keys key3, Keys key4, int sleep = 1)\n    {\n        keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);\n        keybd_event((byte)key2, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);\n        keybd_event((byte)key3, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);\n        keybd_event((byte)key4, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);\n\n        Thread.Sleep(sleep);\n\n        keybd_event((byte)key4, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);\n        keybd_event((byte)key3, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);\n        keybd_event((byte)key2, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);\n        keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);\n    }\n\n    /// <summary>\n    /// Represents the window that is used internally to get the messages.\n    /// </summary>\n    private class Window : NativeWindow, IDisposable\n    {\n        private static int WM_HOTKEY = 0x0312;\n        public static Keys? fakeKey;\n\n        public Window()\n        {\n            // create the handle for the window.\n            this.CreateHandle(new CreateParams());\n        }\n\n        /// <summary>\n        /// Overridden to get the notifications.\n        /// </summary>\n        /// <param name=\"m\"></param>\n        protected override void WndProc(ref Message m)\n        {\n            base.WndProc(ref m);\n\n            // check if we got a hot key pressed.\n            if (m.Msg == WM_HOTKEY)\n            {\n                // get the keys.\n                Keys key = (Keys)(((int)m.LParam >> 16) & 0xFFFF);\n                ModifierKeys modifier = (ModifierKeys)((int)m.LParam & 0xFFFF);\n\n                // invoke the event to notify the parent.\n                if (KeyPressed != null)\n                    KeyPressed(this, new KeyPressedEventArgs(modifier, key));\n            }\n        }\n\n        public event EventHandler<KeyPressedEventArgs> KeyPressed;\n\n        #region IDisposable Members\n\n        public void Dispose()\n        {\n            this.DestroyHandle();\n        }\n\n        #endregion\n    }\n\n    private Window _window = new Window();\n    private int _currentId;\n\n    public KeyboardHook()\n    {\n        // register the event of the inner native window.\n        _window.KeyPressed += delegate (object sender, KeyPressedEventArgs args)\n        {\n            if (KeyPressed != null)\n                KeyPressed(this, args);\n        };\n    }\n\n    /// <summary>\n    /// Registers a hot key in the system.\n    /// </summary>\n    /// <param name=\"modifier\">The modifiers that are associated with the hot key.</param>\n    /// <param name=\"key\">The key itself that is associated with the hot key.</param>\n    public void RegisterHotKey(ModifierKeys modifier, Keys key)\n    {\n        // increment the counter.\n        _currentId = _currentId + 1;\n\n        // register the hot key.\n        if (!RegisterHotKey(_window.Handle, _currentId, (uint)modifier, (uint)key))\n            Logger.WriteLine(\"Couldn’t register \" + key);\n    }\n\n    /// <summary>\n    /// A hot key has been pressed.\n    /// </summary>\n    public event EventHandler<KeyPressedEventArgs> KeyPressed;\n\n    #region IDisposable Members\n\n    public void UnregisterAll()\n    {\n        // unregister all the registered hot keys.\n        for (int i = _currentId; i > 0; i--)\n        {\n            UnregisterHotKey(_window.Handle, i);\n        }\n    }\n\n    public void Dispose()\n    {\n        UnregisterAll();\n        // dispose the inner native window.\n        _window.Dispose();\n    }\n\n    #endregion\n}\n\n/// <summary>\n/// Event Args for the event that is fired after the hot key has been pressed.\n/// </summary>\npublic class KeyPressedEventArgs : EventArgs\n{\n    private ModifierKeys _modifier;\n    private Keys _key;\n\n    internal KeyPressedEventArgs(ModifierKeys modifier, Keys key)\n    {\n        _modifier = modifier;\n        _key = key;\n    }\n\n    public ModifierKeys Modifier\n    {\n        get { return _modifier; }\n    }\n\n    public Keys Key\n    {\n        get { return _key; }\n    }\n}\n\n/// <summary>\n/// The enumeration of possible modifiers.\n/// </summary>\n[Flags]\npublic enum ModifierKeys : uint\n{\n    None = 0,\n    Alt = 1,\n    Control = 2,\n    Shift = 4,\n    Win = 8\n}"
  },
  {
    "path": "app/Input/KeyboardListener.cs",
    "content": "﻿using GHelper.USB;\nusing HidSharp;\nusing System.Text;\n\nnamespace GHelper.Input\n{\n    public class KeyboardListener\n    {\n\n        CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();\n        Action<int> _handler;\n\n        static int retry = 0;\n\n        public KeyboardListener(Action<int> KeyHandler)\n        {\n            _handler = KeyHandler;\n            var task = Task.Run(Listen);\n        }\n\n        private void Listen()\n        {\n\n            HidStream? input = AsusHid.FindHidStream(AsusHid.INPUT_ID);\n\n            // Fallback\n            int count = 0;\n\n            while (input == null && count++ < 10)\n            {\n                Thread.Sleep(1000);\n                input = AsusHid.FindHidStream(AsusHid.INPUT_ID);\n            }\n\n            if (input == null)\n            {\n                Logger.WriteLine($\"Input device not found\");\n                return;\n            }\n\n            AsusHid.WriteInput(Encoding.ASCII.GetBytes(\"ZASUS Tech.Inc.\"));\n            Logger.WriteLine($\"Input: {input.Device.DevicePath}\");\n\n            try\n            {\n                while (!cancellationTokenSource.Token.IsCancellationRequested)\n                {\n\n                    // Emergency break\n                    if (input == null || !input.CanRead)\n                    {\n                        Logger.WriteLine(\"Listener terminated\");\n                        break;\n                    }\n\n                    input.ReadTimeout = int.MaxValue;\n\n                    var data = input.Read();\n                    if (cancellationTokenSource.Token.IsCancellationRequested) break;\n                    if (data.Length > 1 && data[0] == AsusHid.INPUT_ID && data[1] > 0 && data[1] != 236)\n                    {\n                        Logger.WriteLine($\"Key: {data[1]}\");\n                        _handler(data[1]);\n                    }\n                }\n\n                Logger.WriteLine(\"Listener stopped\");\n\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine($\"Listener exited: {ex.Message}\");\n                if (retry++ < 2)\n                {\n                    Thread.Sleep(300);\n                    Logger.WriteLine($\"Restarting listener {retry}\");\n                    Listen();\n                }\n            }\n\n        }\n\n        public void Dispose()\n        {\n            cancellationTokenSource?.Cancel();\n        }\n    }\n}\n"
  },
  {
    "path": "app/Matrix.Designer.cs",
    "content": "﻿namespace GHelper\n{\n    partial class Matrix\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            pictureMatrix = new PictureBox();\n            trackZoom = new TrackBar();\n            buttonPicture = new UI.RButton();\n            panelPicture = new Panel();\n            panelMain = new Panel();\n            panelButtons = new Panel();\n            buttonReset = new UI.RButton();\n            panelGamma = new Panel();\n            labelGamma = new Label();\n            labelGammaTitle = new Label();\n            trackGamma = new TrackBar();\n            panelContrast = new Panel();\n            labelContrast = new Label();\n            labelContrastTitle = new Label();\n            trackContrast = new TrackBar();\n            panelRotation = new Panel();\n            comboRotation = new UI.RComboBox();\n            labelRotation = new Label();\n            panelScaling = new Panel();\n            comboScaling = new UI.RComboBox();\n            labelScaling = new Label();\n            panelZoom = new Panel();\n            labelZoom = new Label();\n            labelZoomTitle = new Label();\n            ((System.ComponentModel.ISupportInitialize)pictureMatrix).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)trackZoom).BeginInit();\n            panelPicture.SuspendLayout();\n            panelMain.SuspendLayout();\n            panelButtons.SuspendLayout();\n            panelGamma.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)trackGamma).BeginInit();\n            panelContrast.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)trackContrast).BeginInit();\n            panelRotation.SuspendLayout();\n            panelScaling.SuspendLayout();\n            panelZoom.SuspendLayout();\n            SuspendLayout();\n            // \n            // pictureMatrix\n            // \n            pictureMatrix.BackColor = Color.Black;\n            pictureMatrix.Cursor = Cursors.SizeAll;\n            pictureMatrix.Location = new Point(731, 27);\n            pictureMatrix.Name = \"pictureMatrix\";\n            pictureMatrix.Size = new Size(81, 73);\n            pictureMatrix.TabIndex = 0;\n            pictureMatrix.TabStop = false;\n            // \n            // trackZoom\n            // \n            trackZoom.LargeChange = 50;\n            trackZoom.Location = new Point(16, 52);\n            trackZoom.Maximum = 200;\n            trackZoom.Minimum = 10;\n            trackZoom.Name = \"trackZoom\";\n            trackZoom.Size = new Size(782, 90);\n            trackZoom.SmallChange = 10;\n            trackZoom.TabIndex = 2;\n            trackZoom.TickFrequency = 20;\n            trackZoom.TickStyle = TickStyle.TopLeft;\n            trackZoom.Value = 100;\n            // \n            // buttonPicture\n            // \n            buttonPicture.Activated = false;\n            buttonPicture.BackColor = SystemColors.ControlLight;\n            buttonPicture.BorderColor = Color.Transparent;\n            buttonPicture.BorderRadius = 5;\n            buttonPicture.FlatAppearance.BorderSize = 0;\n            buttonPicture.FlatStyle = FlatStyle.Flat;\n            buttonPicture.Image = Properties.Resources.icons8_matrix_32;\n            buttonPicture.Location = new Point(16, 19);\n            buttonPicture.Name = \"buttonPicture\";\n            buttonPicture.Secondary = true;\n            buttonPicture.Size = new Size(258, 56);\n            buttonPicture.TabIndex = 3;\n            buttonPicture.Text = \"Picture / Gif\";\n            buttonPicture.TextAlign = ContentAlignment.MiddleRight;\n            buttonPicture.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonPicture.UseVisualStyleBackColor = false;\n            // \n            // panelPicture\n            // \n            panelPicture.BackColor = Color.Black;\n            panelPicture.Controls.Add(pictureMatrix);\n            panelPicture.Dock = DockStyle.Top;\n            panelPicture.Location = new Point(0, 0);\n            panelPicture.Name = \"panelPicture\";\n            panelPicture.Size = new Size(834, 419);\n            panelPicture.TabIndex = 4;\n            // \n            // panelMain\n            // \n            panelMain.AutoSize = true;\n            panelMain.Controls.Add(panelButtons);\n            panelMain.Controls.Add(panelGamma);\n            panelMain.Controls.Add(panelContrast);\n            panelMain.Controls.Add(panelRotation);\n            panelMain.Controls.Add(panelScaling);\n            panelMain.Controls.Add(panelZoom);\n            panelMain.Controls.Add(panelPicture);\n            panelMain.Dock = DockStyle.Top;\n            panelMain.Location = new Point(20, 20);\n            panelMain.Name = \"panelMain\";\n            panelMain.Size = new Size(834, 1104);\n            panelMain.TabIndex = 5;\n            // \n            // panelButtons\n            // \n            panelButtons.Controls.Add(buttonReset);\n            panelButtons.Controls.Add(buttonPicture);\n            panelButtons.Dock = DockStyle.Top;\n            panelButtons.Location = new Point(0, 1010);\n            panelButtons.Name = \"panelButtons\";\n            panelButtons.Size = new Size(834, 94);\n            panelButtons.TabIndex = 6;\n            // \n            // buttonReset\n            // \n            buttonReset.Activated = false;\n            buttonReset.BackColor = SystemColors.ControlLight;\n            buttonReset.BorderColor = Color.Transparent;\n            buttonReset.BorderRadius = 5;\n            buttonReset.FlatAppearance.BorderSize = 0;\n            buttonReset.FlatStyle = FlatStyle.Flat;\n            buttonReset.Image = Properties.Resources.icons8_refresh_32;\n            buttonReset.Location = new Point(290, 19);\n            buttonReset.Name = \"buttonReset\";\n            buttonReset.Secondary = true;\n            buttonReset.Size = new Size(258, 56);\n            buttonReset.TabIndex = 4;\n            buttonReset.Text = \"Reset\";\n            buttonReset.TextAlign = ContentAlignment.MiddleRight;\n            buttonReset.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonReset.UseVisualStyleBackColor = false;\n            // \n            // panelGamma\n            // \n            panelGamma.AutoSize = true;\n            panelGamma.Controls.Add(labelGamma);\n            panelGamma.Controls.Add(labelGammaTitle);\n            panelGamma.Controls.Add(trackGamma);\n            panelGamma.Dock = DockStyle.Top;\n            panelGamma.Location = new Point(0, 865);\n            panelGamma.Name = \"panelGamma\";\n            panelGamma.Size = new Size(834, 145);\n            panelGamma.TabIndex = 7;\n            // \n            // labelGamma\n            // \n            labelGamma.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            labelGamma.Font = new Font(\"Segoe UI\", 9F, FontStyle.Regular, GraphicsUnit.Point);\n            labelGamma.Location = new Point(673, 17);\n            labelGamma.Name = \"labelGamma\";\n            labelGamma.Size = new Size(125, 32);\n            labelGamma.TabIndex = 4;\n            labelGamma.Text = \"Brightness\";\n            labelGamma.TextAlign = ContentAlignment.TopRight;\n            // \n            // labelGammaTitle\n            // \n            labelGammaTitle.AutoSize = true;\n            labelGammaTitle.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold, GraphicsUnit.Point);\n            labelGammaTitle.Location = new Point(16, 17);\n            labelGammaTitle.Name = \"labelGammaTitle\";\n            labelGammaTitle.Size = new Size(134, 32);\n            labelGammaTitle.TabIndex = 3;\n            labelGammaTitle.Text = \"Brightness\";\n            // \n            // trackGamma\n            // \n            trackGamma.LargeChange = 50;\n            trackGamma.Location = new Point(16, 52);\n            trackGamma.Maximum = 100;\n            trackGamma.Minimum = -100;\n            trackGamma.Name = \"trackGamma\";\n            trackGamma.Size = new Size(782, 90);\n            trackGamma.SmallChange = 10;\n            trackGamma.TabIndex = 2;\n            trackGamma.TickFrequency = 20;\n            trackGamma.TickStyle = TickStyle.TopLeft;\n            // \n            // panelContrast\n            // \n            panelContrast.AutoSize = true;\n            panelContrast.Controls.Add(labelContrast);\n            panelContrast.Controls.Add(labelContrastTitle);\n            panelContrast.Controls.Add(trackContrast);\n            panelContrast.Dock = DockStyle.Top;\n            panelContrast.Location = new Point(0, 720);\n            panelContrast.Name = \"panelContrast\";\n            panelContrast.Size = new Size(834, 145);\n            panelContrast.TabIndex = 6;\n            // \n            // labelContrast\n            // \n            labelContrast.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            labelContrast.Font = new Font(\"Segoe UI\", 9F, FontStyle.Regular, GraphicsUnit.Point);\n            labelContrast.Location = new Point(701, 17);\n            labelContrast.Name = \"labelContrast\";\n            labelContrast.Size = new Size(103, 32);\n            labelContrast.TabIndex = 4;\n            labelContrast.Text = \"Contrast\";\n            labelContrast.TextAlign = ContentAlignment.TopRight;\n            // \n            // labelContrastTitle\n            // \n            labelContrastTitle.AutoSize = true;\n            labelContrastTitle.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold, GraphicsUnit.Point);\n            labelContrastTitle.Location = new Point(16, 17);\n            labelContrastTitle.Name = \"labelContrastTitle\";\n            labelContrastTitle.Size = new Size(111, 32);\n            labelContrastTitle.TabIndex = 3;\n            labelContrastTitle.Text = \"Contrast\";\n            // \n            // trackContrast\n            // \n            trackContrast.LargeChange = 50;\n            trackContrast.Location = new Point(16, 52);\n            trackContrast.Maximum = 200;\n            trackContrast.Minimum = 10;\n            trackContrast.Name = \"trackContrast\";\n            trackContrast.Size = new Size(782, 90);\n            trackContrast.SmallChange = 10;\n            trackContrast.TabIndex = 2;\n            trackContrast.TickFrequency = 20;\n            trackContrast.TickStyle = TickStyle.TopLeft;\n            trackContrast.Value = 100;\n            // \n            // panelRotation\n            // \n            panelRotation.Controls.Add(comboRotation);\n            panelRotation.Controls.Add(labelRotation);\n            panelRotation.Dock = DockStyle.Top;\n            panelRotation.Location = new Point(0, 642);\n            panelRotation.Name = \"panelRotation\";\n            panelRotation.Size = new Size(834, 78);\n            panelRotation.TabIndex = 8;\n            // \n            // comboRotation\n            // \n            comboRotation.BorderColor = Color.White;\n            comboRotation.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboRotation.Font = new Font(\"Segoe UI\", 9F, FontStyle.Regular, GraphicsUnit.Point);\n            comboRotation.FormattingEnabled = true;\n            comboRotation.ItemHeight = 32;\n            comboRotation.Items.AddRange(new object[] { \"Straight\", \"Diagonal\" });\n            comboRotation.Location = new Point(279, 17);\n            comboRotation.Margin = new Padding(4, 11, 4, 8);\n            comboRotation.Name = \"comboRotation\";\n            comboRotation.Size = new Size(322, 40);\n            comboRotation.TabIndex = 17;\n            // \n            // labelRotation\n            // \n            labelRotation.AutoSize = true;\n            labelRotation.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold, GraphicsUnit.Point);\n            labelRotation.Location = new Point(16, 20);\n            labelRotation.Name = \"labelRotation\";\n            labelRotation.Size = new Size(190, 32);\n            labelRotation.TabIndex = 4;\n            labelRotation.Text = \"Image Rotation\";\n            // \n            // panelScaling\n            // \n            panelScaling.Controls.Add(comboScaling);\n            panelScaling.Controls.Add(labelScaling);\n            panelScaling.Dock = DockStyle.Top;\n            panelScaling.Location = new Point(0, 564);\n            panelScaling.Name = \"panelScaling\";\n            panelScaling.Size = new Size(834, 78);\n            panelScaling.TabIndex = 7;\n            // \n            // comboScaling\n            // \n            comboScaling.BorderColor = Color.White;\n            comboScaling.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboScaling.Font = new Font(\"Segoe UI\", 9F, FontStyle.Regular, GraphicsUnit.Point);\n            comboScaling.FormattingEnabled = true;\n            comboScaling.ItemHeight = 32;\n            comboScaling.Items.AddRange(new object[] { \"Default\", \"Low\", \"High\", \"Bilinear\", \"Bicubic\", \"NearestNeighbor\", \"HighQualityBilinear\", \"HighQualityBicubic\" });\n            comboScaling.Location = new Point(279, 17);\n            comboScaling.Margin = new Padding(4, 11, 4, 8);\n            comboScaling.Name = \"comboScaling\";\n            comboScaling.Size = new Size(322, 40);\n            comboScaling.TabIndex = 17;\n            // \n            // labelScaling\n            // \n            labelScaling.AutoSize = true;\n            labelScaling.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold, GraphicsUnit.Point);\n            labelScaling.Location = new Point(16, 20);\n            labelScaling.Name = \"labelScaling\";\n            labelScaling.Size = new Size(185, 32);\n            labelScaling.TabIndex = 4;\n            labelScaling.Text = \"Scaling Quality\";\n            // \n            // panelZoom\n            // \n            panelZoom.AutoSize = true;\n            panelZoom.Controls.Add(labelZoom);\n            panelZoom.Controls.Add(labelZoomTitle);\n            panelZoom.Controls.Add(trackZoom);\n            panelZoom.Dock = DockStyle.Top;\n            panelZoom.Location = new Point(0, 419);\n            panelZoom.Name = \"panelZoom\";\n            panelZoom.Size = new Size(834, 145);\n            panelZoom.TabIndex = 5;\n            // \n            // labelZoom\n            // \n            labelZoom.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            labelZoom.AutoSize = true;\n            labelZoom.Font = new Font(\"Segoe UI\", 9F, FontStyle.Regular, GraphicsUnit.Point);\n            labelZoom.Location = new Point(731, 17);\n            labelZoom.Name = \"labelZoom\";\n            labelZoom.Size = new Size(77, 32);\n            labelZoom.TabIndex = 4;\n            labelZoom.Text = \"Zoom\";\n            // \n            // labelZoomTitle\n            // \n            labelZoomTitle.AutoSize = true;\n            labelZoomTitle.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold, GraphicsUnit.Point);\n            labelZoomTitle.Location = new Point(16, 17);\n            labelZoomTitle.Name = \"labelZoomTitle\";\n            labelZoomTitle.Size = new Size(81, 32);\n            labelZoomTitle.TabIndex = 3;\n            labelZoomTitle.Text = \"Zoom\";\n            // \n            // Matrix\n            // \n            AutoScaleDimensions = new SizeF(192F, 192F);\n            AutoScaleMode = AutoScaleMode.Dpi;\n            AutoSize = true;\n            ClientSize = new Size(874, 1142);\n            Controls.Add(panelMain);\n            MaximizeBox = false;\n            MinimizeBox = false;\n            MinimumSize = new Size(900, 0);\n            Name = \"Matrix\";\n            Padding = new Padding(20);\n            ShowIcon = false;\n            ShowInTaskbar = false;\n            Text = \"Matrix\";\n            ((System.ComponentModel.ISupportInitialize)pictureMatrix).EndInit();\n            ((System.ComponentModel.ISupportInitialize)trackZoom).EndInit();\n            panelPicture.ResumeLayout(false);\n            panelMain.ResumeLayout(false);\n            panelMain.PerformLayout();\n            panelButtons.ResumeLayout(false);\n            panelGamma.ResumeLayout(false);\n            panelGamma.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)trackGamma).EndInit();\n            panelContrast.ResumeLayout(false);\n            panelContrast.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)trackContrast).EndInit();\n            panelRotation.ResumeLayout(false);\n            panelRotation.PerformLayout();\n            panelScaling.ResumeLayout(false);\n            panelScaling.PerformLayout();\n            panelZoom.ResumeLayout(false);\n            panelZoom.PerformLayout();\n            ResumeLayout(false);\n            PerformLayout();\n        }\n\n        #endregion\n\n        private PictureBox pictureMatrix;\n        private TrackBar trackZoom;\n        private UI.RButton buttonPicture;\n        private Panel panelPicture;\n        private Panel panelMain;\n        private Panel panelZoom;\n        private Label labelZoom;\n        private Label labelZoomTitle;\n        private Panel panelButtons;\n        private UI.RButton buttonReset;\n        private Panel panelScaling;\n        private Label labelScaling;\n        private UI.RComboBox comboScaling;\n        private Panel panelRotation;\n        private UI.RComboBox comboRotation;\n        private Label labelRotation;\n        private Panel panelContrast;\n        private Label labelContrast;\n        private Label labelContrastTitle;\n        private TrackBar trackContrast;\n        private Panel panelGamma;\n        private Label labelGamma;\n        private Label labelGammaTitle;\n        private TrackBar trackGamma;\n    }\n}"
  },
  {
    "path": "app/Matrix.cs",
    "content": "﻿using GHelper.AnimeMatrix;\nusing GHelper.UI;\n\nnamespace GHelper\n{\n    public partial class Matrix : RForm\n    {\n\n        public AniMatrixControl matrixControl = Program.settingsForm.matrixControl;\n\n        private bool Dragging;\n        private int xPos;\n        private int yPos;\n\n        private int baseX;\n        private int baseY;\n\n        private float uiScale;\n\n        Image picture;\n        MemoryStream ms = new MemoryStream();\n\n        public Matrix()\n        {\n            InitializeComponent();\n            InitTheme(true);\n\n            Text = Properties.Strings.AnimeMatrix;\n            labelZoomTitle.Text = Properties.Strings.Zoom;\n            labelScaling.Text = Properties.Strings.ScalingQuality;\n            labelRotation.Text = Properties.Strings.ImageRotation;\n            labelContrastTitle.Text = Properties.Strings.Contrast;\n            labelGammaTitle.Text = Properties.Strings.Brightness;\n            buttonPicture.Text = Properties.Strings.PictureGif;\n            buttonReset.Text = Properties.Strings.Reset;\n\n            Shown += Matrix_Shown;\n            FormClosing += Matrix_FormClosed;\n\n            buttonPicture.Click += ButtonPicture_Click;\n            buttonReset.Click += ButtonReset_Click;\n\n            pictureMatrix.MouseUp += PictureMatrix_MouseUp;\n            pictureMatrix.MouseMove += PictureMatrix_MouseMove;\n            pictureMatrix.MouseDown += PictureMatrix_MouseDown;\n\n            trackZoom.MouseUp += TrackZoom_MouseUp;\n            trackZoom.ValueChanged += TrackZoom_Changed;\n            trackZoom.Value = Math.Min(trackZoom.Maximum, AppConfig.Get(\"matrix_zoom\", 100));\n\n            trackContrast.MouseUp += TrackMatrix_MouseUp;\n            trackContrast.ValueChanged += TrackMatrix_ValueChanged;\n            trackContrast.Value = Math.Min(trackContrast.Maximum, AppConfig.Get(\"matrix_contrast\", 100));\n\n            trackGamma.MouseUp += TrackMatrix_MouseUp;\n            trackGamma.ValueChanged += TrackMatrix_ValueChanged;\n            trackGamma.Value = Math.Min(trackGamma.Maximum, AppConfig.Get(\"matrix_gamma\", 0));\n\n            VisualiseMatrix();\n\n            comboScaling.DropDownStyle = ComboBoxStyle.DropDownList;\n            comboScaling.SelectedIndex = AppConfig.Get(\"matrix_quality\", 0);\n            comboScaling.SelectedValueChanged += ComboScaling_SelectedValueChanged;\n\n            comboRotation.DropDownStyle = ComboBoxStyle.DropDownList;\n            comboRotation.SelectedIndex = AppConfig.Get(\"matrix_rotation\", 0);\n            comboRotation.SelectedValueChanged += ComboRotation_SelectedValueChanged; ;\n\n\n            uiScale = panelPicture.Width / matrixControl.deviceMatrix.MaxColumns / 3;\n            panelPicture.Height = (int)(matrixControl.deviceMatrix.MaxRows * uiScale);\n\n        }\n\n        private void TrackMatrix_ValueChanged(object? sender, EventArgs e)\n        {\n            VisualiseMatrix();\n        }\n\n        private void TrackMatrix_MouseUp(object? sender, MouseEventArgs e)\n        {\n            AppConfig.Set(\"matrix_contrast\", trackContrast.Value);\n            AppConfig.Set(\"matrix_gamma\", trackGamma.Value);\n            SetMatrixPicture(false);\n        }\n\n\n        private void ComboRotation_SelectedValueChanged(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"matrix_rotation\", comboRotation.SelectedIndex);\n            SetMatrixPicture(false);\n        }\n\n        private void ComboScaling_SelectedValueChanged(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"matrix_quality\", comboScaling.SelectedIndex);\n            SetMatrixPicture(false);\n        }\n\n        private void Matrix_FormClosed(object? sender, FormClosingEventArgs e)\n        {\n            if (picture is not null) picture.Dispose();\n            if (ms is not null) ms.Dispose();\n\n            pictureMatrix.Dispose();\n\n            GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);\n        }\n\n        private void VisualiseMatrix()\n        {\n            labelZoom.Text = trackZoom.Value + \"%\";\n            labelContrast.Text = trackContrast.Value + \"%\";\n            labelGamma.Text = trackGamma.Value + \"%\";\n        }\n\n        private void ButtonReset_Click(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"matrix_gamma\", 0);\n            AppConfig.Set(\"matrix_contrast\", 100);\n            AppConfig.Set(\"matrix_zoom\", 100);\n            AppConfig.Set(\"matrix_x\", 0);\n            AppConfig.Set(\"matrix_y\", 0);\n\n            trackZoom.Value = 100;\n            trackContrast.Value = 100;\n            trackGamma.Value = 0;\n\n            SetMatrixPicture();\n\n        }\n\n        private void TrackZoom_MouseUp(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"matrix_zoom\", trackZoom.Value);\n            SetMatrixPicture();\n        }\n\n        private void TrackZoom_Changed(object? sender, EventArgs e)\n        {\n            VisualiseMatrix();\n        }\n\n\n        private void PictureMatrix_MouseDown(object? sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Left)\n            {\n                Dragging = true;\n                xPos = e.X;\n                yPos = e.Y;\n            }\n        }\n\n        private void PictureMatrix_MouseMove(object? sender, MouseEventArgs e)\n        {\n            Control c = sender as Control;\n            if (Dragging && c != null)\n            {\n                c.Top = e.Y + c.Top - yPos;\n                c.Left = e.X + c.Left - xPos;\n            }\n        }\n\n        private void PictureMatrix_MouseUp(object? sender, MouseEventArgs e)\n        {\n\n            Dragging = false;\n\n            Control c = sender as Control;\n\n            int matrixX = (int)((baseX - c.Left) / uiScale);\n            int matrixY = (int)((baseY - c.Top) / uiScale);\n\n            AppConfig.Set(\"matrix_x\", matrixX);\n            AppConfig.Set(\"matrix_y\", matrixY);\n\n            SetMatrixPicture(false);\n        }\n\n        private void Matrix_Shown(object? sender, EventArgs e)\n        {\n            FormPosition();\n            SetMatrixPicture();\n        }\n\n        private void SetMatrixPicture(bool visualise = true)\n        {\n            matrixControl.SetMatrixPicture(AppConfig.GetString(\"matrix_picture\"), visualise);\n        }\n\n        private void ButtonPicture_Click(object? sender, EventArgs e)\n        {\n            matrixControl.OpenMatrixPicture();\n\n        }\n        public void FormPosition()\n        {\n            if (Height > Program.settingsForm.Height)\n            {\n                Top = Program.settingsForm.Top + Program.settingsForm.Height - Height;\n            }\n            else\n            {\n                Height = Program.settingsForm.Height;\n                Top = Program.settingsForm.Top;\n            }\n\n            Left = Program.settingsForm.Left - Width - 5;\n        }\n\n        public void VisualiseMatrix(string fileName)\n        {\n\n            if (picture is not null) picture.Dispose();\n\n            using (var fs = new FileStream(fileName, FileMode.Open))\n            {\n\n                ms.SetLength(0);\n                fs.CopyTo(ms);\n                ms.Position = 0;\n                fs.Close();\n\n                picture = Image.FromStream(ms);\n\n                int width = picture.Width;\n                int height = picture.Height;\n\n                int matrixX = AppConfig.Get(\"matrix_x\", 0);\n                int matrixY = AppConfig.Get(\"matrix_y\", 0);\n                int matrixZoom = AppConfig.Get(\"matrix_zoom\", 100);\n\n                float scale = Math.Min((float)panelPicture.Width / (float)width, (float)panelPicture.Height / (float)height) * matrixZoom / 100;\n\n                pictureMatrix.Width = (int)(width * scale);\n                pictureMatrix.Height = (int)(height * scale);\n\n                baseX = panelPicture.Width - pictureMatrix.Width;\n                baseY = 0;\n\n                pictureMatrix.Left = baseX - (int)(matrixX * uiScale);\n                pictureMatrix.Top = baseY - (int)(matrixY * uiScale);\n\n                pictureMatrix.SizeMode = PictureBoxSizeMode.Zoom;\n                pictureMatrix.Image = picture;\n\n\n            }\n\n\n\n\n        }\n\n    }\n}\n"
  },
  {
    "path": "app/Matrix.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!--\n    Microsoft ResX Schema \n\n    Version 2.0\n\n    The primary goals of this format is to allow a simple XML format\n    that is mostly human readable. The generation and parsing of the\n    various data types are done through the TypeConverter classes\n    associated with the data types.\n\n    Example:\n\n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n\n    There are any number of \"resheader\" rows that contain simple\n    name/value pairs.\n\n    Each data row contains a name, and value. The row also contains a\n    type or mimetype. Type corresponds to a .NET class that support\n    text/value conversion through the TypeConverter architecture.\n    Classes that don't support this are serialized and stored with the\n    mimetype set.\n\n    The mimetype is used for serialized objects, and tells the\n    ResXResourceReader how to depersist the object. This is currently not\n    extensible. For a given mimetype the value must be set accordingly:\n\n    Note - application/x-microsoft.net.object.binary.base64 is the format\n    that the ResXResourceWriter will generate, however the reader can\n    read any of the formats listed below.\n\n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array\n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "app/Mode/ModeControl.cs",
    "content": "﻿using GHelper.Gpu.NVidia;\nusing GHelper.Helpers;\nusing GHelper.USB;\nusing Ryzen;\n\nnamespace GHelper.Mode\n{\n    public class ModeControl\n    {\n\n        static SettingsForm settings = Program.settingsForm;\n\n        private static bool customFans = false;\n        private static int customPower = 0;\n        private static bool customTemp = false;\n\n        private int _cpuUV = 0;\n        private int _igpuUV = 0;\n        private bool _ryzenPower = false;\n\n        static System.Timers.Timer reapplyTimer = default!;\n        static System.Timers.Timer modeToggleTimer = default!;\n\n        public ModeControl()\n        {\n            reapplyTimer = new System.Timers.Timer(AppConfig.GetMode(\"reapply_time\", 30) * 1000);\n            reapplyTimer.Enabled = false;\n            reapplyTimer.Elapsed += ReapplyTimer_Elapsed;\n        }\n\n\n        private void ReapplyTimer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)\n        {\n            SetCPUTemp(AppConfig.GetMode(\"cpu_temp\"));\n            SetRyzenPower();\n        }\n\n        public void AutoPerformance(bool powerChanged = false)\n        {\n            var Plugged = SystemInformation.PowerStatus.PowerLineStatus;\n\n            int mode = AppConfig.Get(\"performance_\" + (int)Plugged);\n\n            if (mode != -1)\n                SetPerformanceMode(mode, powerChanged);\n            else\n                SetPerformanceMode(Modes.GetCurrent());\n        }\n\n\n        public void ResetPerformanceMode()\n        {\n            ResetRyzen();\n\n            Program.acpi.DeviceSet(AsusACPI.PerformanceMode, Modes.GetCurrentBase(), \"Mode\");\n\n            // Default power mode\n            AppConfig.RemoveMode(\"powermode\");\n            PowerNative.SetPowerMode(Modes.GetCurrentBase());\n        }\n\n        public void Toast()\n        {\n            Program.toast.RunToast(Modes.GetCurrentName(), SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online ? ToastIcon.Charger : ToastIcon.Battery);\n        }\n\n        public void SetPerformanceMode(int mode = -1, bool notify = false)\n        {\n\n            int oldMode = Modes.GetCurrent();\n            if (mode < 0) mode = oldMode;\n\n            if (!Modes.Exists(mode)) mode = 0;\n\n            settings.ShowMode(mode);\n\n            Modes.SetCurrent(mode);\n\n\n            Task.Run(async () =>\n            {\n                bool reset = AppConfig.IsResetRequired() && (Modes.GetBase(oldMode) == Modes.GetBase(mode)) && customPower > 0 && !AppConfig.IsMode(\"auto_apply_power\");\n\n                customFans = false;\n                customPower = 0;\n                customTemp = false;\n\n                SetModeLabel();\n\n                // Workaround for not properly resetting limits on G14 2024\n                if (reset)\n                {\n                    Program.acpi.DeviceSet(AsusACPI.PerformanceMode, (Modes.GetBase(oldMode) != 1) ? AsusACPI.PerformanceTurbo : AsusACPI.PerformanceBalanced, \"ModeReset\");\n                    await Task.Delay(TimeSpan.FromMilliseconds(1500));\n                }\n\n                if (AppConfig.Is(\"status_mode\")) Program.acpi.DeviceSet(AsusACPI.StatusMode, [0x00, Modes.GetBase(mode) == AsusACPI.PerformanceSilent ? (byte)0x02 : (byte)0x03], \"StatusMode\");\n                int status = Program.acpi.DeviceSet(AsusACPI.PerformanceMode, AppConfig.IsManualModeRequired() ? AsusACPI.PerformanceManual : Modes.GetBase(mode), \"Mode\");\n                // Vivobook fallback\n                if (status != 1) Program.acpi.SetVivoMode(Modes.GetBase(mode));\n\n                SetGPUClocks();\n\n                await Task.Delay(TimeSpan.FromMilliseconds(100));\n                AutoFans();\n                await Task.Delay(TimeSpan.FromMilliseconds(1000));\n                AutoPower();\n\n                var command = AppConfig.GetModeString(\"mode_command\");\n                if (command is not null)\n                {   Logger.WriteLine(\"Running mode command: \" + command);\n                    RestrictedProcessHelper.RunAsRestrictedUser(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), \"cmd.exe\"), \"/C \" + command);\n                }\n            });\n\n\n            if (AppConfig.Is(\"xgm_fan\")) XGM.Reset();\n\n            if (notify) Toast();\n\n            if (!AppConfig.Is(\"skip_powermode\"))\n            {\n                // Windows power mode\n                if (AppConfig.GetModeString(\"powermode\") is not null)\n                    PowerNative.SetPowerMode(AppConfig.GetModeString(\"powermode\"));\n                else\n                    PowerNative.SetPowerMode(Modes.GetBase(mode));\n\n                if (AppConfig.Is(\"aspm\") && PowerNative.GetASPM() > 0) PowerNative.SetASPM(0);\n            }\n\n            // CPU Boost setting override\n            if (AppConfig.GetMode(\"auto_boost\") != -1)\n                    PowerNative.SetCPUBoost(AppConfig.GetMode(\"auto_boost\"));\n\n            settings.FansInit();\n        }\n\n\n        private void ModeToggleTimer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)\n        {\n            modeToggleTimer.Stop();\n            Logger.WriteLine($\"Timed mode: {Modes.GetCurrent()}\");\n            SetPerformanceMode();\n\n        }\n\n        public void CyclePerformanceMode(bool back = false)\n        {\n            int delay = AppConfig.Get(\"mode_delay\");\n            if (delay > 0)\n            {\n                if (modeToggleTimer is null)\n                {\n                    modeToggleTimer = new System.Timers.Timer(delay);\n                    modeToggleTimer.Elapsed += ModeToggleTimer_Elapsed;\n                }\n\n                modeToggleTimer.Stop();\n                modeToggleTimer.Start();\n                Modes.SetCurrent(Modes.GetNext(back));\n                Toast();\n            }\n            else\n            {\n                SetPerformanceMode(Modes.GetNext(back), true);\n            }\n\n        }\n\n        public void AutoFans(bool force = false)\n        {\n            customFans = false;\n\n            if (AppConfig.IsMode(\"auto_apply\") || force)\n            {\n\n                bool xgmFan = false;\n                if (AppConfig.Is(\"xgm_fan\"))\n                {\n                    XGM.SetFan(AppConfig.GetFanConfig(AsusFan.XGM));\n                    xgmFan = Program.acpi.IsXGConnected();\n                }\n\n                int cpuResult = Program.acpi.SetFanCurve(AsusFan.CPU, AppConfig.GetFanConfig(AsusFan.CPU));\n                int gpuResult = Program.acpi.SetFanCurve(AsusFan.GPU, AppConfig.GetFanConfig(AsusFan.GPU));\n\n                if (AppConfig.Is(\"mid_fan\"))\n                    Program.acpi.SetFanCurve(AsusFan.Mid, AppConfig.GetFanConfig(AsusFan.Mid));\n\n\n                // Alternative way to set fan curve\n                if (cpuResult != 1 || gpuResult != 1)\n                {\n                    cpuResult = Program.acpi.SetFanRange(AsusFan.CPU, AppConfig.GetFanConfig(AsusFan.CPU));\n                    gpuResult = Program.acpi.SetFanRange(AsusFan.GPU, AppConfig.GetFanConfig(AsusFan.GPU));\n\n                    // Something went wrong, resetting to default profile\n                    if (cpuResult != 1 || gpuResult != 1)\n                    {\n                        Program.acpi.DeviceSet(AsusACPI.PerformanceMode, Modes.GetCurrentBase(), \"Reset Mode\");\n                        settings.LabelFansResult(\"Model doesn't support custom fan curves\");\n                    }\n                }\n                else\n                {\n                    settings.LabelFansResult(\"\");\n                    customFans = true;\n                }\n\n                // force set PPTs for missbehaving bios on FX507/517 series\n                if ((AppConfig.IsPowerRequired() || xgmFan) && !AppConfig.IsMode(\"auto_apply_power\"))\n                {\n                    Task.Run(async () =>\n                    {\n                        await Task.Delay(TimeSpan.FromSeconds(1));\n                        Program.acpi.DeviceSet(AsusACPI.PPT_APUA0, 80, \"PowerLimit Fix A0\");\n                        Program.acpi.DeviceSet(AsusACPI.PPT_APUA3, 80, \"PowerLimit Fix A3\");\n                    });\n                }\n\n            }\n\n            SetModeLabel();\n\n        }\n\n        public void AutoPower(bool launchAsAdmin = false)\n        {\n\n            customPower = 0;\n\n            bool applyPower = AppConfig.IsMode(\"auto_apply_power\");\n            bool applyFans = AppConfig.IsMode(\"auto_apply\");\n\n            if (applyPower && !applyFans && AppConfig.IsFanRequired())\n            {\n                AutoFans(true);\n                Thread.Sleep(500);\n            }\n\n            if (applyPower) SetPower(launchAsAdmin);\n\n            Thread.Sleep(500);\n            SetGPUPower();\n            AutoRyzen();\n\n        }\n\n        public void SetModeLabel()\n        {\n            settings.SetModeLabel(Properties.Strings.PerformanceMode + \": \" + Modes.GetCurrentName() + (customFans ? \"+\" : \"\") + ((customPower > 0) ? \" \" + customPower + \"W\" : \"\"));\n        }\n\n        public void SetRyzenPower(bool init = false)\n        {\n            if (init) _ryzenPower = true;\n\n            if (!_ryzenPower) return;\n            if (!RyzenControl.IsRingExsists()) return;\n            if (!AppConfig.IsMode(\"auto_apply_power\")) return;\n\n            int limit_total = AppConfig.GetMode(\"limit_total\");\n            int limit_slow = AppConfig.GetMode(\"limit_slow\", limit_total);\n\n            if (limit_total > AsusACPI.MaxTotal) return;\n            if (limit_total < AsusACPI.MinTotal) return;\n\n            var stapmResult = SendCommand.set_stapm_limit((uint)limit_total * 1000);\n            if (init) Logger.WriteLine($\"STAPM: {limit_total} {stapmResult}\");\n\n            var slowResult = SendCommand.set_slow_limit((uint)limit_slow * 1000);\n            if (init) Logger.WriteLine($\"SLOW: {limit_slow} {slowResult}\");\n\n            var fastResult = SendCommand.set_fast_limit((uint)limit_slow * 1000);\n            if (init) Logger.WriteLine($\"FAST: {limit_slow} {fastResult}\");\n\n        }\n\n        public void SetPower(bool launchAsAdmin = false)\n        {\n\n            bool allAMD = Program.acpi.IsAllAmdPPT();\n            bool isAMD = RyzenControl.IsAMD();\n\n            int limit_total = AppConfig.GetMode(\"limit_total\");\n            int limit_cpu = AppConfig.GetMode(\"limit_cpu\");\n            int limit_slow = AppConfig.GetMode(\"limit_slow\");\n            int limit_fast = AppConfig.GetMode(\"limit_fast\");\n\n            if (limit_slow < 0 || allAMD) limit_slow = limit_total;\n\n            if (limit_total > AsusACPI.MaxTotal) return;\n            if (limit_total < AsusACPI.MinTotal) return;\n\n            if (limit_cpu > AsusACPI.MaxCPU) return;\n            if (limit_cpu < AsusACPI.MinCPU) return;\n\n            if (limit_fast > AsusACPI.MaxTotal) return;\n            if (limit_fast < AsusACPI.MinTotal) return;\n\n            if (limit_slow > AsusACPI.MaxTotal) return;\n            if (limit_slow < AsusACPI.MinTotal) return;\n\n            // SPL and SPPT \n            if (Program.acpi.DeviceGet(AsusACPI.PPT_APUA0) >= 0)\n            {\n                Program.acpi.DeviceSet(AsusACPI.PPT_APUA3, limit_total, \"PowerLimit A3\");\n                Program.acpi.DeviceSet(AsusACPI.PPT_APUA0, limit_slow, \"PowerLimit A0\");\n                customPower = limit_total;\n            }\n            else if (isAMD)\n            {\n\n                if (ProcessHelper.IsUserAdministrator())\n                {\n                    SetRyzenPower(true);\n                }\n                else if (launchAsAdmin)\n                {\n                    ProcessHelper.RunAsAdmin(\"cpu\");\n                    return;\n                }\n            }\n\n            if (Program.acpi.IsAllAmdPPT()) // CPU limit all amd models\n            {\n                Program.acpi.DeviceSet(AsusACPI.PPT_CPUB0, limit_cpu, \"PowerLimit B0\");\n                customPower = limit_cpu;\n            }\n            else if (isAMD && Program.acpi.DeviceGet(AsusACPI.PPT_APUC1) >= 0) // FPPT boost for non all-amd models\n            {\n                Program.acpi.DeviceSet(AsusACPI.PPT_APUC1, limit_fast, \"PowerLimit C1\");\n            }\n\n\n            SetModeLabel();\n\n        }\n\n        public void SetGPUClocks(bool launchAsAdmin = true, bool reset = false)\n        {\n            Task.Run(() =>\n            {\n\n                int core = AppConfig.GetMode(\"gpu_core\");\n                int memory = AppConfig.GetMode(\"gpu_memory\");\n                int clock_limit = AppConfig.GetMode(\"gpu_clock_limit\");\n\n                if (reset) core = memory = clock_limit = 0;\n\n                if (core == -1 && memory == -1 && clock_limit == -1) return;\n                //if ((gpu_core > -5 && gpu_core < 5) && (gpu_memory > -5 && gpu_memory < 5)) launchAsAdmin = false;\n\n                if (Program.acpi.DeviceGet(AsusACPI.GPUEco) == 1) { Logger.WriteLine(\"Clocks: Eco\"); return; }\n                if (HardwareControl.GpuControl is null) { Logger.WriteLine(\"Clocks: NoGPUControl\"); return; }\n                if (!HardwareControl.GpuControl!.IsNvidia) { Logger.WriteLine(\"Clocks: NotNvidia\"); return; }\n\n                using NvidiaGpuControl nvControl = (NvidiaGpuControl)HardwareControl.GpuControl;\n                try\n                {\n                    int statusLimit = nvControl.SetMaxGPUClock(clock_limit);\n                    int statusClocks = nvControl.SetClocks(core, memory);\n                    if ((statusLimit != 0 || statusClocks != 0) && launchAsAdmin) ProcessHelper.RunAsAdmin(\"gpu\");\n                }\n                catch (Exception ex)\n                {\n                    Logger.WriteLine(\"Clocks Error:\" + ex.ToString());\n                }\n\n                settings.GPUInit();\n            });\n        }\n\n        public void SetGPUPower()\n        {\n\n            int gpu_boost = AppConfig.GetMode(\"gpu_boost\");\n            int gpu_temp = AppConfig.GetMode(\"gpu_temp\");\n            int gpu_power = AppConfig.GetMode(\"gpu_power\");\n\n            int boostResult = -1;\n\n            if (gpu_power >= AsusACPI.MinGPUPower && gpu_power <= AsusACPI.MaxGPUPower && Program.acpi.DeviceGet(AsusACPI.GPU_POWER) >= 0)\n                Program.acpi.DeviceSet(AsusACPI.GPU_POWER, gpu_power, \"PowerLimit TGP (GPU VAR)\");\n\n            if (gpu_boost >= AsusACPI.MinGPUBoost && gpu_boost <= AsusACPI.MaxGPUBoost && Program.acpi.DeviceGet(AsusACPI.PPT_GPUC0) >= 0)\n                boostResult = Program.acpi.DeviceSet(AsusACPI.PPT_GPUC0, gpu_boost, \"PowerLimit C0 (GPU BOOST)\");\n\n            if (gpu_temp >= AsusACPI.MinGPUTemp && gpu_temp <= AsusACPI.MaxGPUTemp && Program.acpi.DeviceGet(AsusACPI.PPT_GPUC2) >= 0)\n                Program.acpi.DeviceSet(AsusACPI.PPT_GPUC2, gpu_temp, \"PowerLimit C2 (GPU TEMP)\");\n\n            // Fallback\n            if (boostResult == 0)\n                Program.acpi.DeviceSet(AsusACPI.PPT_GPUC0, gpu_boost, \"PowerLimit C0\");\n\n        }\n\n        public void SetCPUTemp(int? cpuTemp, bool init = false)\n        {\n            if (cpuTemp == RyzenControl.MaxTemp && customTemp)\n            {\n                cpuTemp = RyzenControl.DefaultTemp;\n                Logger.WriteLine($\"Custom CPU Temp reset\");\n            }\n\n            if (cpuTemp >= RyzenControl.MinTemp && cpuTemp < RyzenControl.MaxTemp)\n            {\n                var resultCPU = SendCommand.set_tctl_temp((uint)cpuTemp);\n                if (init) Logger.WriteLine($\"CPU Temp: {cpuTemp} {resultCPU}\");\n                if (resultCPU == Smu.Status.OK) customTemp = cpuTemp != RyzenControl.DefaultTemp;\n            }\n        }\n\n        public void SetUV(int cpuUV)\n        {\n            if (!RyzenControl.IsSupportedUV()) return;\n\n            if (cpuUV >= RyzenControl.MinCPUUV && cpuUV <= RyzenControl.MaxCPUUV)\n            {\n                var uvResult = SendCommand.set_coall(cpuUV);\n                Logger.WriteLine($\"UV: {cpuUV} {uvResult}\");\n                if (uvResult == Smu.Status.OK) _cpuUV = cpuUV;\n            }\n        }\n\n        public void SetUViGPU(int igpuUV)\n        {\n            if (!RyzenControl.IsSupportedUViGPU()) return;\n\n            if (igpuUV >= RyzenControl.MinIGPUUV && igpuUV <= RyzenControl.MaxIGPUUV)\n            {\n                var iGPUResult = SendCommand.set_cogfx(igpuUV);\n                Logger.WriteLine($\"iGPU UV: {igpuUV} {iGPUResult}\");\n                if (iGPUResult == Smu.Status.OK) _igpuUV = igpuUV;\n            }\n        }\n\n\n        public void SetRyzen(bool launchAsAdmin = false)\n        {\n            if (!ProcessHelper.IsUserAdministrator())\n            {\n                if (launchAsAdmin) ProcessHelper.RunAsAdmin(\"uv\");\n                return;\n            }\n\n            if (!RyzenControl.IsRingExsists()) return;\n\n            try\n            {\n                SetUV(AppConfig.GetMode(\"cpu_uv\", 0));\n                SetUViGPU(AppConfig.GetMode(\"igpu_uv\", 0));\n                SetCPUTemp(AppConfig.GetMode(\"cpu_temp\"), true);\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine(\"UV Error: \" + ex.ToString());\n            }\n\n            reapplyTimer.Enabled = AppConfig.IsMode(\"auto_uv\");\n        }\n\n        public void ResetRyzen()\n        {\n            if (_cpuUV != 0) SetUV(0);\n            if (_igpuUV != 0) SetUViGPU(0);\n            reapplyTimer.Enabled = false;\n        }\n\n        public void AutoRyzen()\n        {\n            if (!RyzenControl.IsAMD()) return;\n\n            if (AppConfig.IsMode(\"auto_uv\")) SetRyzen();\n            else ResetRyzen();\n        }\n\n        public void ShutdownReset()\n        {\n            if (!AppConfig.IsShutdownReset()) return;\n            Program.acpi.DeviceSet(AsusACPI.PerformanceMode,AsusACPI.PerformanceBalanced, \"Mode Reset\");\n        }\n\n    }\n}\n"
  },
  {
    "path": "app/Mode/Modes.cs",
    "content": "﻿namespace GHelper.Mode\n{\n    internal class Modes\n    {\n        static Dictionary<string, string> settings = new Dictionary<string, string>\n        {\n            { \"mode_base\", \"_\" },\n            { \"mode_name\", \"_\" },\n            { \"powermode\", \"string\" },\n            { \"limit_total\", \"int\" },\n            { \"limit_slow\", \"int\" },\n            { \"limit_fast\", \"int\" },\n            { \"limit_cpu\", \"int\" },\n            { \"fan_profile_cpu\", \"string\" },\n            { \"fan_profile_gpu\", \"string\" },\n            { \"fan_profile_mid\", \"string\" }, \n            { \"gpu_power\", \"int\" },\n            { \"gpu_boost\", \"int\" },\n            { \"gpu_temp\", \"int\" },\n            { \"gpu_core\", \"int\" },\n            { \"gpu_memory\", \"int\" },\n            { \"gpu_clock_limit\", \"int\" },\n            { \"cpu_temp\", \"_\" },\n            { \"cpu_uv\", \"_\" },\n            { \"igpu_uv\", \"_\" },\n            { \"auto_boost\", \"int\" },\n            { \"auto_apply\", \"int\" },\n            { \"auto_apply_power\", \"int\" },\n            { \"auto_uv\", \"_\" }\n        };\n\n        const int maxModes = 20;\n\n        public static Dictionary<int, string> GetDictonary()\n        {\n            Dictionary<int, string> modes = new Dictionary<int, string>\n            {\n              {2, Properties.Strings.Silent},\n              {0, Properties.Strings.Balanced},\n              {1, Properties.Strings.Turbo}\n            };\n\n            for (int i = 3; i < maxModes; i++)\n            {\n                if (Exists(i)) modes.Add(i, GetName(i));\n            }\n\n            return modes;\n        }\n\n        public static List<int> GetList()\n        {\n            List<int> modes = new() { 2, 0, 1 };\n            for (int i = 3; i < maxModes; i++)\n            {\n                if (Exists(i)) modes.Add(i);\n            }\n\n            return modes;\n        }\n\n        public static void Remove(int mode)\n        {\n            foreach (string clean in settings.Keys)\n            {\n                AppConfig.Remove(clean + \"_\" + mode);\n            }\n        }\n\n        public static int Add()\n        {\n            int currentMode = GetCurrent();\n\n            for (int i = 3; i < maxModes; i++)\n            {\n                if (Exists(i)) continue;\n\n                AppConfig.Set(\"mode_base_\" + i, GetCurrentBase());\n                AppConfig.Set(\"mode_name_\" + i, \"Custom \" + (i - 2));\n\n                if (Exists(currentMode))\n                {\n                    foreach (var kvp in settings)\n                    {\n                        if (kvp.Value == \"_\") continue;\n\n                        string sourceKey = kvp.Key + \"_\" + currentMode;\n                        string targetKey = kvp.Key + \"_\" + i;\n\n                        if (!AppConfig.Exists(sourceKey)) continue;\n\n                        if (kvp.Value == \"int\")\n                            AppConfig.Set(targetKey, AppConfig.Get(sourceKey));\n                        else\n                            AppConfig.Set(targetKey, AppConfig.GetString(sourceKey));\n                    }\n                }\n\n                return i;\n            }\n            return -1;\n        }\n\n\n        public static int GetCurrent()\n        {\n            return AppConfig.Get(\"performance_mode\");\n        }\n\n        public static bool IsCurrentCustom()\n        {\n            return GetCurrent() > 2;\n        }\n\n        public static void SetCurrent(int mode)\n        {\n            AppConfig.Set(\"performance_\" + (int)SystemInformation.PowerStatus.PowerLineStatus, mode);\n            AppConfig.Set(\"performance_mode\", mode);\n        }\n\n        public static int GetCurrentBase()\n        {\n            return GetBase(GetCurrent());\n        }\n\n        public static string GetCurrentName()\n        {\n            return GetName(GetCurrent());\n        }\n\n        public static bool Exists(int mode)\n        {\n            return GetBase(mode) >= 0;\n        }\n\n        public static int GetBase(int mode)\n        {\n            if (mode >= 0 && mode <= 2)\n                return mode;\n            else\n                return AppConfig.Get(\"mode_base_\" + mode);\n        }\n\n        public static string GetName(int mode)\n        {\n            switch (mode)\n            {\n                case 0:\n                    return Properties.Strings.Balanced;\n                case 1:\n                    return Properties.Strings.Turbo;\n                case 2:\n                    return Properties.Strings.Silent;\n                default:\n                    return AppConfig.GetString(\"mode_name_\" + mode);\n            }\n        }\n\n\n        public static int GetNext(bool back = false)\n        {\n            var modes = GetList();\n            int index = modes.IndexOf(GetCurrent());\n\n            if (back)\n            {\n                index--;\n                if (index < 0) index = modes.Count - 1;\n                return modes[index];\n            }\n            else\n            {\n                index++;\n                if (index > modes.Count - 1) index = 0;\n                return modes[index];\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/Mode/PowerNative.cs",
    "content": "﻿using Microsoft.Win32;\nusing System.Runtime.InteropServices;\n\nnamespace GHelper.Mode\n{\n    internal class PowerNative\n    {\n        [DllImport(\"PowrProf.dll\", CharSet = CharSet.Unicode)]\n        static extern UInt32 PowerWriteDCValueIndex(IntPtr RootPowerKey,\n            [MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid,\n            [MarshalAs(UnmanagedType.LPStruct)] Guid SubGroupOfPowerSettingsGuid,\n            [MarshalAs(UnmanagedType.LPStruct)] Guid PowerSettingGuid,\n            int AcValueIndex);\n\n        [DllImport(\"PowrProf.dll\", CharSet = CharSet.Unicode)]\n        static extern UInt32 PowerWriteACValueIndex(IntPtr RootPowerKey,\n            [MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid,\n            [MarshalAs(UnmanagedType.LPStruct)] Guid SubGroupOfPowerSettingsGuid,\n            [MarshalAs(UnmanagedType.LPStruct)] Guid PowerSettingGuid,\n            int AcValueIndex);\n\n        [DllImport(\"PowrProf.dll\", CharSet = CharSet.Unicode)]\n        static extern UInt32 PowerReadACValueIndex(IntPtr RootPowerKey,\n            [MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid,\n            [MarshalAs(UnmanagedType.LPStruct)] Guid SubGroupOfPowerSettingsGuid,\n            [MarshalAs(UnmanagedType.LPStruct)] Guid PowerSettingGuid,\n            out IntPtr AcValueIndex\n            );\n\n        [DllImport(\"PowrProf.dll\", CharSet = CharSet.Unicode)]\n        static extern UInt32 PowerReadDCValueIndex(IntPtr RootPowerKey,\n            [MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid,\n            [MarshalAs(UnmanagedType.LPStruct)] Guid SubGroupOfPowerSettingsGuid,\n            [MarshalAs(UnmanagedType.LPStruct)] Guid PowerSettingGuid,\n            out IntPtr AcValueIndex\n            );\n\n\n        [DllImport(\"powrprof.dll\")]\n        static extern uint PowerReadACValue(\n            IntPtr RootPowerKey,\n            Guid SchemeGuid,\n            Guid SubGroupOfPowerSettingGuid,\n            Guid PowerSettingGuid,\n            ref int Type,\n            ref IntPtr Buffer,\n            ref uint BufferSize\n            );\n\n\n        [DllImport(\"PowrProf.dll\", CharSet = CharSet.Unicode)]\n        static extern UInt32 PowerSetActiveScheme(IntPtr RootPowerKey,\n            [MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid);\n\n        [DllImport(\"PowrProf.dll\", CharSet = CharSet.Unicode)]\n        static extern UInt32 PowerGetActiveScheme(IntPtr UserPowerKey, out IntPtr ActivePolicyGuid);\n\n        static readonly Guid GUID_CPU = new Guid(\"54533251-82be-4824-96c1-47b60b740d00\");\n        static readonly Guid GUID_BOOST = new Guid(\"be337238-0d82-4146-a960-4f3749d470c7\");\n\n        private static Guid GUID_SLEEP_SUBGROUP = new Guid(\"238c9fa8-0aad-41ed-83f4-97be242c8f20\");\n        private static Guid GUID_HIBERNATEIDLE = new Guid(\"9d7815a6-7ee4-497e-8888-515a05f02364\");\n\n        private static Guid GUID_SYSTEM_BUTTON_SUBGROUP = new Guid(\"4f971e89-eebd-4455-a8de-9e59040e7347\");\n        private static Guid GUID_LIDACTION = new Guid(\"5CA83367-6E45-459F-A27B-476B1D01C936\");\n\n        private static Guid GUID_SUB_PCIEXPRESS = new Guid(\"501a4d13-42af-4429-9fd1-a8218c268e20\");\n        private static Guid GUID_PCI_EXPRESS_ASPM = new Guid(\"ee12f906-d277-404b-b6da-e5fa1a576df5\");\n\n        [DllImportAttribute(\"powrprof.dll\", EntryPoint = \"PowerGetActualOverlayScheme\")]\n        public static extern uint PowerGetActualOverlayScheme(out Guid ActualOverlayGuid);\n\n        [DllImportAttribute(\"powrprof.dll\", EntryPoint = \"PowerGetEffectiveOverlayScheme\")]\n        public static extern uint PowerGetEffectiveOverlayScheme(out Guid EffectiveOverlayGuid);\n\n        [DllImportAttribute(\"powrprof.dll\", EntryPoint = \"PowerSetActiveOverlayScheme\")]\n        public static extern uint PowerSetActiveOverlayScheme(Guid OverlaySchemeGuid);\n\n        const string POWER_SILENT = \"961cc777-2547-4f9d-8174-7d86181b8a7a\";\n        const string POWER_BALANCED = \"00000000-0000-0000-0000-000000000000\";\n        const string POWER_TURBO = \"ded574b5-45a0-4f42-8737-46345c09c238\";\n\n        const string PLAN_BALANCED = \"381b4222-f694-41f0-9685-ff5bb260df2e\";\n        const string PLAN_HIGH_PERFORMANCE = \"8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c\";\n\n        static List<string> overlays = new() {\n                POWER_BALANCED,\n                POWER_TURBO,\n                POWER_SILENT,\n            };\n\n        public static Dictionary<string, string> powerModes = new Dictionary<string, string>\n            {\n                { POWER_SILENT, \"Best Power Efficiency\" },\n                { POWER_BALANCED, \"Balanced\" },\n                { POWER_TURBO, \"Best Performance\" },\n                { PLAN_HIGH_PERFORMANCE, \"High Performance Plan\"},\n            };\n        static Guid GetActiveScheme()\n        {\n            IntPtr pActiveSchemeGuid;\n            var hr = PowerGetActiveScheme(IntPtr.Zero, out pActiveSchemeGuid);\n            Guid activeSchemeGuid = (Guid)Marshal.PtrToStructure(pActiveSchemeGuid, typeof(Guid));\n            return activeSchemeGuid;\n        }\n\n        public static int GetCPUBoost()\n        {\n            IntPtr AcValueIndex;\n            Guid activeSchemeGuid = GetActiveScheme();\n\n            UInt32 value = PowerReadACValueIndex(IntPtr.Zero,\n                 activeSchemeGuid,\n                 GUID_CPU,\n                 GUID_BOOST, out AcValueIndex);\n\n            return AcValueIndex.ToInt32();\n\n        }\n\n        public static void SetCPUBoost(int boost = 0)\n        {\n            Guid activeSchemeGuid = GetActiveScheme();\n\n            if (boost == GetCPUBoost()) return;\n\n            var hrAC = PowerWriteACValueIndex(\n                 IntPtr.Zero,\n                 activeSchemeGuid,\n                 GUID_CPU,\n                 GUID_BOOST,\n                 boost);\n\n            PowerSetActiveScheme(IntPtr.Zero, activeSchemeGuid);\n\n            var hrDC = PowerWriteDCValueIndex(\n                 IntPtr.Zero,\n                 activeSchemeGuid,\n                 GUID_CPU,\n                 GUID_BOOST,\n                 boost);\n\n            PowerSetActiveScheme(IntPtr.Zero, activeSchemeGuid);\n\n            Logger.WriteLine(\"Boost \" + boost);\n        }\n\n        public static string GetPowerMode()\n        {\n            if (GetActiveScheme().ToString() == PLAN_HIGH_PERFORMANCE) return PLAN_HIGH_PERFORMANCE;\n            PowerGetEffectiveOverlayScheme(out Guid activeScheme);\n            return activeScheme.ToString();\n        }\n\n        public static void SetPowerMode(string scheme)\n        {\n\n            if (scheme == PLAN_HIGH_PERFORMANCE)\n            {\n                SetPowerPlan(scheme);\n                return;\n            }\n            else\n            {\n                // Power plan from config or defaulting to balanced\n                SetPowerPlan(AppConfig.GetModeString(\"scheme\"));\n            }\n\n            if (!overlays.Contains(scheme)) return;\n\n            Guid guidScheme = new Guid(scheme);\n\n            uint status = PowerGetEffectiveOverlayScheme(out Guid activeScheme);\n\n            if (GetBatterySaverStatus())\n            {\n                Logger.WriteLine(\"Battery Saver detected\");\n                return;\n            }\n\n            if (status != 0 || activeScheme != guidScheme)\n            {\n                status = PowerSetActiveOverlayScheme(guidScheme);\n                Logger.WriteLine(\"Power Mode \" + activeScheme + \" -> \" + scheme + \":\" + (status == 0 ? \"OK\" : status));\n            }\n\n        }\n\n        public static void SetPowerPlan(string scheme)\n        {\n            // Skipping power modes\n            if (overlays.Contains(scheme)) return;\n\n            if (scheme is null) scheme = PLAN_BALANCED;\n            var activeScheme = GetActiveScheme().ToString();\n            if (activeScheme == scheme) return;\n\n            uint status = PowerSetActiveScheme(IntPtr.Zero, new Guid(scheme));\n            Logger.WriteLine($\"Power Plan {activeScheme} -> {scheme} :\" + (status == 0 ? \"OK\" : status));\n        }\n\n        public static string GetDefaultPowerMode(int mode)\n        {\n            switch (mode)\n            {\n                case 1: // turbo\n                    return POWER_TURBO;\n                case 2: //silent\n                    return POWER_SILENT;\n                default: // balanced\n                    return POWER_BALANCED;\n            }\n        }\n\n        public static void SetPowerMode(int mode)\n        {\n            SetPowerMode(GetDefaultPowerMode(mode));\n        }\n\n        public static int GetASPM()\n        {\n            Guid activeSchemeGuid = GetActiveScheme();\n            IntPtr activeIndex;\n\n            PowerReadACValueIndex(IntPtr.Zero,\n                    activeSchemeGuid,\n                    GUID_SUB_PCIEXPRESS,\n                    GUID_PCI_EXPRESS_ASPM, out activeIndex);\n\n            return activeIndex.ToInt32();\n        }\n\n        public static void SetASPM(int status = 0)\n        {\n            Guid activeSchemeGuid = GetActiveScheme();\n\n            var hrAC = PowerWriteACValueIndex(\n                IntPtr.Zero,\n                activeSchemeGuid,\n                GUID_SUB_PCIEXPRESS,\n                GUID_PCI_EXPRESS_ASPM,\n                status);\n\n            PowerSetActiveScheme(IntPtr.Zero, activeSchemeGuid);\n            Logger.WriteLine(\"Changed ASPM to \" + status);\n        }\n\n        public static int GetLidAction(bool ac)\n        {\n            Guid activeSchemeGuid = GetActiveScheme();\n\n            IntPtr activeIndex;\n            if (ac)\n                PowerReadACValueIndex(IntPtr.Zero,\n                     activeSchemeGuid,\n                     GUID_SYSTEM_BUTTON_SUBGROUP,\n                     GUID_LIDACTION, out activeIndex);\n\n            else\n                PowerReadDCValueIndex(IntPtr.Zero,\n                    activeSchemeGuid,\n                    GUID_SYSTEM_BUTTON_SUBGROUP,\n                    GUID_LIDACTION, out activeIndex);\n\n\n            return activeIndex.ToInt32();\n        }\n\n\n        public static void SetLidAction(int action, bool acOnly = false)\n        {\n            /**\n             * 1: Do nothing\n             * 2: Seelp\n             * 3: Hibernate\n             * 4: Shutdown\n             */\n\n            Guid activeSchemeGuid = GetActiveScheme();\n\n            var hrAC = PowerWriteACValueIndex(\n                IntPtr.Zero,\n                activeSchemeGuid,\n                GUID_SYSTEM_BUTTON_SUBGROUP,\n                GUID_LIDACTION,\n                action);\n\n            PowerSetActiveScheme(IntPtr.Zero, activeSchemeGuid);\n\n            if (!acOnly)\n            {\n                var hrDC = PowerWriteDCValueIndex(\n                  IntPtr.Zero,\n                  activeSchemeGuid,\n                  GUID_SYSTEM_BUTTON_SUBGROUP,\n                  GUID_LIDACTION,\n                  action);\n\n                PowerSetActiveScheme(IntPtr.Zero, activeSchemeGuid);\n            }\n\n            Logger.WriteLine(\"Changed Lid Action to \" + action);\n        }\n\n        public static int GetHibernateAfter()\n        {\n            Guid activeSchemeGuid = GetActiveScheme();\n            IntPtr seconds;\n            PowerReadDCValueIndex(IntPtr.Zero,\n                    activeSchemeGuid,\n                    GUID_SLEEP_SUBGROUP,\n                    GUID_HIBERNATEIDLE, out seconds);\n\n            Logger.WriteLine(\"Hibernate after \" + seconds);\n            return (seconds.ToInt32() / 60);\n        }\n\n\n        public static void SetHibernateAfter(int minutes)\n        {\n            int seconds = minutes * 60;\n\n            Guid activeSchemeGuid = GetActiveScheme();\n            var hrAC = PowerWriteDCValueIndex(\n                IntPtr.Zero,\n                activeSchemeGuid,\n                GUID_SLEEP_SUBGROUP,\n                GUID_HIBERNATEIDLE,\n                seconds);\n\n            PowerSetActiveScheme(IntPtr.Zero, activeSchemeGuid);\n\n            Logger.WriteLine(\"Setting Hibernate after \" + seconds + \": \" + (hrAC == 0 ? \"OK\" : hrAC));\n        }\n\n        [DllImport(\"Kernel32\")]\n        private static extern bool GetSystemPowerStatus(SystemPowerStatus sps);\n        public enum ACLineStatus : byte\n        {\n            Offline = 0, Online = 1, Unknown = 255\n        }\n\n        public enum BatteryFlag : byte\n        {\n            High = 1,\n            Low = 2,\n            Critical = 4,\n            Charging = 8,\n            NoSystemBattery = 128,\n            Unknown = 255\n        }\n\n        // Fields must mirror their unmanaged counterparts, in order\n        [StructLayout(LayoutKind.Sequential)]\n        public class SystemPowerStatus\n        {\n            public ACLineStatus ACLineStatus;\n            public BatteryFlag BatteryFlag;\n            public Byte BatteryLifePercent;\n            public Byte SystemStatusFlag;\n            public Int32 BatteryLifeTime;\n            public Int32 BatteryFullLifeTime;\n        }\n\n        public static bool GetBatterySaverStatus()\n        {\n            try\n            {\n                var status = Registry.GetValue(@\"HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Power\", \"EnergySaverState\", null);\n                if (status == null)\n                {\n                    SystemPowerStatus sps = new SystemPowerStatus();\n                    GetSystemPowerStatus(sps);\n                    return (sps.SystemStatusFlag > 0);\n                }\n                return (int)status == 1;\n            }\n            catch (Exception e)\n            {\n                Logger.WriteLine(\"Can't check EnergySaverState\" + e.Message);\n                return false;\n            }\n        }\n\n\n    }\n}\n"
  },
  {
    "path": "app/NativeMethods.cs",
    "content": "﻿using System.Runtime.InteropServices;\n\n\npublic static class NativeMethods\n{\n\n    internal struct LASTINPUTINFO\n    {\n        public uint cbSize;\n        public uint dwTime;\n    }\n\n    [DllImport(\"User32.dll\")]\n    private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);\n\n    public static TimeSpan GetIdleTime()\n    {\n        LASTINPUTINFO lastInPut = new LASTINPUTINFO();\n        lastInPut.cbSize = (uint)Marshal.SizeOf(lastInPut);\n        GetLastInputInfo(ref lastInPut);\n        return TimeSpan.FromMilliseconds((uint)Environment.TickCount - lastInPut.dwTime);\n\n    }\n\n    private const int WM_SYSCOMMAND = 0x0112;\n    private const int SC_MONITORPOWER = 0xF170;\n    private const int MONITOR_OFF = 2;\n\n    [DllImport(\"user32.dll\", CharSet = CharSet.Auto, SetLastError = true)]\n    public static extern int RegisterWindowMessage(string lpString);\n\n    [DllImport(\"user32.dll\", CharSet = CharSet.Auto, SetLastError = true)]\n    private static extern IntPtr SendMessage(nint hWnd, int hMsg, int wParam, int lParam);\n\n    [DllImport(\"kernel32.dll\", CharSet = CharSet.Auto, SetLastError = true)]\n    private static extern uint FormatMessage(uint dwFlags, IntPtr lpSource, uint dwMessageId, uint dwLanguageId, out string lpBuffer, uint nSize, IntPtr Arguments);\n\n    [DllImport(\"user32.dll\", SetLastError = true)]\n    [return: MarshalAs(UnmanagedType.Bool)]\n    private static extern bool LockWorkStation();\n\n    public static void LockScreen()\n    {\n        LockWorkStation();\n    }\n\n    public static void TurnOffScreen()\n    {\n        Form f = new Form();\n        IntPtr result = SendMessage(f.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF);\n\n        if (result == IntPtr.Zero)\n        {\n            int error = Marshal.GetLastWin32Error();\n            string message = \"\";\n            uint formatFlags = 0x00001000 | 0x00000200 | 0x00000100 | 0x00000080;\n            uint formatResult = FormatMessage(formatFlags, IntPtr.Zero, (uint)error, 0, out message, 0, IntPtr.Zero);\n            if (formatResult == 0)\n            {\n                message = \"Unknown error.\";\n            }\n            Logger.WriteLine($\"Failed to turn off screen. Error code: {error}. {message}\");\n        }\n    }\n\n    // Monitor Power detection\n\n    internal const uint DEVICE_NOTIFY_WINDOW_HANDLE = 0x0;\n    internal const uint DEVICE_NOTIFY_SERVICE_HANDLE = 0x1;\n    internal const int WM_POWERBROADCAST = 0x0218;\n    internal const int PBT_POWERSETTINGCHANGE = 0x8013;\n\n    [DllImport(\"User32.dll\", SetLastError = true)]\n    internal static extern IntPtr RegisterPowerSettingNotification(IntPtr hWnd, [In] Guid PowerSettingGuid, uint Flags);\n\n    [DllImport(\"User32.dll\", SetLastError = true)]\n    internal static extern bool UnregisterPowerSettingNotification(IntPtr hWnd);\n\n    [StructLayout(LayoutKind.Sequential, Pack = 4)]\n    internal struct POWERBROADCAST_SETTING\n    {\n        public Guid PowerSetting;\n        public uint DataLength;\n        public byte Data;\n    }\n\n    public class PowerSettingGuid\n    {\n        // 0=Powered by AC, 1=Powered by Battery, 2=Powered by short-term source (UPC)\n        public static Guid AcdcPowerSource { get; } = new Guid(\"5d3e9a59-e9D5-4b00-a6bd-ff34ff516548\");\n        // POWERBROADCAST_SETTING.Data = 1-100\n        public static Guid BatteryPercentageRemaining { get; } = new Guid(\"a7ad8041-b45a-4cae-87a3-eecbb468a9e1\");\n        // Windows 8+: 0=Monitor Off, 1=Monitor On, 2=Monitor Dimmed\n        public static Guid ConsoleDisplayState { get; } = new Guid(\"6fe69556-704a-47a0-8f24-c28d936fda47\");\n        // Windows 8+, Session 0 enabled: 0=User providing Input, 2=User Idle\n        public static Guid GlobalUserPresence { get; } = new Guid(\"786E8A1D-B427-4344-9207-09E70BDCBEA9\");\n        // 0=Monitor Off, 1=Monitor On.\n        public static Guid MonitorPowerGuid { get; } = new Guid(\"02731015-4510-4526-99e6-e5a17ebd1aea\");\n        // 0=Battery Saver Off, 1=Battery Saver On.\n        public static Guid PowerSavingStatus { get; } = new Guid(\"E00958C0-C213-4ACE-AC77-FECCED2EEEA5\");\n\n        // Windows 8+: 0=Off, 1=On, 2=Dimmed\n        public static Guid SessionDisplayStatus { get; } = new Guid(\"2B84C20E-AD23-4ddf-93DB-05FFBD7EFCA5\");\n\n        // Windows 8+, no Session 0: 0=User providing Input, 2=User Idle\n        public static Guid SessionUserPresence { get; } = new Guid(\"3C0F4548-C03F-4c4d-B9F2-237EDE686376\");\n        // 0=Exiting away mode 1=Entering away mode\n        public static Guid SystemAwaymode { get; } = new Guid(\"98a7f580-01f7-48aa-9c0f-44352c29e5C0\");\n\n        /* Windows 8+ */\n        // POWERBROADCAST_SETTING.Data not used\n        public static Guid IdleBackgroundTask { get; } = new Guid(0x515C31D8, 0xF734, 0x163D, 0xA0, 0xFD, 0x11, 0xA0, 0x8C, 0x91, 0xE8, 0xF1);\n\n        public static Guid PowerSchemePersonality { get; } = new Guid(0x245D8541, 0x3943, 0x4422, 0xB0, 0x25, 0x13, 0xA7, 0x84, 0xF6, 0x79, 0xB7);\n\n        // The Following 3 Guids are the POWERBROADCAST_SETTING.Data result of PowerSchemePersonality\n        public static Guid MinPowerSavings { get; } = new Guid(\"8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c\");\n        public static Guid MaxPowerSavings { get; } = new Guid(\"a1841308-3541-4fab-bc81-f71556f20b4a\");\n        public static Guid TypicalPowerSavings { get; } = new Guid(\"381b4222-f694-41f0-9685-ff5bb260df2e\");\n\n        public static Guid LIDSWITCH_STATE_CHANGE = new Guid(\"ba3e0f4d-b817-4094-a2d1-d56379e6a0f3\");\n    }\n\n\n\n}\n"
  },
  {
    "path": "app/Peripherals/IPeripheral.cs",
    "content": "﻿\nnamespace GHelper.Peripherals\n{\n    public enum PeripheralType\n    {\n        Mouse,\n        Keyboard\n    }\n\n    public interface IPeripheral\n    {\n        public bool IsDeviceReady { get; }\n        public bool Wireless { get; }\n        public int Battery { get; }\n        public bool Charging { get; }\n\n        public bool CanExport();\n        public byte[] Export();\n        public bool Import(byte[] blob);\n\n        public PeripheralType DeviceType();\n\n        public string GetDisplayName();\n\n        public bool HasBattery();\n\n        public void SynchronizeDevice();\n\n        public void ReadBattery();\n    }\n}\n"
  },
  {
    "path": "app/Peripherals/Mouse/AsusMouse.cs",
    "content": "﻿using GHelper.AnimeMatrix.Communication;\nusing GHelper.AnimeMatrix.Communication.Platform;\nusing System.Runtime.CompilerServices;\nusing System.Text;\n\nnamespace GHelper.Peripherals.Mouse\n{\n    public enum PowerOffSetting\n    {\n        Minutes1 = 0,\n        Minutes2 = 1,\n        Minutes3 = 2,\n        Minutes5 = 3,\n        Minutes10 = 4,\n        Never = 0xFF\n    }\n\n    public enum DebounceTime\n    {\n        OFF = 0x00, //?? not sure because mice with this setting have no \"disabled\". But the mouse accepts and stores 0x00 just fine\n        MS8 = 0x01,\n        MS12 = 0x02,\n        MS16 = 0x03,\n        MS20 = 0x04,\n        MS24 = 0x05,\n        MS28 = 0x06,\n        MS32 = 0x07\n    }\n\n    public enum PollingRate\n    {\n        PR125Hz = 0,\n        PR250Hz = 1,\n        PR500Hz = 2,\n        PR1000Hz = 3,\n        PR2000Hz = 4,\n        PR4000Hz = 5,\n        PR8000Hz = 6,\n        PR16000Hz = 7 //for whenever that gets supported lol\n    }\n\n    public enum LiftOffDistance\n    {\n        Low = 0,\n        High = 1\n    }\n    public enum AnimationDirection\n    {\n        Clockwise = 0x0,\n        CounterClockwise = 0x1\n    }\n\n    public enum AnimationSpeed\n    {\n        Slow = 0x9,\n        Medium = 0x7,\n        Fast = 0x5\n    }\n    public enum LightingMode\n    {\n        Off = 0xF0,\n        Static = 0x0,\n        Breathing = 0x1,\n        ColorCycle = 0x2,\n        Rainbow = 0x3,\n        React = 0x4,\n        Comet = 0x5,\n        BatteryState = 0x6\n    }\n\n    public enum LightingZone\n    {\n        Logo = 0x00,\n        Scrollwheel = 0x01,\n        Underglow = 0x02,\n        All = 0x03,\n        Dock = 0x04,\n    }\n\n    public class LightingSetting\n    {\n        public LightingSetting()\n        {\n            //Some Sane defaults\n            LightingMode = LightingMode.Static;\n            AnimationSpeed = AnimationSpeed.Medium;\n            AnimationDirection = AnimationDirection.Clockwise;\n            RandomColor = false;\n            Brightness = 25;\n            RGBColor = Color.Red;\n        }\n\n        public LightingMode LightingMode { get; set; }\n        public int Brightness { get; set; }\n        public Color RGBColor { get; set; }\n        public bool RandomColor { get; set; }\n        public AnimationSpeed AnimationSpeed { get; set; }\n\n        public AnimationDirection AnimationDirection { get; set; }\n\n        public byte[] Export()\n        {\n            byte[] data = new byte[0];\n\n            data = data\n                .Append((byte)LightingMode)                         // 1 Byte\n                .Concat(BitConverter.GetBytes(Brightness))          // 4 Bytes\n                .Concat(BitConverter.GetBytes(RGBColor.ToArgb()))   // 4 Bytes\n                .Concat(BitConverter.GetBytes(RandomColor))         // 1 Byte\n                .Append((byte)AnimationSpeed)                       // 1 Byte\n                .Append((byte)AnimationDirection)                   // 1 Byte\n                .ToArray();\n\n            //12 bytes\n            return data;\n        }\n\n        public bool Import(byte[] blob)\n        {\n            if (blob.Length != 12)\n            {\n                //Data must be 12 bytes\n                return false;\n            }\n\n            LightingMode = (LightingMode)blob[0];\n\n            Brightness = BitConverter.ToInt32(blob, 1);\n            RGBColor = Color.FromArgb(BitConverter.ToInt32(blob, 5));\n            RandomColor = BitConverter.ToBoolean(blob, 9);\n\n            AnimationSpeed = (AnimationSpeed)blob[10];\n            AnimationDirection = (AnimationDirection)blob[11];\n\n            return true;\n        }\n\n        public override bool Equals(object? obj)\n        {\n            return obj is LightingSetting setting &&\n                   LightingMode == setting.LightingMode &&\n                   Brightness == setting.Brightness &&\n                   RGBColor.Equals(setting.RGBColor) &&\n                   RandomColor == setting.RandomColor &&\n                   AnimationSpeed == setting.AnimationSpeed &&\n                   AnimationDirection == setting.AnimationDirection;\n        }\n\n        public override int GetHashCode()\n        {\n            return HashCode.Combine(LightingMode, Brightness, RGBColor, RandomColor, AnimationSpeed, AnimationDirection);\n        }\n\n        public override string? ToString()\n        {\n            return \"LightingMode: \" + LightingMode + \", Color (\" + RGBColor.R + \", \" + RGBColor.G + \", \" + RGBColor.B\n                + \"), Brightness: \" + Brightness + \"%, LightingSpeed: \" + AnimationSpeed + \", RandomColor:\" + RandomColor + \", AnimationDirection:\" + AnimationDirection;\n        }\n\n\n    }\n\n    public class AsusMouseDPI\n    {\n        public AsusMouseDPI()\n        {\n            Color = Color.Red;\n            DPI = 800;\n        }\n        public Color Color { get; set; }\n        public uint DPI { get; set; }\n        public override string? ToString()\n        {\n            return \"DPI: \" + DPI + \", Color (\" + Color.R + \", \" + Color.G + \", \" + Color.B + \")\";\n        }\n\n        public byte[] Export()\n        {\n            byte[] data = new byte[0];\n\n            data = data\n                .Concat(BitConverter.GetBytes(DPI))                     // 4 bytes\n                .Concat(BitConverter.GetBytes(Color.ToArgb()))          // 4 bytes\n                .ToArray();\n\n            //8 bytes\n            return data;\n        }\n\n        public bool Import(byte[] blob)\n        {\n            if (blob.Length != 8)\n            {\n                //Data must be 8 bytes\n                return false;\n            }\n\n            DPI = BitConverter.ToUInt32(blob, 0);\n            Color = Color.FromArgb(BitConverter.ToInt32(blob, 4));\n\n            return true;\n        }\n    }\n\n    public abstract class AsusMouse : Device, IPeripheral\n    {\n        private static string[] POLLING_RATES = { \"125 Hz\", \"250 Hz\", \"500 Hz\", \"1000 Hz\", \"2000 Hz\", \"4000 Hz\", \"8000 Hz\", \"16000 Hz\" };\n        internal const bool PACKET_LOGGER_ALWAYS_ON = false;\n\n        public event EventHandler? Disconnect;\n        public event EventHandler? BatteryUpdated;\n        public event EventHandler? MouseReadyChanged;\n\n        private readonly string path;\n\n        protected byte reportId = 0x00;\n\n        public bool IsDeviceReady { get; protected set; }\n\n        private void SetDeviceReady(bool ready)\n        {\n            bool notify = false;\n            if (IsDeviceReady != ready)\n            {\n                notify = true;\n            }\n            IsDeviceReady = ready;\n\n\n            if (MouseReadyChanged is not null && notify)\n            {\n                MouseReadyChanged(this, EventArgs.Empty);\n            }\n        }\n        public bool Wireless { get; protected set; }\n        public int Battery { get; protected set; }\n        public bool Charging { get; protected set; }\n        public LightingSetting[] LightingSetting { get; protected set; }\n        public int LowBatteryWarning { get; protected set; }\n        public PowerOffSetting PowerOffSetting { get; protected set; }\n        public LiftOffDistance LiftOffDistance { get; protected set; }\n        public int DpiProfile { get; protected set; }\n        public int CurrentDPIProfileCount { get; protected set; }\n        public AsusMouseDPI[] DpiSettings { get; protected set; }\n        public int Profile { get; protected set; }\n        public PollingRate PollingRate { get; protected set; }\n        public bool AngleSnapping { get; protected set; }\n        public short AngleAdjustmentDegrees { get; protected set; }\n        public DebounceTime Debounce { get; protected set; }\n        public int Acceleration { get; protected set; }\n        public int Deceleration { get; protected set; }\n        public bool MotionSync { get; protected set; }\n        public bool ZoneMode { get; protected set; }\n        public int ZoneModeDPI { get; set; } = 1600;\n        public PollingRate ZoneModePollingRate { get; set; } = PollingRate.PR4000Hz;\n\n\n        public AsusMouse(ushort vendorId, ushort productId, string path, bool wireless) : base(vendorId, productId)\n        {\n            this.path = path;\n            this.Wireless = wireless;\n            DpiSettings = new AsusMouseDPI[1];\n            CurrentDPIProfileCount = DPIProfileCount();\n            if (SupportedLightingZones().Length == 0)\n            {\n                LightingSetting = new LightingSetting[1];\n            }\n            else\n            {\n                LightingSetting = new LightingSetting[SupportedLightingZones().Length];\n            }\n            this.reportId = 0x00;\n        }\n\n        public AsusMouse(ushort vendorId, ushort productId, string path, bool wireless, byte reportId) : this(vendorId, productId, path, wireless)\n        {\n            this.reportId = reportId;\n        }\n\n\n        public bool CanExport()\n        {\n            return true;\n        }\n\n        //GMP1 = G-Helper Mouse Profile Version 1 :D\n        private static readonly byte[] MAGIC = { (byte)'G', (byte)'M', (byte)'P', (byte)'1' };\n\n        public byte[] Export()\n        {\n            byte[] data = new byte[0];\n\n            data = data\n                .Concat(MAGIC)                                          // 4 Byte Magic\n                .ToArray();\n\n            foreach (LightingSetting ls in LightingSetting)\n            {\n                data = data.Concat(ls.Export()).ToArray();                     // Append 12 bytes for each Lighting setting\n            }\n\n\n            data = data                                                        // = 6 Bytes\n                .Concat(BitConverter.GetBytes(LowBatteryWarning))       // 4 Bytes\n                .Append((byte)PowerOffSetting)                          // 1 Byte\n                .Append((byte)LiftOffDistance)                          // 1 Byte\n                .ToArray();\n\n            foreach (AsusMouseDPI dpi in DpiSettings)\n            {\n                data = data.Concat(dpi.Export()).ToArray();                     // Append 8 bytes for each DPI Profile\n            }\n\n\n\n            data = data                                                        // = 13 Bytes\n               .Append((byte)PollingRate)                               // 1 Byte\n               .Concat(BitConverter.GetBytes(AngleSnapping))            // 1 Byte\n               .Concat(BitConverter.GetBytes(AngleAdjustmentDegrees))   // 2 Bytes\n               .Append((byte)Debounce)                                  // 1 Byte\n               .Concat(BitConverter.GetBytes(Acceleration))             // 4 Bytes\n               .Concat(BitConverter.GetBytes(Deceleration))             // 4 Bytes\n               .ToArray();\n\n            //Total length: 4 + (LightingSetting.Length * 12) + 6 + (DPIProfileCount() + 8) + 13 Bytes\n\n            return data;\n        }\n\n        public bool Import(byte[] blob)\n        {\n            int expectedLength = 4 + (LightingSetting.Length * 12) + 6 + (DPIProfileCount() * 8) + 13;\n\n            if (blob.Length != expectedLength)\n            {\n                //Wrong lenght. Will not decode properly anyways.\n                Logger.WriteLine(GetDisplayName() + \" Import: Failed to import due to wrong data Lenght. Expected: \" + expectedLength + \" Is: \" + blob.Length);\n                return false;\n            }\n\n            if (blob[0] != MAGIC[0] || blob[1] != MAGIC[1] || blob[2] != MAGIC[2] || blob[3] != MAGIC[3])\n            {\n                //MAGIC does not match. Maybe some other profile or not even a profile at all.\n                Logger.WriteLine(GetDisplayName() + \" Import: Failed to import. Magic Wrong: \" + ByteArrayToString(blob));\n                return false;\n            }\n\n\n            int offset = 4; // skip MAGIC\n\n            for (int i = 0; i < LightingSetting.Length; ++i)\n            {\n                byte[] data = blob.Skip(offset).Take(12).ToArray(); // Read 12 Byte blocks\n                offset += 12;\n\n\n                if (!LightingSetting[i].Import(data))\n                {\n                    Logger.WriteLine(GetDisplayName() + \" Import: Failed to import LightingSetting. Data: \" + ByteArrayToString(data));\n                    return false;\n                }\n            }\n\n\n            LowBatteryWarning = BitConverter.ToInt32(blob, offset);\n            offset += 4;\n\n            PowerOffSetting = (PowerOffSetting)blob[offset++];\n            LiftOffDistance = (LiftOffDistance)blob[offset++];\n\n            for (int i = 0; i < DpiSettings.Length; ++i)\n            {\n                byte[] data = blob.Skip(offset).Take(8).ToArray(); // Read 8 Byte blocks\n                offset += 8;\n\n\n                if (!DpiSettings[i].Import(data))\n                {\n                    Logger.WriteLine(GetDisplayName() + \" Import: Failed to import DPISettings. Data: \" + ByteArrayToString(data));\n                    return false;\n                }\n            }\n\n\n            PollingRate = (PollingRate)blob[offset++];\n\n            AngleSnapping = BitConverter.ToBoolean(blob, offset++);\n            AngleAdjustmentDegrees = BitConverter.ToInt16(blob, offset);\n            offset += 2;\n\n\n            Acceleration = BitConverter.ToInt32(blob, offset);\n            offset += 4;\n            Deceleration = BitConverter.ToInt32(blob, offset);\n            offset += 4;\n\n\n\n            //Apply Settings to the mouse\n            if (HasBattery())\n                SetEnergySettings(LowBatteryWarning, PowerOffSetting);\n\n            SetPollingRate(PollingRate);\n\n            if (HasLiftOffSetting())\n                SetLiftOffDistance(LiftOffDistance);\n\n            if (HasAngleSnapping())\n                SetAngleSnapping(AngleSnapping);\n\n            if (HasAngleTuning())\n                SetAngleAdjustment(AngleAdjustmentDegrees);\n\n            if (HasAcceleration())\n                SetAcceleration(Acceleration);\n\n            if (HasDeceleration())\n                SetDeceleration(Deceleration);\n\n\n\n            if (HasRGB())\n            {\n                for (int i = 0; i < SupportedLightingZones().Length; ++i)\n                {\n                    LightingZone lz = SupportedLightingZones()[i];\n                    LightingSetting ls = LightingSettingForZone(lz);\n\n                    SetLightingSetting(ls, lz);\n                }\n            }\n\n            for (int i = 0; i < DPIProfileCount(); ++i)\n            {\n                AsusMouseDPI dpi = DpiSettings[i];\n\n                SetDPIForProfile(dpi, i + 1);\n            }\n\n            return true;\n        }\n\n        public override bool Equals(object? obj)\n        {\n            if (obj is not AsusMouse item)\n            {\n                return false;\n            }\n\n            return this.VendorID().Equals(item.VendorID())\n                && this.ProductID().Equals(item.ProductID())\n                && this.path.Equals(item.path);\n        }\n\n        public override int GetHashCode()\n        {\n            int hash = 23;\n            hash = hash * 31 + VendorID();\n            hash = hash * 31 + ProductID();\n            hash = hash * 31 + path.GetHashCode();\n            return hash;\n        }\n\n        public void Connect()\n        {\n            SetProvider();\n            HidSharp.DeviceList.Local.Changed += Device_Changed;\n        }\n\n        public override void Dispose()\n        {\n            Logger.WriteLine(GetDisplayName() + \": Disposing\");\n            HidSharp.DeviceList.Local.Changed -= Device_Changed;\n            base.Dispose();\n        }\n\n        private void Device_Changed(object? sender, HidSharp.DeviceListChangedEventArgs e)\n        {\n            //Use this to validate whether the device is still connected.\n            //If not, this will also initiate the disconnect and cleanup sequence.\n            CheckConnection();\n        }\n\n        //Override this for non battery devices to check whether the connection is still there\n        //This function should automatically disconnect the device in GHelper if the device is no longer there or the pipe is broken.\n        public virtual void CheckConnection()\n        {\n            ReadBattery();\n        }\n\n        public bool IsDeviceConnected()\n        {\n            try\n            {\n                return HidSharp.DeviceList.Local.GetHidDevices(VendorID(), ProductID())\n                    .FirstOrDefault(x => x.DevicePath.Contains(path)) != null;\n            }\n            catch\n            {\n                return false;\n            }\n        }\n\n        public virtual int USBTimeout()\n        {\n            return 300;\n        }\n\n        public virtual int USBPacketSize()\n        {\n            return 65;\n        }\n\n        public override void SetProvider()\n        {\n            _usbProvider = new WindowsUsbProvider(_vendorId, _productId, path, USBTimeout());\n        }\n\n        protected virtual void OnDisconnect()\n        {\n            Logger.WriteLine(GetDisplayName() + \": OnDisconnect()\");\n            if (Disconnect is not null)\n            {\n                Disconnect(this, EventArgs.Empty);\n            }\n        }\n\n        protected static bool IsPacketLoggerEnabled()\n        {\n#if DEBUG\n            return true;\n#else\n\n            return AppConfig.Get(\"usb_packet_logger\") == 1 || PACKET_LOGGER_ALWAYS_ON;\n#endif\n        }\n\n        protected virtual bool IsMouseError(byte[] packet)\n        {\n            return packet[1] == 0xFF && packet[2] == 0xAA;\n        }\n\n        protected virtual long MeasuredIO(Action<byte[]> ioFunc, byte[] param)\n        {\n            var watch = System.Diagnostics.Stopwatch.StartNew();\n\n            ioFunc(param);\n\n            watch.Stop();\n            return watch.ElapsedMilliseconds;\n        }\n\n        [MethodImpl(MethodImplOptions.Synchronized)]\n        protected virtual byte[]? WriteForResponse(byte[] packet)\n        {\n            Array.Resize(ref packet, USBPacketSize());\n\n\n            byte[] response = new byte[USBPacketSize()];\n            response[0] = reportId;\n\n            int retries = 3;\n\n            while (retries > 0)\n            {\n                response = new byte[USBPacketSize()];\n\n                try\n                {\n                    if (IsPacketLoggerEnabled())\n                        Logger.WriteLine(GetDisplayName() + \": Sending packet: \" + ByteArrayToString(packet)\n                            + \" Try \" + (retries - 2) + \" of 3\");\n\n                    long time = MeasuredIO(Write, packet);\n                    if (IsPacketLoggerEnabled()) Logger.WriteLine(GetDisplayName() + \": Write took \" + time + \"ms\");\n\n                    time = MeasuredIO(Read, response);\n                    if (IsPacketLoggerEnabled()) Logger.WriteLine(GetDisplayName() + \": Read took \" + time + \"ms\");\n\n\n                    if (IsMouseError(response))\n                    {\n                        if (IsPacketLoggerEnabled())\n                            Logger.WriteLine(GetDisplayName() + \": Read packet: \" + ByteArrayToString(response));\n\n                        Logger.WriteLine(GetDisplayName() + \": Mouse returned error (FF AA). Packet probably not supported by mouse firmware.\");\n                        //Error. Mouse could not understand or process the sent packet\n                        return response;\n                    }\n\n                    if (response[1] == 0 && response[2] == 0 && response[3] == 0)\n                    {\n                        if (IsPacketLoggerEnabled())\n                            Logger.WriteLine(GetDisplayName() + \": Read packet: \" + ByteArrayToString(response));\n                        Logger.WriteLine(GetDisplayName() + \": Received empty packet. Stopping here.\");\n                        //Empty packet\n                        return null;\n                    }\n\n                    //Not the response we were looking for, continue reading\n                    while (response[0] != packet[0] || response[1] != packet[1] || response[2] != packet[2])\n                    {\n                        if (IsPacketLoggerEnabled())\n                            Logger.WriteLine(GetDisplayName() + \": Read wrong packet left in buffer: \" + ByteArrayToString(response) + \". Retrying...\");\n                        //Read again\n                        time = MeasuredIO(Read, response);\n                        if (IsPacketLoggerEnabled()) Logger.WriteLine(GetDisplayName() + \": Read took \" + time + \"ms\");\n                    }\n\n                    if (IsPacketLoggerEnabled())\n                        Logger.WriteLine(GetDisplayName() + \": Read packet: \" + ByteArrayToString(response));\n\n\n                    return response;\n\n                }\n                catch (IOException e)\n                {\n                    Logger.WriteLine(GetDisplayName() + \": Failed to read packet \" + e.Message);\n                    OnDisconnect();\n                    return null;\n                }\n                catch (TimeoutException e)\n                {\n                    Logger.WriteLine(GetDisplayName() + \": Timeout reading packet \" + e.Message + \" Trying again.\");\n                    retries--;\n                    continue;\n                }\n                catch (ObjectDisposedException)\n                {\n                    Logger.WriteLine(GetDisplayName() + \": Channel closed \");\n                    OnDisconnect();\n                    return null;\n                }\n            }\n            return null;\n        }\n        public abstract string GetDisplayName();\n\n        public PeripheralType DeviceType()\n        {\n            return PeripheralType.Mouse;\n        }\n\n        public virtual void SynchronizeDevice()\n        {\n            DpiSettings = new AsusMouseDPI[DPIProfileCount()];\n            ReadBattery();\n            if (HasBattery() && Battery <= 0 && Charging == false)\n            {\n                //Likely only the dongle connected and the mouse is either sleeping or turned off.\n                //The mouse will not respond with proper data, but empty responses at this point\n                SetDeviceReady(false);\n                return;\n            }\n            SetDeviceReady(true);\n\n            ReadProfile();\n            ReadDPI();\n            ReadPollingRate();\n            ReadLiftOffDistance();\n            ReadDebounce();\n            ReadAcceleration();\n            ReadLightingSetting();\n            ReadMotionSync();\n            ReadZoneMode();\n        }\n\n        // ------------------------------------------------------------------------------\n        // Battery\n        // ------------------------------------------------------------------------------\n\n        public virtual bool HasBattery()\n        {\n            return true;\n        }\n\n        public virtual bool HasAutoPowerOff()\n        {\n            return false;\n        }\n\n        public virtual int LowBatteryWarningStep()\n        {\n            return 10;\n        }\n\n        public virtual int LowBatteryWarningMax()\n        {\n            return 50;\n        }\n\n        public virtual bool HasLowBatteryWarning()\n        {\n            return false;\n        }\n\n        protected virtual byte[] GetBatteryReportPacket()\n        {\n            return new byte[] { reportId, 0x12, 0x07 };\n        }\n\n        protected virtual int ParseBattery(byte[] packet)\n        {\n            if (packet[1] == 0x12 && packet[2] == 0x07)\n            {\n                return packet[5];\n            }\n\n            return -1;\n        }\n        protected virtual bool ParseChargingState(byte[] packet)\n        {\n            if (packet[1] == 0x12 && packet[2] == 0x07)\n            {\n                return packet[10] > 0;\n            }\n\n            return false;\n        }\n\n        protected virtual PowerOffSetting ParsePowerOffSetting(byte[] packet)\n        {\n            if (packet[1] == 0x12 && packet[2] == 0x07)\n            {\n                return (PowerOffSetting)packet[6];\n            }\n\n            return PowerOffSetting.Never;\n        }\n        protected virtual int ParseLowBatteryWarning(byte[] packet)\n        {\n            if (packet[1] == 0x12 && packet[2] == 0x07)\n            {\n                return packet[7];\n            }\n\n            return 0;\n        }\n        protected virtual byte[] GetUpdateEnergySettingsPacket(int lowBatteryWarning, PowerOffSetting powerOff)\n        {\n            return new byte[] { reportId, 0x51, 0x37, 0x00, 0x00, (byte)powerOff, 0x00, (byte)lowBatteryWarning };\n        }\n\n        public void SetEnergySettings(int lowBatteryWarning, PowerOffSetting powerOff)\n        {\n            if (!HasAutoPowerOff() && !HasLowBatteryWarning())\n            {\n                return;\n            }\n\n            WriteForResponse(GetUpdateEnergySettingsPacket(lowBatteryWarning, powerOff));\n            FlushSettings();\n\n            Logger.WriteLine(GetDisplayName() + \": Got Auto Power Off: \" + powerOff + \" - Low Battery Warnning at: \" + lowBatteryWarning + \"%\");\n            this.PowerOffSetting = powerOff;\n            this.LowBatteryWarning = lowBatteryWarning;\n        }\n\n        public void ReadBattery()\n        {\n            if (!HasBattery() && !HasAutoPowerOff())\n            {\n                return;\n            }\n\n            byte[]? response = WriteForResponse(GetBatteryReportPacket());\n            if (response is null) return;\n\n            if (HasBattery())\n            {\n                Battery = ParseBattery(response);\n                Charging = ParseChargingState(response);\n\n                //If the device goes to standby it will not report battery state anymore.\n                SetDeviceReady(Battery > 0);\n\n                if (!IsDeviceReady)\n                {\n                    Logger.WriteLine(GetDisplayName() + \": Device gone\");\n                    return;\n                }\n\n                Logger.WriteLine(GetDisplayName() + \": Got Battery Percentage \" + Battery + \"% - Charging:\" + Charging);\n\n                if (BatteryUpdated is not null)\n                {\n                    BatteryUpdated(this, EventArgs.Empty);\n                }\n            }\n\n            if (HasAutoPowerOff())\n            {\n                PowerOffSetting = ParsePowerOffSetting(response);\n            }\n\n            if (HasLowBatteryWarning())\n            {\n                LowBatteryWarning = ParseLowBatteryWarning(response);\n            }\n\n            if (HasLowBatteryWarning() || HasAutoPowerOff())\n            {\n                string pos = HasAutoPowerOff() ? PowerOffSetting.ToString() : \"Not Supported\";\n                string lbw = HasLowBatteryWarning() ? LowBatteryWarning.ToString() : \"Not Supported\";\n                Logger.WriteLine(GetDisplayName() + \": Got Auto Power Off: \" + pos + \" - Low Battery Warnning at: \" + lbw + \"%\");\n            }\n\n        }\n\n        // ------------------------------------------------------------------------------\n        // Profiles\n        // ------------------------------------------------------------------------------\n        public abstract int ProfileCount();\n\n        public virtual bool HasProfiles()\n        {\n            return true;\n        }\n\n        protected virtual int ParseProfile(byte[] packet)\n        {\n            if (packet[1] == 0x12 && packet[2] == 0x00 && packet[3] == 0x00)\n            {\n                return packet[11];\n            }\n            Logger.WriteLine(GetDisplayName() + \": Failed to decode active profile\");\n            return 0;\n        }\n\n        protected virtual int ParseDPIProfile(byte[] packet)\n        {\n            if (packet[1] == 0x12 && packet[2] == 0x00 && packet[3] == 0x00)\n            {\n                return packet[12];\n            }\n            Logger.WriteLine(GetDisplayName() + \": Failed to decode active profile\");\n            return 1;\n        }\n\n        protected virtual byte[] GetReadProfilePacket()\n        {\n            return new byte[] { reportId, 0x12, 0x00 };\n        }\n\n        protected virtual byte[] GetUpdateProfilePacket(int profile)\n        {\n            return new byte[] { reportId, 0x50, 0x02, (byte)profile };\n        }\n\n        public void ReadProfile()\n        {\n            if (!HasProfiles())\n            {\n                return;\n            }\n\n            byte[]? response = WriteForResponse(GetReadProfilePacket());\n            if (response is null) return;\n\n            Profile = ParseProfile(response);\n            if (DPIProfileCount() > 1)\n            {\n                DpiProfile = ParseDPIProfile(response);\n                if (CanChangeDPICount())\n                {\n                    int count = response[19];\n                    if (count >= 2 && count <= 4)\n                    {\n                         CurrentDPIProfileCount = count;\n                    }\n                }\n            }\n            Logger.WriteLine(GetDisplayName() + \": Active Profile \" + (Profile + 1)\n                + ((DPIProfileCount() > 1 ? \", Active DPI Profile: \" + DpiProfile : \"\"))\n                + ((CanChangeDPICount() ? \", DPI Count: \" + CurrentDPIProfileCount : \"\")));\n        }\n\n        public void SetProfile(int profile)\n        {\n            if (!HasProfiles())\n            {\n                return;\n            }\n\n            if (profile > ProfileCount() || profile < 0)\n            {\n                Logger.WriteLine(GetDisplayName() + \": Profile:\" + profile + \" is invalid.\");\n                return;\n            }\n\n            WriteForResponse(GetUpdateProfilePacket(profile));\n            FlushSettings();\n\n            Logger.WriteLine(GetDisplayName() + \": Profile set to \" + profile);\n            this.Profile = profile;\n        }\n\n        // ------------------------------------------------------------------------------\n        // Polling Rate and Angle Snapping\n        // ------------------------------------------------------------------------------\n\n\n        public virtual bool HasAngleSnapping()\n        {\n            return false;\n        }\n        public virtual bool HasAngleTuning()\n        {\n            return false;\n        }\n\n        public virtual int AngleTuningStep()\n        {\n            return 1;\n        }\n\n        public virtual int AngleTuningMin()\n        {\n            return -20;\n        }\n\n        public virtual int AngleTuningMax()\n        {\n            return 20;\n        }\n\n        public virtual string PollingRateDisplayString(PollingRate pollingRate)\n        {\n            return POLLING_RATES[(int)pollingRate];\n        }\n\n        public virtual int PollingRateCount()\n        {\n            return SupportedPollingrates().Length;\n        }\n\n        public virtual int PollingRateIndex(PollingRate pollingRate)\n        {\n            for (int i = 0; i < PollingRateCount(); ++i)\n            {\n                if (SupportedPollingrates()[i] == pollingRate)\n                {\n                    return i;\n                }\n            }\n            return -1;\n        }\n\n\n        public virtual bool IsPollingRateSupported(PollingRate pollingRate)\n        {\n            return SupportedPollingrates().Contains(pollingRate);\n        }\n\n        public abstract PollingRate[] SupportedPollingrates();\n\n        public virtual bool CanSetPollingRate()\n        {\n            return true;\n        }\n\n        protected virtual byte[] GetReadPollingRatePacket()\n        {\n            return new byte[] { reportId, 0x12, 0x04, 0x00 };\n        }\n\n        protected virtual byte[] GetUpdatePollingRatePacket(PollingRate pollingRate)\n        {\n            return new byte[] { reportId, 0x51, 0x31, 0x04, 0x00, (byte)pollingRate };\n        }\n        protected virtual byte[] GetUpdateAngleSnappingPacket(bool angleSnapping)\n        {\n            return new byte[] { reportId, 0x51, 0x31, 0x06, 0x00, (byte)(angleSnapping ? 0x01 : 0x00) };\n        }\n        protected virtual byte[] GetUpdateAngleAdjustmentPacket(short angleAdjustment)\n        {\n            return new byte[] { reportId, 0x51, 0x31, 0x0B, 0x00, (byte)(angleAdjustment & 0xFF), (byte)((angleAdjustment >> 8) & 0xFF) };\n        }\n\n        protected virtual PollingRate ParsePollingRate(byte[] packet)\n        {\n            if (packet[1] == 0x12 && packet[2] == 0x04 && packet[3] == 0x00)\n            {\n                byte raw = packet[13];\n                byte highNibble = (byte)(raw >> 4);\n\n                if (highNibble > 0) \n                    return (PollingRate)highNibble; \n                else \n                    return (PollingRate)(raw & 0x0F);\n            }\n            return PollingRate.PR125Hz;\n        }\n\n\n        protected virtual bool ParseAngleSnapping(byte[] packet)\n        {\n            if (packet[1] == 0x12 && packet[2] == 0x04 && packet[3] == 0x00)\n            {\n                return packet[17] == 0x01;\n            }\n\n            return false;\n        }\n\n        protected virtual short ParseAngleAdjustment(byte[] packet)\n        {\n            if (packet[1] == 0x12 && packet[2] == 0x04 && packet[3] == 0x00)\n            {\n                return (short)(packet[20] << 8 | packet[19]);\n            }\n\n            return 0;\n        }\n\n        public void ReadPollingRate()\n        {\n            if (!CanSetPollingRate())\n            {\n                return;\n            }\n\n            byte[]? response = WriteForResponse(GetReadPollingRatePacket());\n            if (response is null) return;\n\n            PollingRate = ParsePollingRate(response);\n            Logger.WriteLine(GetDisplayName() + \": Pollingrate: \" + PollingRateDisplayString(PollingRate) + \" (\" + PollingRate + \")\");\n\n            if (HasAngleSnapping())\n            {\n                AngleSnapping = ParseAngleSnapping(response);\n                if (HasAngleTuning())\n                    AngleAdjustmentDegrees = ParseAngleAdjustment(response);\n\n                Logger.WriteLine(GetDisplayName() + \": Angle Snapping enabled: \" + AngleSnapping + \", Angle Adjustment: \" + AngleAdjustmentDegrees + \"°\");\n            }\n        }\n\n        public void SetPollingRate(PollingRate pollingRate)\n        {\n            if (!CanSetPollingRate())\n            {\n                return;\n            }\n\n            if (!IsPollingRateSupported(pollingRate))\n            {\n                Logger.WriteLine(GetDisplayName() + \": Pollingrate:\" + pollingRate + \" is not supported by this mouse.\");\n                return;\n            }\n\n            WriteForResponse(GetUpdatePollingRatePacket(pollingRate));\n            FlushSettings();\n\n            Logger.WriteLine(GetDisplayName() + \": Pollingrate set to \" + PollingRateDisplayString(pollingRate));\n            this.PollingRate = pollingRate;\n        }\n\n        public void SetAngleSnapping(bool angleSnapping)\n        {\n            if (!HasAngleSnapping())\n            {\n                return;\n            }\n\n            WriteForResponse(GetUpdateAngleSnappingPacket(angleSnapping));\n            FlushSettings();\n\n            Logger.WriteLine(GetDisplayName() + \": Angle Snapping set to \" + angleSnapping);\n            this.AngleSnapping = angleSnapping;\n        }\n\n        public void SetAngleAdjustment(short angleAdjustment)\n        {\n            if (!HasAngleTuning())\n            {\n                return;\n            }\n\n            if (angleAdjustment < AngleTuningMin() || angleAdjustment > AngleTuningMax())\n            {\n                Logger.WriteLine(GetDisplayName() + \": Angle Adjustment:\" + angleAdjustment\n                    + \" is outside of range [\" + AngleTuningMin() + \"; \" + AngleTuningMax() + \"].\");\n                return;\n            }\n\n            WriteForResponse(GetUpdateAngleAdjustmentPacket(angleAdjustment));\n            FlushSettings();\n\n            Logger.WriteLine(GetDisplayName() + \": Angle Adjustment set to \" + angleAdjustment);\n            this.AngleAdjustmentDegrees = angleAdjustment;\n        }\n\n        // ------------------------------------------------------------------------------\n        // Acceleration/Deceleration\n        // ------------------------------------------------------------------------------\n        public virtual bool HasAcceleration()\n        {\n            return false;\n        }\n\n        public virtual bool HasDeceleration()\n        {\n            return false;\n        }\n\n        public virtual int MaxAcceleration()\n        {\n            return 0;\n        }\n        public virtual int MaxDeceleration()\n        {\n            return 0;\n        }\n\n        protected virtual byte[] GetChangeAccelerationPacket(int acceleration)\n        {\n            return new byte[] { reportId, 0x51, 0x31, 0x07, 0x00, (byte)acceleration };\n        }\n\n        protected virtual byte[] GetChangeDecelerationPacket(int deceleration)\n        {\n            return new byte[] { reportId, 0x51, 0x31, 0x08, 0x00, (byte)deceleration };\n        }\n\n        public virtual void SetAcceleration(int acceleration)\n        {\n            if (!HasAcceleration())\n            {\n                return;\n            }\n\n            if (acceleration > MaxAcceleration() || acceleration < 0)\n            {\n                Logger.WriteLine(GetDisplayName() + \": Acceleration \" + acceleration + \" is invalid.\");\n                return;\n            }\n\n            WriteForResponse(GetChangeAccelerationPacket(acceleration));\n            FlushSettings();\n\n            Logger.WriteLine(GetDisplayName() + \": Acceleration set to \" + acceleration);\n            this.Acceleration = acceleration;\n        }\n\n        public virtual void SetDeceleration(int deceleration)\n        {\n            if (!HasDeceleration())\n            {\n                return;\n            }\n\n            if (deceleration > MaxDeceleration() || deceleration < 0)\n            {\n                Logger.WriteLine(GetDisplayName() + \": Deceleration \" + deceleration + \" is invalid.\");\n                return;\n            }\n\n            WriteForResponse(GetChangeDecelerationPacket(deceleration));\n            FlushSettings();\n\n            Logger.WriteLine(GetDisplayName() + \": Deceleration set to \" + deceleration);\n            this.Deceleration = deceleration;\n        }\n\n        protected virtual byte[] GetReadAccelerationPacket()\n        {\n            return new byte[] { reportId, 0x12, 0x04, 0x01 };\n        }\n\n        protected virtual int ParseAcceleration(byte[] packet)\n        {\n            if (packet[1] != 0x12 || packet[2] != 0x04 || packet[3] != 0x01)\n            {\n                return 0;\n            }\n\n            return packet[5];\n        }\n\n        protected virtual int ParseDeceleration(byte[] packet)\n        {\n            if (packet[1] != 0x12 || packet[2] != 0x04 || packet[3] != 0x01)\n            {\n                return 0;\n            }\n\n            return packet[7];\n        }\n\n        public virtual void ReadAcceleration()\n        {\n            if (!HasAcceleration() && !HasDeceleration())\n            {\n                return;\n            }\n\n            byte[]? response = WriteForResponse(GetReadAccelerationPacket());\n            if (response is null) return;\n\n            if (HasAcceleration())\n            {\n                Acceleration = ParseAcceleration(response);\n                Logger.WriteLine(GetDisplayName() + \": Read Acceleration: \" + Acceleration);\n            }\n\n            if (HasDeceleration())\n            {\n                Deceleration = ParseDeceleration(response);\n                Logger.WriteLine(GetDisplayName() + \": Read Deceleration: \" + Deceleration);\n            }\n        }\n\n        // ------------------------------------------------------------------------------\n        // DPI\n        // ------------------------------------------------------------------------------\n        public abstract int DPIProfileCount();\n        public virtual bool HasDPIColors()\n        {\n            return false;\n        }\n\n        public virtual int DPIIncrements()\n        {\n            return 50;\n        }\n\n        public virtual bool CanChangeDPIProfile()\n        {\n            return DPIProfileCount() > 1;\n        }\n\n        public virtual bool CanChangeDPICount()\n        {\n            return false;\n        }\n\n        public virtual int MaxDPI()\n        {\n            return 2000;\n        }\n        public virtual int MinDPI()\n        {\n            return 100;\n        }\n\n        public virtual bool HasXYDPI()\n        {\n            return false;\n        }\n\n        protected virtual byte[] GetChangeDPIProfilePacket(int profile)\n        {\n            //legacy function kept for TUFM3\n            return new byte[] { reportId, 0x51, 0x31, 0x0A, 0x00, (byte)profile };\n        }\n\n        protected virtual byte[] GetSetDPIProfileCountPacket(int count)\n        {\n            return new byte[] { reportId, 0x51, 0x31, 0x0A, 0x00, (byte)count };\n        }\n\n        protected virtual byte[] GetChangeDPIProfilePacket2(int profile)\n        {\n            return new byte[] { reportId, 0x51, 0x31, 0x09, 0x00, (byte)profile };\n        }\n\n        //profiles start to count at 1\n        public virtual void SetDPIProfile(int profile)\n        {\n            if (!CanChangeDPIProfile())\n            {\n                this.DpiProfile = profile;\n                return;\n            }\n\n            if (profile > CurrentDPIProfileCount || profile < 1)\n            {\n                Logger.WriteLine(GetDisplayName() + \": DPI Profile:\" + profile + \" is invalid.\");\n                return;\n            }\n\n            //The first DPI profile is 1\n            WriteForResponse(GetChangeDPIProfilePacket2(profile));\n            FlushSettings();\n\n            Logger.WriteLine(GetDisplayName() + \": DPI Profile set to \" + profile);\n            this.DpiProfile = profile;\n        }\n\n        protected virtual byte[] GetReadDPIPacket()\n        {\n            if (!HasXYDPI())\n            {\n                return new byte[] { reportId, 0x12, 0x04, 0x00 };\n            }\n\n            return new byte[] { reportId, 0x12, 0x04, 0x02 };\n        }\n\n        protected virtual byte[]? GetUpdateDPIPacket(AsusMouseDPI dpi, int profile)\n        {\n            if (dpi is null)\n            {\n                return null;\n            }\n            if (dpi.DPI > MaxDPI() || dpi.DPI < MinDPI())\n            {\n                return null;\n            }\n            ushort dpiEncoded = (ushort)((dpi.DPI - DPIIncrements()) / DPIIncrements());\n\n            if (HasDPIColors())\n            {\n                return new byte[] { reportId, 0x51, 0x31, (byte)(profile - 1), 0x00, (byte)(dpiEncoded & 0xFF), (byte)((dpiEncoded >> 8) & 0xFF), dpi.Color.R, dpi.Color.G, dpi.Color.B };\n            }\n            else\n            {\n                return new byte[] { reportId, 0x51, 0x31, (byte)(profile - 1), 0x00, (byte)(dpiEncoded & 0xFF), (byte)((dpiEncoded >> 8) & 0xFF) };\n            }\n\n        }\n\n        protected virtual void ParseDPI(byte[] packet)\n        {\n            if (packet[1] != 0x12 || packet[2] != 0x04 || (packet[3] != 0x02 && HasXYDPI()))\n            {\n                return;\n            }\n\n            for (int i = 0; i < DPIProfileCount(); ++i)\n            {\n                if (DpiSettings[i] is null)\n                {\n                    DpiSettings[i] = new AsusMouseDPI();\n                }\n\n                int offset = HasXYDPI() ? (5 + (i * 4)) : (5 + (i * 2));\n\n\n                uint b1 = packet[offset];\n                uint b2 = packet[offset + 1];\n\n                DpiSettings[i].DPI = (uint)((b2 << 8 | b1) * DPIIncrements() + DPIIncrements());\n            }\n        }\n\n        protected virtual byte[] GetReadDPIColorsPacket()\n        {\n            return new byte[] { reportId, 0x12, 0x04, 0x03 };\n        }\n\n        protected virtual void ParseDPIColors(byte[] packet)\n        {\n            if (packet[1] != 0x12 || packet[2] != 0x04 || packet[3] != 0x03)\n            {\n                return;\n            }\n\n            for (int i = 0; i < DPIProfileCount(); ++i)\n            {\n                if (DpiSettings[i] is null)\n                {\n                    DpiSettings[i] = new AsusMouseDPI();\n                }\n\n                int offset = 5 + (i * 3);\n\n                DpiSettings[i].Color = Color.FromArgb(packet[offset], packet[offset + 1], packet[offset + 2]);\n            }\n        }\n\n        public void ReadDPI()\n        {\n            byte[]? response = WriteForResponse(GetReadDPIPacket());\n            if (response is null) return;\n            ParseDPI(response);\n\n            if (HasDPIColors())\n            {\n                response = WriteForResponse(GetReadDPIColorsPacket());\n                if (response is null) return;\n                ParseDPIColors(response);\n            }\n\n            for (int i = 0; i < DPIProfileCount(); ++i)\n            {\n                Logger.WriteLine(GetDisplayName() + \": Read DPI Setting \" + (i + 1) + \": \" + DpiSettings[i].ToString());\n            }\n\n        }\n\n        public void SetDPIForProfile(AsusMouseDPI dpi, int profile)\n        {\n            if (profile > DPIProfileCount() || profile < 1)\n            {\n                Logger.WriteLine(GetDisplayName() + \": DPI Profile:\" + profile + \" is invalid.\");\n                return;\n            }\n\n            byte[]? packet = GetUpdateDPIPacket(dpi, profile);\n            if (packet == null)\n            {\n                Logger.WriteLine(GetDisplayName() + \": DPI setting for profile \" + profile + \" does not exist or is invalid.\");\n                return;\n            }\n            WriteForResponse(packet);\n            FlushSettings();\n\n            Logger.WriteLine(GetDisplayName() + \": DPI for profile \" + profile + \" set to \" + DpiSettings[profile - 1].DPI);\n            //this.DpiProfile = profile;\n            this.DpiSettings[profile - 1] = dpi;\n        }\n\n        public void SetDPIProfileCount(int count)\n        {\n            if (count < 2 || count > 4) return;\n\n            WriteForResponse(GetSetDPIProfileCountPacket(count));\n\n            // Resync settings for all profiles\n            for (int i = 0; i < count; i++)\n            {\n                if (DpiSettings[i] != null)\n                {\n                    WriteForResponse(GetUpdateDPIPacket(DpiSettings[i], i + 1));\n                }\n            }\n\n            FlushSettings();\n\n            CurrentDPIProfileCount = count;\n            Logger.WriteLine(GetDisplayName() + \": DPI Profile Count set to \" + count);\n        }\n\n        public void AddDPIProfile()\n        {\n            if (CurrentDPIProfileCount >= 4) return;\n\n            int newIndex = CurrentDPIProfileCount;\n\n            // Set defaults for new slot\n            if (DpiSettings[newIndex] == null) DpiSettings[newIndex] = new AsusMouseDPI();\n\n            if (newIndex == 2) // Slot 3\n            {\n                DpiSettings[newIndex].DPI = 1600;\n                DpiSettings[newIndex].Color = Color.Blue;\n            }\n            else if (newIndex == 3) // Slot 4\n            {\n                DpiSettings[newIndex].DPI = 3200;\n                DpiSettings[newIndex].Color = Color.Green;\n            }\n\n            SetDPIProfileCount(CurrentDPIProfileCount + 1);\n        }\n\n        public void DeleteDPIProfile(int index)\n        {\n            if (CurrentDPIProfileCount <= 2) return;\n            if (index < 0 || index >= CurrentDPIProfileCount) return;\n\n            // Shift Logic\n            for (int i = index; i < CurrentDPIProfileCount - 1; i++)\n            {\n                // Create new object to avoid reference copy\n                if (DpiSettings[i+1] != null)\n                {\n                    DpiSettings[i] = new AsusMouseDPI \n                    { \n                        DPI = DpiSettings[i+1].DPI, \n                        Color = DpiSettings[i+1].Color \n                    };\n                }\n            }\n            \n            // Cleanup last element\n            DpiSettings[CurrentDPIProfileCount - 1] = null;\n\n            SetDPIProfileCount(CurrentDPIProfileCount - 1);\n\n            if (DpiProfile > CurrentDPIProfileCount) DpiProfile = CurrentDPIProfileCount;\n\n        }\n\n\n\n        // ------------------------------------------------------------------------------\n        // Lift-off Distance\n        // ------------------------------------------------------------------------------\n\n        public virtual bool HasLiftOffSetting()\n        {\n            return false;\n        }\n\n        protected virtual byte[] GetReadLiftOffDistancePacket()\n        {\n            return new byte[] { reportId, 0x12, 0x06 };\n        }\n\n        //This also resets the \"calibration\" to default. There is no seperate command to only set the lift off distance\n        protected virtual byte[] GetUpdateLiftOffDistancePacket(LiftOffDistance liftOffDistance)\n        {\n            return new byte[] { reportId, 0x51, 0x35, 0xFF, 0x00, 0xFF, ((byte)liftOffDistance) };\n        }\n\n        protected virtual LiftOffDistance ParseLiftOffDistance(byte[] packet)\n        {\n            if (packet[1] != 0x12 || packet[2] != 0x06)\n            {\n                return LiftOffDistance.Low;\n            }\n\n            return (LiftOffDistance)packet[8];\n        }\n\n        public void ReadLiftOffDistance()\n        {\n            if (!HasLiftOffSetting())\n            {\n                return;\n            }\n            byte[]? response = WriteForResponse(GetReadLiftOffDistancePacket());\n            if (response is null) return;\n\n            LiftOffDistance = ParseLiftOffDistance(response);\n\n\n            Logger.WriteLine(GetDisplayName() + \": Read Lift Off Setting: \" + LiftOffDistance);\n        }\n\n        public void SetLiftOffDistance(LiftOffDistance liftOffDistance)\n        {\n            if (!HasLiftOffSetting())\n            {\n                return;\n            }\n\n            WriteForResponse(GetUpdateLiftOffDistancePacket(liftOffDistance));\n            FlushSettings();\n\n            Logger.WriteLine(GetDisplayName() + \": Set Liftoff Distance to \" + liftOffDistance);\n            this.LiftOffDistance = liftOffDistance;\n        }\n\n        // ------------------------------------------------------------------------------\n        // Debounce\n        // ------------------------------------------------------------------------------\n\n        public virtual bool HasDebounceSetting()\n        {\n            return false;\n        }\n\n        public virtual int DebounceTimeInMS(DebounceTime dbt)\n        {\n            switch (dbt)\n            {\n                case DebounceTime.MS8: return 8;\n                case DebounceTime.MS12: return 12;\n                case DebounceTime.MS16: return 16;\n                case DebounceTime.MS20: return 20;\n                case DebounceTime.MS24: return 24;\n                case DebounceTime.MS28: return 28;\n                case DebounceTime.MS32: return 32;\n\n\n                default: return 0;\n            }\n        }\n\n        public virtual DebounceTime MinDebounce()\n        {\n            return DebounceTime.MS12;\n        }\n        public virtual DebounceTime MaxDebounce()\n        {\n            return DebounceTime.MS32;\n        }\n\n        protected virtual byte[] GetReadDebouncePacket()\n        {\n            return new byte[] { reportId, 0x12, 0x04, 0x00 };\n        }\n\n\n        protected virtual byte[] GetUpdateDebouncePacket(DebounceTime debounce)\n        {\n            return new byte[] { reportId, 0x51, 0x31, 0x05, 0x00, ((byte)debounce) };\n        }\n\n        protected virtual DebounceTime ParseDebounce(byte[] packet)\n        {\n            if (packet[1] != 0x12 || packet[2] != 0x04 || packet[3] != 0x00)\n            {\n                return MinDebounce();\n            }\n\n            if (packet[15] < (int)MinDebounce())\n            {\n                return MinDebounce();\n            }\n\n            if (packet[15] > (int)MaxDebounce())\n            {\n                return MaxDebounce();\n            }\n\n            return (DebounceTime)packet[15];\n        }\n\n        public void ReadDebounce()\n        {\n            if (!HasDebounceSetting())\n            {\n                return;\n            }\n            byte[]? response = WriteForResponse(GetReadDebouncePacket());\n            if (response is null) return;\n\n            Debounce = ParseDebounce(response);\n\n\n            Logger.WriteLine(GetDisplayName() + \": Read Debouce Setting: \" + Debounce);\n        }\n\n        public void SetDebounce(DebounceTime debounce)\n        {\n            if (!HasDebounceSetting())\n            {\n                return;\n            }\n\n            WriteForResponse(GetUpdateDebouncePacket(debounce));\n            FlushSettings();\n\n            Logger.WriteLine(GetDisplayName() + \": Set Debouce to \" + debounce);\n            this.Debounce = debounce;\n        }\n\n        // ------------------------------------------------------------------------------\n        // Motion Sync\n        // ------------------------------------------------------------------------------\n\n        public virtual bool HasMotionSync()\n        {\n            return false;\n        }\n\n        protected virtual byte[] GetUpdateMotionSyncPacket(bool enabled)\n        {\n            return new byte[] { reportId, 0x51, 0x31, 0x12, 0x00, (byte)(enabled ? 0x01 : 0x00) };\n        }\n\n        public void SetMotionSync(bool enabled)\n        {\n            if (!HasMotionSync())\n            {\n                return;\n            }\n\n            // Motion Sync cannot be enabled at 8000Hz polling rate\n            if (PollingRate == PollingRate.PR8000Hz && enabled)\n            {\n                Logger.WriteLine(GetDisplayName() + \": Motion Sync cannot be enabled at 8000Hz polling rate.\");\n                return;\n            }\n\n            WriteForResponse(GetUpdateMotionSyncPacket(enabled));\n            FlushSettings();\n\n            Logger.WriteLine(GetDisplayName() + \": Motion Sync set to \" + enabled);\n            this.MotionSync = enabled;\n        }\n\n        protected virtual byte[] GetReadMotionSyncPacket()\n        {\n            return new byte[] { reportId, 0x12, 0x04, 0x04 };\n        }\n\n        protected virtual bool ParseMotionSync(byte[] packet)\n        {\n            if (packet[1] == 0x12 && packet[2] == 0x04 && packet[3] == 0x04)\n            {\n                return packet[5] == 0x01;\n            }\n\n            return false;\n        }\n\n        public void ReadMotionSync()\n        {\n            if (!HasMotionSync())\n            {\n                return;\n            }\n\n            byte[]? response = WriteForResponse(GetReadMotionSyncPacket());\n            if (response is null) return;\n\n            MotionSync = ParseMotionSync(response);\n            Logger.WriteLine(GetDisplayName() + \": Motion Sync: \" + MotionSync);\n        }\n\n        // ------------------------------------------------------------------------------\n        // Zone Mode\n        // ------------------------------------------------------------------------------\n\n        public virtual bool HasZoneMode()\n        {\n            return false;\n        }\n\n        protected virtual byte[] GetUpdateZoneModePacket(bool enabled)\n        {\n            // DPI formula: ((DPI - 50) / 50) - using 2 bytes\n            int dpiVal = (ZoneModeDPI - 50) / 50;\n            byte dpiLow = (byte)(dpiVal & 0xFF);\n            byte dpiHigh = (byte)((dpiVal >> 8) & 0xFF);\n\n            return new byte[] { reportId, 0x51, 0x44, 0x00, 0x00,\n                (byte)(enabled ? 0x01 : 0x00),\n                (byte)ZoneModePollingRate,\n                dpiLow, dpiHigh };\n        }\n\n        public void SetZoneMode(bool enabled)\n        {\n            if (!HasZoneMode())\n            {\n                return;\n            }\n\n            WriteForResponse(GetUpdateZoneModePacket(enabled));\n            FlushSettings();\n\n            Logger.WriteLine(GetDisplayName() + \": Zone Mode set to \" + enabled);\n            this.ZoneMode = enabled;\n        }\n\n        public void UpdateZoneModeDPI(int dpi)\n        {\n            if (!HasZoneMode() || !ZoneMode)\n            {\n                return;\n            }\n\n            ZoneModeDPI = dpi;\n            WriteForResponse(GetUpdateZoneModePacket(true));\n            FlushSettings();\n\n            Logger.WriteLine(GetDisplayName() + \": Zone Mode DPI set to \" + dpi);\n        }\n\n        public void UpdateZoneModePollingRate(PollingRate pollingRate)\n        {\n            if (!HasZoneMode() || !ZoneMode)\n            {\n                return;\n            }\n\n            ZoneModePollingRate = pollingRate;\n            WriteForResponse(GetUpdateZoneModePacket(true));\n            FlushSettings();\n\n            Logger.WriteLine(GetDisplayName() + \": Zone Mode Polling Rate set to \" + pollingRate);\n        }\n\n        protected virtual byte[] GetReadZoneModePacket()\n        {\n            return new byte[] { reportId, 0x12, 0x14 };\n        }\n\n        protected virtual void ParseZoneMode(byte[] packet)\n        {\n            if (packet[1] == 0x12 && packet[2] == 0x14)\n            {\n                ZoneMode = packet[5] == 0x01;\n                ZoneModePollingRate = (PollingRate)packet[6];\n                // DPI formula: (byteL + byteH * 256) * 50 + 50\n                if (packet.Length > 8)\n                {\n                    int dpiVal = packet[7] | (packet[8] << 8);\n                    ZoneModeDPI = dpiVal * 50 + 50;\n                }\n                else\n                {\n                    ZoneModeDPI = packet[7] * 50 + 50;\n                }\n            }\n        }\n\n        public void ReadZoneMode()\n        {\n            if (!HasZoneMode())\n            {\n                return;\n            }\n\n            byte[]? response = WriteForResponse(GetReadZoneModePacket());\n            if (response is null) return;\n\n            ParseZoneMode(response);\n            Logger.WriteLine(GetDisplayName() + \": Zone Mode: \" + ZoneMode + \", DPI: \" + ZoneModeDPI + \", PollingRate: \" + ZoneModePollingRate);\n        }\n\n        // ------------------------------------------------------------------------------\n        // RGB\n        // ------------------------------------------------------------------------------\n\n        public virtual bool HasRGB()\n        {\n            return false;\n        }\n\n        public virtual int MaxBrightness()\n        {\n            return 100;\n        }\n\n        //Override to remap lighting mode IDs.\n        //From OpenRGB code it looks like some mice have different orders of the modes or do not support some modes at all.\n        protected virtual byte IndexForLightingMode(LightingMode lightingMode)\n        {\n            return ((byte)lightingMode);\n        }\n\n        //Also override this for the reverse mapping\n        protected virtual LightingMode LightingModeForIndex(byte lightingMode)\n        {\n            //We do not support other mods. we treat them as off. True off is actually 0xF0.\n            if (lightingMode > 0x06)\n            {\n                return LightingMode.Off;\n            }\n            return ((LightingMode)lightingMode);\n        }\n\n        //And this if not all modes are supported\n        public virtual bool IsLightingModeSupported(LightingMode lightingMode)\n        {\n            return true;\n        }\n\n        public virtual bool SupportsRandomColor(LightingMode lightingMode)\n        {\n            return lightingMode == LightingMode.Comet;\n        }\n\n        public virtual bool SupportsAnimationDirection(LightingMode lightingMode)\n        {\n            return lightingMode == LightingMode.Rainbow\n                || lightingMode == LightingMode.Comet;\n        }\n        public virtual bool SupportsAnimationSpeed(LightingMode lightingMode)\n        {\n            return lightingMode == LightingMode.Rainbow;\n        }\n\n        public virtual bool SupportsColorSetting(LightingMode lightingMode)\n        {\n            return lightingMode == LightingMode.Static\n                 || lightingMode == LightingMode.Breathing\n                 || lightingMode == LightingMode.Comet\n                 || lightingMode == LightingMode.React;\n        }\n\n        public virtual LightingZone[] SupportedLightingZones()\n        {\n            return new LightingZone[] { LightingZone.Logo };\n        }\n\n        public virtual int IndexForZone(LightingZone zone)\n        {\n            LightingZone[] lz = SupportedLightingZones();\n            for (int i = 0; i < lz.Length; ++i)\n            {\n                if (lz[i] == zone)\n                {\n                    return i;\n                }\n            }\n            return 0;\n        }\n\n        public virtual bool IsLightingZoned()\n        {\n            if (LightingSetting.Length < 2)\n            {\n                return false;\n            }\n\n            //Check whether all zones are the same or not\n            for (int i = 1; i < LightingSetting.Length; ++i)\n            {\n                if (LightingSetting[i] is null\n                   || LightingSetting[i - 1] is null\n                   || !LightingSetting[i].Equals(LightingSetting[i - 1]))\n                {\n                    return true;\n                }\n            }\n            return false;\n        }\n\n        public virtual bool IsLightingModeSupportedForZone(LightingMode lm, LightingZone lz)\n        {\n            if (lz == LightingZone.All)\n            {\n                return true;\n            }\n\n            return lm == LightingMode.Static\n                || lm == LightingMode.Breathing\n                || lm == LightingMode.ColorCycle\n                || lm == LightingMode.React;\n        }\n\n        public virtual LightingSetting LightingSettingForZone(LightingZone zone)\n        {\n            if (zone == LightingZone.All)\n            {\n                //First zone is treated as ALL for reading purpose\n                return LightingSetting[0];\n            }\n\n            return LightingSetting[IndexForZone(zone)];\n        }\n\n        protected virtual byte[] GetReadLightingModePacket(LightingZone zone)\n        {\n            int idx = 0;\n\n            if (zone != LightingZone.All)\n            {\n                idx = IndexForZone(zone);\n            }\n\n            return new byte[] { reportId, 0x12, 0x03, (byte)idx };\n        }\n\n        protected virtual byte[] GetUpdateLightingModePacket(LightingSetting lightingSetting, LightingZone zone)\n        {\n            if (lightingSetting.Brightness < 0 || lightingSetting.Brightness > MaxBrightness())\n            {\n                Logger.WriteLine(GetDisplayName() + \": Brightness \" + lightingSetting.Brightness\n                    + \" is out of range [0;\" + MaxBrightness() + \"]. Setting to \" + (MaxBrightness() / 4) + \" .\");\n\n                lightingSetting.Brightness = MaxBrightness() / 4; // set t0 25% of max brightness\n            }\n            if (!IsLightingModeSupported(lightingSetting.LightingMode))\n            {\n                Logger.WriteLine(GetDisplayName() + \": Lighting Mode \" + lightingSetting.LightingMode + \" is not supported. Setting to Color Cycle ;)\");\n                lightingSetting.LightingMode = LightingMode.ColorCycle;\n            }\n\n            return new byte[] { reportId, 0x51, 0x28, (byte)zone, 0x00,\n                IndexForLightingMode(lightingSetting.LightingMode),\n                (byte)lightingSetting.Brightness,\n                lightingSetting.RGBColor.R, lightingSetting.RGBColor.G, lightingSetting.RGBColor.B,\n                (byte)(SupportsAnimationDirection(lightingSetting.LightingMode) ? lightingSetting.AnimationDirection : 0x00),\n                (byte)((lightingSetting.RandomColor && SupportsRandomColor(lightingSetting.LightingMode)) ? 0x01: 0x00),\n                (byte)(SupportsAnimationSpeed(lightingSetting.LightingMode) ? lightingSetting.AnimationSpeed : 0x00)\n            };\n        }\n\n        protected virtual LightingSetting? ParseLightingSetting(byte[] packet)\n        {\n            if (packet[1] != 0x12 || packet[2] != 0x03)\n            {\n                return null;\n            }\n\n            LightingSetting setting = new LightingSetting();\n\n            setting.LightingMode = LightingModeForIndex(packet[5]);\n            setting.Brightness = packet[6];\n\n            setting.RGBColor = Color.FromArgb(packet[7], packet[8], packet[9]);\n\n\n            setting.AnimationDirection = SupportsAnimationDirection(setting.LightingMode)\n                ? (AnimationDirection)packet[11]\n                : AnimationDirection.Clockwise;\n\n            setting.RandomColor = SupportsRandomColor(setting.LightingMode) && packet[12] == 0x01;\n            setting.AnimationSpeed = SupportsAnimationSpeed(setting.LightingMode)\n                ? (AnimationSpeed)packet[13]\n                : AnimationSpeed.Medium;\n\n            //If the mouse reports an out of range value, which it does when the current setting has no speed option, chose medium as default\n            if (setting.AnimationSpeed != AnimationSpeed.Fast\n                && setting.AnimationSpeed != AnimationSpeed.Medium\n                && setting.AnimationSpeed != AnimationSpeed.Slow)\n            {\n                setting.AnimationSpeed = AnimationSpeed.Medium;\n            }\n\n            return setting;\n        }\n\n        public virtual void ReadLightingSetting()\n        {\n            if (!HasRGB())\n            {\n                return;\n            }\n\n            LightingZone[] lz = SupportedLightingZones();\n            for (int i = 0; i < lz.Length; ++i)\n            {\n                byte[]? response = WriteForResponse(GetReadLightingModePacket(lz[i]));\n                if (response is null) return;\n\n                LightingSetting? ls = ParseLightingSetting(response);\n                if (ls is null)\n                {\n                    Logger.WriteLine(GetDisplayName() + \": Failed to read RGB Setting for Zone \" + lz[i].ToString());\n                    continue;\n                }\n\n                Logger.WriteLine(GetDisplayName() + \": Read RGB Setting for Zone \" + lz[i].ToString() + \": \" + ls.ToString());\n                LightingSetting[i] = ls;\n            }\n        }\n\n        public void SetLightingSetting(LightingSetting lightingSetting, LightingZone zone)\n        {\n            if (!HasRGB() || lightingSetting is null)\n            {\n                return;\n            }\n\n            WriteForResponse(GetUpdateLightingModePacket(lightingSetting, zone));\n            FlushSettings();\n\n            Logger.WriteLine(GetDisplayName() + \": Set RGB Setting for zone \" + zone.ToString() + \": \" + lightingSetting.ToString());\n            if (zone == LightingZone.All)\n            {\n                for (int i = 0; i < this.LightingSetting.Length; ++i)\n                {\n                    this.LightingSetting[i] = lightingSetting;\n                }\n            }\n            else\n            {\n                this.LightingSetting[IndexForZone(zone)] = lightingSetting;\n            }\n        }\n\n        protected virtual byte[] GetSaveProfilePacket()\n        {\n            return new byte[] { reportId, 0x50, 0x03 };\n        }\n\n        public void FlushSettings()\n        {\n            WriteForResponse(GetSaveProfilePacket());\n\n            Logger.WriteLine(GetDisplayName() + \": Settings Flushed \");\n        }\n\n        public override string? ToString()\n        {\n            return \"\";\n\n        }\n\n\n        public static string ByteArrayToString(byte[] packet)\n        {\n            StringBuilder hex = new StringBuilder(packet.Length * 2);\n            foreach (byte b in packet)\n                hex.AppendFormat(\"{0:x2} \", b);\n            return hex.ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/Chakram.cs",
    "content": "﻿\nnamespace GHelper.Peripherals.Mouse.Models\n{\n    //P704\n    public class Chakram : AsusMouse\n    {\n        public Chakram() : base(0x0B05, 0x18E5, \"mi_00\", true) { \n        \n        }\n\n        protected Chakram(ushort vendorId, bool wireless) : base(0x0B05, vendorId, \"mi_00\", wireless)\n        {\n        }\n        public override int DPIProfileCount()\n        {\n            return 4;\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Chakram (Wireless)\";\n        }\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR125Hz,\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz\n            };\n        }\n\n\n        public override int ProfileCount()\n        {\n            return 3;\n        }\n        public override int MaxDPI()\n        {\n            return 16_000;\n        }\n\n        public override bool HasDebounceSetting()\n        {\n            return true;\n        }\n        public override bool HasLiftOffSetting()\n        {\n            return true;\n        }\n        public override int DPIIncrements()\n        {\n            return 100;\n        }\n\n        public override bool HasRGB()\n        {\n            return true;\n        }\n        public override int MaxBrightness()\n        {\n            return 4;\n        }\n\n        public override LightingZone[] SupportedLightingZones()\n        {\n            return new LightingZone[] { LightingZone.Logo, LightingZone.Scrollwheel, LightingZone.Underglow };\n        }\n\n        public override bool HasAutoPowerOff()\n        {\n            return true;\n        }\n\n        public override bool HasAngleSnapping()\n        {\n            return true;\n        }\n\n        public override bool HasAngleTuning()\n        {\n            return false;\n        }\n\n        public override bool HasLowBatteryWarning()\n        {\n            return true;\n        }\n\n        public override int LowBatteryWarningStep()\n        {\n            return 25;\n        }\n\n        public override int LowBatteryWarningMax()\n        {\n            return 100;\n        }\n\n        protected override int ParseBattery(byte[] packet)\n        {\n            return base.ParseBattery(packet) * 25;\n        }\n        protected override int ParseLowBatteryWarning(byte[] packet)\n        {\n            return base.ParseLowBatteryWarning(packet) * 25;\n        }\n        protected override byte[] GetUpdateEnergySettingsPacket(int lowBatteryWarning, PowerOffSetting powerOff)\n        {\n            return base.GetUpdateEnergySettingsPacket(lowBatteryWarning / 25, powerOff);\n        }\n        protected override byte[] GetReadLightingModePacket(LightingZone zone)\n        {\n            return new byte[] { 0x00, 0x12, 0x03, 0x00 };\n        }\n\n        protected LightingSetting? ParseLightingSetting(byte[] packet, LightingZone zone)\n        {\n            if (packet[1] != 0x12 || packet[2] != 0x03)\n            {\n                return null;\n            }\n\n            int offset = 5 + (((int)zone) * 5);\n\n            LightingSetting setting = new LightingSetting();\n\n            setting.LightingMode = LightingModeForIndex(packet[offset + 0]);\n            setting.Brightness = packet[offset + 1];\n\n            setting.RGBColor = Color.FromArgb(packet[offset + 2], packet[offset + 3], packet[offset + 4]);\n\n            setting.AnimationDirection = SupportsAnimationDirection(setting.LightingMode)\n                 ? (AnimationDirection)packet[21]\n                 : AnimationDirection.Clockwise;\n\n            if (setting.AnimationDirection != AnimationDirection.Clockwise\n                && setting.AnimationDirection != AnimationDirection.CounterClockwise)\n            {\n                setting.AnimationDirection = AnimationDirection.Clockwise;\n            }\n\n            setting.RandomColor = SupportsRandomColor(setting.LightingMode) && packet[22] == 0x01;\n            setting.AnimationSpeed = SupportsAnimationSpeed(setting.LightingMode)\n                ? (AnimationSpeed)packet[23]\n                : AnimationSpeed.Medium;\n\n            //If the mouse reports an out of range value, which it does when the current setting has no speed option, chose medium as default\n            if (setting.AnimationSpeed != AnimationSpeed.Fast\n                && setting.AnimationSpeed != AnimationSpeed.Medium\n                && setting.AnimationSpeed != AnimationSpeed.Slow)\n            {\n                setting.AnimationSpeed = AnimationSpeed.Medium;\n            }\n            return setting;\n        }\n\n        public override void ReadLightingSetting()\n        {\n            if (!HasRGB())\n            {\n                return;\n            }\n            //Mouse sends all lighting zones in one response\n            //21: Direction\n            //22: Random\n            //23: Speed\n            //                                                                  20 21 22 23\n            //00 12 03 00 00 [03 04 00 00 ff] [03 04 00 00 ff] [03 04 00 00 ff] 00 04 00 00\n            //00 12 03 00 00 [05 02 ff 00 ff] [05 02 ff 00 ff] [05 02 ff 00 ff] 00 01 01 00\n            //00 12 03 00 00 [03 01 00 00 ff] [03 01 00 00 ff] [03 01 00 00 ff] 00 01 00 01\n            byte[]? response = WriteForResponse(GetReadLightingModePacket(LightingZone.All));\n            if (response is null) return;\n\n            LightingZone[] lz = SupportedLightingZones();\n            for (int i = 0; i < lz.Length; ++i)\n            {\n                LightingSetting? ls = ParseLightingSetting(response, lz[i]);\n                if (ls is null)\n                {\n                    Logger.WriteLine(GetDisplayName() + \": Failed to read RGB Setting for Zone \" + lz[i].ToString());\n                    continue;\n                }\n\n                Logger.WriteLine(GetDisplayName() + \": Read RGB Setting for Zone \" + lz[i].ToString() + \": \" + ls.ToString());\n                LightingSetting[i] = ls;\n            }\n        }\n\n        public override bool CanChangeDPIProfile()\n        {\n            return false;\n        }\n    }\n\n\n    public class ChakramWired : Chakram\n    {\n        public ChakramWired() : base(0x18E3, false)\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Chakram (Wired)\";\n        }\n    }\n}\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/ChakramCore.cs",
    "content": "﻿\nnamespace GHelper.Peripherals.Mouse.Models\n{\n    //P511\n    public class ChakramCore : AsusMouse\n    {\n        public ChakramCore() : base(0x0B05, 0x1958, \"mi_00\", false) { \n        \n        }\n\n        public override int DPIProfileCount()\n        {\n            return 4;\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Chakram Core\";\n        }\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR125Hz,\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz\n            };\n        }\n\n\n        public override int ProfileCount()\n        {\n            return 3;\n        }\n        public override int MaxDPI()\n        {\n            return 16_000;\n        }\n\n        public override bool HasDebounceSetting()\n        {\n            return false;\n        }\n\n        public override bool HasLiftOffSetting()\n        {\n            return true;\n        }\n        public override int DPIIncrements()\n        {\n            return 100;\n        }\n\n        public override bool HasRGB()\n        {\n            return true;\n        }\n        public override int MaxBrightness()\n        {\n            return 4;\n        }\n\n        public override LightingZone[] SupportedLightingZones()\n        {\n            return new LightingZone[] { LightingZone.Logo, LightingZone.Scrollwheel };\n        }\n\n        public override bool IsLightingModeSupported(LightingMode lightingMode)\n        {\n            return lightingMode == LightingMode.Static\n                || lightingMode == LightingMode.Breathing\n                || lightingMode == LightingMode.ColorCycle\n                || lightingMode == LightingMode.React;\n        }\n\n        //Mouse has React mapped to 0x03 instead of 0x04 like other mice\n        protected override byte IndexForLightingMode(LightingMode lightingMode)\n        {\n            if (lightingMode == LightingMode.React)\n            {\n                return 0x03;\n            }\n            return ((byte)lightingMode);\n        }\n\n        //Mouse has React mapped to 0x03 instead of 0x04 like other mice\n        protected override LightingMode LightingModeForIndex(byte lightingMode)\n        {\n            if (lightingMode == 0x03)\n            {\n                return LightingMode.React;\n            }\n            return base.LightingModeForIndex(lightingMode);\n\n        }\n\n        public override bool HasBattery()\n        {\n            return false;\n        }\n\n        public override bool HasAngleSnapping()\n        {\n            return true;\n        }\n\n        public override bool HasAngleTuning()\n        {\n            return false;\n        }\n\n        protected override byte[] GetReadLightingModePacket(LightingZone zone)\n        {\n            return new byte[] { 0x00, 0x12, 0x03, 0x00 };\n        }\n\n        protected LightingSetting? ParseLightingSetting(byte[] packet, LightingZone zone)\n        {\n            if (packet[1] != 0x12 || packet[2] != 0x03)\n            {\n                return null;\n            }\n\n            int offset = 5 + (((int)zone) * 5);\n\n            LightingSetting setting = new LightingSetting();\n\n            setting.LightingMode = LightingModeForIndex(packet[offset + 0]);\n            setting.Brightness = packet[offset + 1];\n\n            setting.RGBColor = Color.FromArgb(packet[offset + 2], packet[offset + 3], packet[offset + 4]);\n\n            setting.AnimationDirection = SupportsAnimationDirection(setting.LightingMode)\n                 ? (AnimationDirection)packet[21]\n                 : AnimationDirection.Clockwise;\n\n            if (setting.AnimationDirection != AnimationDirection.Clockwise\n                && setting.AnimationDirection != AnimationDirection.CounterClockwise)\n            {\n                setting.AnimationDirection = AnimationDirection.Clockwise;\n            }\n\n            setting.RandomColor = SupportsRandomColor(setting.LightingMode) && packet[22] == 0x01;\n            setting.AnimationSpeed = SupportsAnimationSpeed(setting.LightingMode)\n                ? (AnimationSpeed)packet[23]\n                : AnimationSpeed.Medium;\n\n            //If the mouse reports an out of range value, which it does when the current setting has no speed option, chose medium as default\n            if (setting.AnimationSpeed != AnimationSpeed.Fast\n                && setting.AnimationSpeed != AnimationSpeed.Medium\n                && setting.AnimationSpeed != AnimationSpeed.Slow)\n            {\n                setting.AnimationSpeed = AnimationSpeed.Medium;\n            }\n            return setting;\n        }\n\n        public override void ReadLightingSetting()\n        {\n            if (!HasRGB())\n            {\n                return;\n            }\n            //Mouse sends all lighting zones in one response\n            //21: Direction\n            //22: Random\n            //23: Speed\n            //                                                                  20 21 22 23\n            //00 12 03 00 00 [03 04 00 00 ff] [03 04 00 00 ff] [03 04 00 00 ff] 00 04 00 00\n            //00 12 03 00 00 [05 02 ff 00 ff] [05 02 ff 00 ff] [05 02 ff 00 ff] 00 01 01 00\n            //00 12 03 00 00 [03 01 00 00 ff] [03 01 00 00 ff] [03 01 00 00 ff] 00 01 00 01\n            byte[]? response = WriteForResponse(GetReadLightingModePacket(LightingZone.All));\n            if (response is null) return;\n\n            LightingZone[] lz = SupportedLightingZones();\n            for (int i = 0; i < lz.Length; ++i)\n            {\n                LightingSetting? ls = ParseLightingSetting(response, lz[i]);\n                if (ls is null)\n                {\n                    Logger.WriteLine(GetDisplayName() + \": Failed to read RGB Setting for Zone \" + lz[i].ToString());\n                    continue;\n                }\n\n                Logger.WriteLine(GetDisplayName() + \": Read RGB Setting for Zone \" + lz[i].ToString() + \": \" + ls.ToString());\n                LightingSetting[i] = ls;\n            }\n        }\n\n        public override bool CanChangeDPIProfile()\n        {\n            return false;\n        }\n\n        protected override LiftOffDistance ParseLiftOffDistance(byte[] packet)\n        {\n            if (packet[1] != 0x12 || packet[2] != 0x06)\n            {\n                return LiftOffDistance.Low;\n            }\n\n            return (LiftOffDistance)packet[5];\n        }\n\n        protected override byte[] GetUpdateLiftOffDistancePacket(LiftOffDistance liftOffDistance)\n        {\n            return new byte[] { 0x00, 0x51, 0x35, 0x00, 0x00, ((byte)liftOffDistance) };\n        }\n    }\n}\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/ChakramX.cs",
    "content": "﻿\nnamespace GHelper.Peripherals.Mouse.Models\n{\n    public class ChakramX : AsusMouse\n    {\n        public ChakramX() : base(0x0B05, 0x1A1A, \"mi_00\", true)\n        {\n        }\n\n        protected ChakramX(ushort vendorId, bool wireless) : base(0x0B05, vendorId, \"mi_00\", wireless)\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Chakram X (Wireless)\";\n        }\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz\n            };\n        }\n\n        public override bool HasAngleSnapping()\n        {\n            return true;\n        }\n\n        public override int ProfileCount()\n        {\n            return 5;\n        }\n\n        public override int DPIProfileCount()\n        {\n            return 4;\n        }\n\n        public override int MaxDPI()\n        {\n            return 36_000;\n        }\n\n        public override bool HasXYDPI()\n        {\n            return true;\n        }\n\n        public override bool HasDebounceSetting()\n        {\n            return true;\n        }\n\n        public override bool HasLiftOffSetting()\n        {\n            return true;\n        }\n\n        public override bool HasRGB()\n        {\n            return true;\n        }\n\n        public override LightingZone[] SupportedLightingZones()\n        {\n            return new LightingZone[] { LightingZone.Logo, LightingZone.Scrollwheel, LightingZone.Underglow };\n        }\n\n        public override bool HasAutoPowerOff()\n        {\n            return true;\n        }\n\n        public override bool HasAngleTuning()\n        {\n            return true;\n        }\n\n        public override bool HasLowBatteryWarning()\n        {\n            return true;\n        }\n\n        public override bool HasDPIColors()\n        {\n            return true;\n        }\n    }\n\n    public class ChakramXWired : ChakramX\n    {\n        public ChakramXWired() : base(0x1A18, false)\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Chakram X (Wired)\";\n        }\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz,\n                PollingRate.PR2000Hz,\n                PollingRate.PR4000Hz,\n                PollingRate.PR8000Hz\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/GladiusII.cs",
    "content": "﻿namespace GHelper.Peripherals.Mouse.Models\n{\n    //P504\n    public class GladiusIIOrigin : AsusMouse\n    {\n        public GladiusIIOrigin() : base(0x0B05, 0x1877, \"mi_02\", false)\n        {\n        }\n\n        public GladiusIIOrigin(ushort productId, string path) : base(0x0B05, productId, path, false)\n        {\n        }\n\n        public override int DPIProfileCount()\n        {\n            return 2;\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"Gladius II Origin\";\n        }\n\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR125Hz,\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz\n            };\n        }\n\n        public override int ProfileCount()\n        {\n            return 1;\n        }\n        public override int MaxDPI()\n        {\n            return 12_000;\n        }\n\n        public override bool HasRGB()\n        {\n            return true;\n        }\n\n        public override bool HasAutoPowerOff()\n        {\n            return false;\n        }\n\n        public override bool HasAngleSnapping()\n        {\n            return true;\n        }\n\n        public override bool HasAngleTuning()\n        {\n            return false;\n        }\n\n        public override bool HasDebounceSetting()\n        {\n            return true;\n        }\n        public override bool HasLiftOffSetting()\n        {\n            return true;\n        }\n\n        public override bool HasLowBatteryWarning()\n        {\n            return false;\n        }\n\n        public override bool HasBattery()\n        {\n            return false;\n        }\n\n        public override bool HasDPIColors()\n        {\n            return false;\n        }\n\n        public override bool IsLightingModeSupported(LightingMode lightingMode)\n        {\n            return lightingMode == LightingMode.Static\n                || lightingMode == LightingMode.Breathing\n                || lightingMode == LightingMode.ColorCycle\n                || lightingMode == LightingMode.Rainbow\n                || lightingMode == LightingMode.React\n                || lightingMode == LightingMode.Comet;\n        }\n\n        public override LightingZone[] SupportedLightingZones()\n        {\n            return new LightingZone[] { LightingZone.Logo, LightingZone.Scrollwheel, LightingZone.Underglow };\n        }\n\n        public override int DPIIncrements()\n        {\n            return 100;\n        }\n\n        public override bool CanChangeDPIProfile()\n        {\n            return true;\n        }\n\n        public override int MaxBrightness()\n        {\n            return 4;\n        }\n\n        protected override byte[] GetUpdateLightingModePacket(LightingSetting lightingSetting, LightingZone zone)\n        {\n            /*\n             * This mouse uses different speed values for rainbow mode compared to others.\n             * 51 28 03 00 03 04 FF 00 00 00 00 [8C] 00 00 00 00\n             * 51 28 03 00 03 04 FF 00 00 00 00 [64] 00 00 00 00\n             * 51 28 03 00 03 04 FF 00 00 00 00 [3F] 00 00 00 00\n             */\n\n            if (lightingSetting.LightingMode == LightingMode.Rainbow)\n            {\n                byte speed = 0x3F;\n\n                switch (lightingSetting.AnimationSpeed)\n                {\n                    case AnimationSpeed.Slow:\n                        speed = 0x3F;\n                        break;\n                    case AnimationSpeed.Medium:\n                        speed = 0x64;\n                        break;\n                    case AnimationSpeed.Fast:\n                        speed = 0x8C;\n                        break;\n                }\n\n                return new byte[] { reportId, 0x51, 0x28, (byte)zone, 0x00,\n                    IndexForLightingMode(lightingSetting.LightingMode),\n                    (byte)lightingSetting.Brightness,\n                    0xFF, 0x00, 0x00,\n                    (byte)(SupportsAnimationDirection(lightingSetting.LightingMode) ? lightingSetting.AnimationDirection : 0x00),\n                    (byte)((lightingSetting.RandomColor && SupportsRandomColor(lightingSetting.LightingMode)) ? 0x01: 0x00),\n                    (byte)(SupportsAnimationSpeed(lightingSetting.LightingMode) ? speed : 0x00)\n                };\n            }\n\n            return base.GetUpdateLightingModePacket(lightingSetting, zone);\n        }\n\n        protected override byte[] GetReadLightingModePacket(LightingZone zone)\n        {\n            return new byte[] { 0x00, 0x12, 0x03, 0x00 };\n        }\n\n        protected LightingSetting? ParseLightingSetting(byte[] packet, LightingZone zone)\n        {\n            if (packet[1] != 0x12 || packet[2] != 0x03)\n            {\n                return null;\n            }\n\n            int offset = 5 + (((int)zone) * 5);\n\n            LightingSetting setting = new LightingSetting();\n\n            setting.LightingMode = LightingModeForIndex(packet[offset + 0]);\n            setting.Brightness = packet[offset + 1];\n\n            setting.RGBColor = Color.FromArgb(packet[offset + 2], packet[offset + 3], packet[offset + 4]);\n\n\n            return setting;\n        }\n\n        public override void ReadLightingSetting()\n        {\n            if (!HasRGB())\n            {\n                return;\n            }\n            //Mouse sends all lighting zones in one response                       Direction, Random col, Speed\n            //00 12 03 00 00 [00 04 ff 00 80] [00 04 00 ff ff] [00 04 ff ff ff] 00 [00] [00] [00] 00 00 \n            //00 12 03 00 00 [03 04 00 00 00] [03 04 00 00 00] [03 04 00 00 00] 00 [00] [00] [07] 00 00\n            byte[]? response = WriteForResponse(GetReadLightingModePacket(LightingZone.All));\n            if (response is null) return;\n\n            LightingZone[] lz = SupportedLightingZones();\n            for (int i = 0; i < lz.Length; ++i)\n            {\n                LightingSetting? ls = ParseLightingSetting(response, lz[i]);\n                if (ls is null)\n                {\n                    Logger.WriteLine(GetDisplayName() + \": Failed to read RGB Setting for Zone \" + lz[i].ToString());\n                    continue;\n                }\n                ls.AnimationDirection = SupportsAnimationDirection(ls.LightingMode)\n                   ? (AnimationDirection)response[21]\n                   : AnimationDirection.Clockwise;\n\n                ls.RandomColor = SupportsRandomColor(ls.LightingMode) && response[22] == 0x01;\n\n                ls.AnimationSpeed = SupportsAnimationSpeed(ls.LightingMode)\n                    ? (AnimationSpeed)response[23]\n                    : AnimationSpeed.Medium;\n\n                if (ls.AnimationSpeed != AnimationSpeed.Fast\n                    && ls.AnimationSpeed != AnimationSpeed.Medium\n                    && ls.AnimationSpeed != AnimationSpeed.Slow)\n                {\n                    ls.AnimationSpeed = AnimationSpeed.Medium;\n                }\n\n                Logger.WriteLine(GetDisplayName() + \": Read RGB Setting for Zone \" + lz[i].ToString() + \": \" + ls.ToString());\n                LightingSetting[i] = ls;\n            }\n        }\n\n\n\n        protected override PollingRate ParsePollingRate(byte[] packet)\n        {\n            if (packet[1] == 0x12 && packet[2] == 0x04 && packet[3] == 0x00)\n            {\n                return (PollingRate)packet[9];\n            }\n\n            return PollingRate.PR125Hz;\n        }\n\n        protected override byte[] GetUpdatePollingRatePacket(PollingRate pollingRate)\n        {\n            return new byte[] { reportId, 0x51, 0x31, 0x02, 0x00, (byte)pollingRate };\n        }\n\n        protected override bool ParseAngleSnapping(byte[] packet)\n        {\n            if (packet[1] == 0x12 && packet[2] == 0x04 && packet[3] == 0x00)\n            {\n                return packet[13] == 0x01;\n            }\n\n            return false;\n        }\n\n        protected override byte[] GetUpdateAngleSnappingPacket(bool angleSnapping)\n        {\n            return new byte[] { reportId, 0x51, 0x31, 0x04, 0x00, (byte)(angleSnapping ? 0x01 : 0x00) };\n        }\n\n        protected override DebounceTime ParseDebounce(byte[] packet)\n        {\n            if (packet[1] != 0x12 || packet[2] != 0x04 || packet[3] != 0x00)\n            {\n                return DebounceTime.MS12;\n            }\n\n            if (packet[11] < 0x02)\n            {\n                return DebounceTime.MS12;\n            }\n\n            if (packet[11] > 0x07)\n            {\n                return DebounceTime.MS32;\n            }\n\n            return (DebounceTime)packet[11];\n        }\n\n        protected override byte[] GetUpdateDebouncePacket(DebounceTime debounce)\n        {\n            return new byte[] { reportId, 0x51, 0x31, 0x03, 0x00, ((byte)debounce) };\n        }\n    }\n\n    //P502\n    public class GladiusII : GladiusIIOrigin\n    {\n        public GladiusII() : base(0x1845, \"mi_02\")\n        {\n\n        }\n        public override string GetDisplayName()\n        {\n            return \"Gladius II Origin\";\n        }\n\n        public override int ProfileCount()\n        {\n            return 3;\n        }\n    }\n\n    //P504\n    public class GladiusIIOriginPink : GladiusIIOrigin\n    {\n        public GladiusIIOriginPink() : base(0x18CD, \"mi_02\")\n        {\n\n        }\n        public override string GetDisplayName()\n        {\n            return \"Gladius II PNK LTD\";\n        }\n        public override int ProfileCount()\n        {\n            return 3;\n        }\n\n        public override LightingZone[] SupportedLightingZones()\n        {\n            return new LightingZone[] { LightingZone.Scrollwheel, LightingZone.Underglow };\n        }\n\n        protected override byte[] GetUpdateLightingModePacket(LightingSetting lightingSetting, LightingZone zone)\n        {\n            /*\n             * This mouse uses different speed values for rainbow mode compared to others.\n             * 51 28 03 00 03 04 FF 00 00 00 00 [8C] 00 00 00 00\n             * 51 28 03 00 03 04 FF 00 00 00 00 [64] 00 00 00 00\n             * 51 28 03 00 03 04 FF 00 00 00 00 [3F] 00 00 00 00\n             */\n\n            byte speed = (byte)(SupportsAnimationSpeed(lightingSetting.LightingMode) ? lightingSetting.AnimationSpeed : 0x00);\n\n            if (lightingSetting.LightingMode == LightingMode.Rainbow)\n            {\n                speed = 0x64;\n\n                switch (lightingSetting.AnimationSpeed)\n                {\n                    case AnimationSpeed.Slow:\n                        speed = 0x8C;\n                        break;\n                    case AnimationSpeed.Medium:\n                        speed = 0x64;\n                        break;\n                    case AnimationSpeed.Fast:\n                        speed = 0x3F;\n                        break;\n                }\n            }\n\n\n\n            return new byte[] { reportId, 0x51, 0x28, (byte)zone, 0x00,\n                IndexForLightingMode(lightingSetting.LightingMode),\n                (byte)lightingSetting.Brightness,\n                0x00, // this mouse has 2 colors per LED capability, but we do not suppor this yet, so we disable it\n                lightingSetting.RGBColor.R, lightingSetting.RGBColor.G, lightingSetting.RGBColor.B,\n                0x00, 0x00, 0x00, //this would be the second set of RGB Colors if we ever support this\n                (byte)(SupportsAnimationDirection(lightingSetting.LightingMode) ? lightingSetting.AnimationDirection : 0x00),\n                (byte)((lightingSetting.RandomColor && SupportsRandomColor(lightingSetting.LightingMode)) ? 0x01: 0x00),\n                speed\n            };\n        }\n\n        protected LightingSetting? ParseLightingSetting(byte[] packet, LightingZone zone)\n        {\n            if (packet[1] != 0x12 || packet[2] != 0x03)\n            {\n                return null;\n            }\n\n            //skip first block as it seems to be empty. Maybe only filled to certain configurations.\n            int offset = 5 + 9 + (((int)zone) * 9);\n\n            LightingSetting setting = new LightingSetting();\n\n            setting.LightingMode = LightingModeForIndex(packet[offset + 0]);\n            setting.Brightness = packet[offset + 1];\n            //Offset 2 is a bool that says whether dual color RGB is in use. Unsupported for now by GHelper\n\n            setting.RGBColor = Color.FromArgb(packet[offset + 3], packet[offset + 4], packet[offset + 5]);\n\n            //Offset 7 - 9 are the second RGB colors, unuse as not supported yet\n\n\n            return setting;\n        }\n\n        public override void ReadLightingSetting()\n        {\n            if (!HasRGB())\n            {\n                return;\n            }\n            //Mouse sends all lighting zones in one response                                                         Direction, Random col, Speed\n            //First block seems emtpy?\n            //00 12 03 00 00 [00 00 00 00 00 00 00 00 00] [03 04 01 00 00 00 00 00 00] [03 04 01 00 00 00 00 00 00] [00 01 8c]\n            //Length 9, offset 5\n            //Direction\n            byte[]? response = WriteForResponse(GetReadLightingModePacket(LightingZone.All));\n            if (response is null) return;\n\n            LightingZone[] lz = SupportedLightingZones();\n            for (int i = 0; i < lz.Length; ++i)\n            {\n                LightingSetting? ls = ParseLightingSetting(response, lz[i]);\n                if (ls is null)\n                {\n                    Logger.WriteLine(GetDisplayName() + \": Failed to read RGB Setting for Zone \" + lz[i].ToString());\n                    continue;\n                }\n                ls.AnimationDirection = SupportsAnimationDirection(ls.LightingMode)\n                   ? (AnimationDirection)response[32]\n                   : AnimationDirection.Clockwise;\n\n                ls.RandomColor = SupportsRandomColor(ls.LightingMode) && response[33] == 0x01;\n\n                //Rainbow uses different speed values for whatever reason\n                if (response[12] == 0x03)\n                {\n                    byte speed = response[34];\n\n                    switch (speed)\n                    {\n                        case 0x3F:\n                            ls.AnimationSpeed = AnimationSpeed.Fast;\n                            break;\n\n                        case 0x64:\n                            ls.AnimationSpeed = AnimationSpeed.Medium;\n                            break;\n\n                        case 0x8C:\n                            ls.AnimationSpeed = AnimationSpeed.Slow;\n                            break;\n\n                        default:\n                            ls.AnimationSpeed = AnimationSpeed.Medium;\n                            break;\n                    }\n                }\n                else\n                {\n                    ls.AnimationSpeed = SupportsAnimationSpeed(ls.LightingMode)\n                    ? (AnimationSpeed)response[34]\n                    : AnimationSpeed.Medium;\n\n                    if (ls.AnimationSpeed != AnimationSpeed.Fast\n                        && ls.AnimationSpeed != AnimationSpeed.Medium\n                        && ls.AnimationSpeed != AnimationSpeed.Slow)\n                    {\n                        ls.AnimationSpeed = AnimationSpeed.Medium;\n                    }\n                }\n\n\n                Logger.WriteLine(GetDisplayName() + \": Read RGB Setting for Zone \" + lz[i].ToString() + \": \" + ls.ToString());\n                LightingSetting[i] = ls;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/GladiusIIIAimpoint.cs",
    "content": "﻿namespace GHelper.Peripherals.Mouse.Models\n{\n    //P711\n    public class GladiusIIIAimpoint : AsusMouse\n    {\n        public GladiusIIIAimpoint() : base(0x0B05, 0x1A72, \"mi_00\", true)\n        {\n        }\n\n        protected GladiusIIIAimpoint(ushort productId, bool wireless) : base(0x0B05, productId, \"mi_00\", wireless)\n        {\n        }\n\n        protected GladiusIIIAimpoint(ushort productId, bool wireless, string endpoint, byte reportId) : base(0x0B05, productId, endpoint, wireless, reportId)\n        {\n        }\n\n        public override int DPIProfileCount()\n        {\n            return 4;\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Gladius III Aimpoint (Wireless)\";\n        }\n\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR125Hz,\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz\n            };\n        }\n\n        public override int ProfileCount()\n        {\n            return 5;\n        }\n        public override int MaxDPI()\n        {\n            return 36_000;\n        }\n\n        public override bool HasXYDPI()\n        {\n            return true;\n        }\n\n        public override bool HasDebounceSetting()\n        {\n            return true;\n        }\n\n        public override bool HasLiftOffSetting()\n        {\n            return true;\n        }\n\n        public override bool HasRGB()\n        {\n            return true;\n        }\n\n        public override LightingZone[] SupportedLightingZones()\n        {\n            return new LightingZone[] { LightingZone.Logo, LightingZone.Scrollwheel, LightingZone.Underglow };\n        }\n\n        public override bool HasAutoPowerOff()\n        {\n            return true;\n        }\n\n        public override bool HasAngleSnapping()\n        {\n            return true;\n        }\n\n        public override bool HasAngleTuning()\n        {\n            return true;\n        }\n\n        public override bool HasLowBatteryWarning()\n        {\n            return true;\n        }\n\n        public override bool HasDPIColors()\n        {\n            return true;\n        }\n    }\n\n    public class GladiusIIIAimpointWired : GladiusIIIAimpoint\n    {\n        public GladiusIIIAimpointWired() : base(0x1A70, false)\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Gladius III Aimpoint (Wired)\";\n        }\n    }\n\n    public class GladiusIIIAimpointEva2 : GladiusIIIAimpoint\n    {\n        public GladiusIIIAimpointEva2() : base(0x1B0C, true)\n        {\n        }\n\n        public GladiusIIIAimpointEva2(ushort productId) : base(productId, false)\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Gladius III Eva 2 (Wireless)\";\n        }\n\n        public override LightingZone[] SupportedLightingZones()\n        {\n            return new LightingZone[] { LightingZone.Logo };\n        }\n\n        public override bool IsLightingModeSupported(LightingMode lightingMode)\n        {\n            return lightingMode == LightingMode.Static\n                || lightingMode == LightingMode.Breathing\n                || lightingMode == LightingMode.ColorCycle\n                || lightingMode == LightingMode.React\n                || lightingMode == LightingMode.Comet\n                || lightingMode == LightingMode.BatteryState;\n        }\n    }\n\n    public class GladiusIIIAimpointEva2Wired : GladiusIIIAimpointEva2\n    {\n        public GladiusIIIAimpointEva2Wired() : base(0x1B0A)\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Gladius III Eva 2 (Wired)\";\n        }\n    }\n\n    public class GladiusIIIAimpointOmni : GladiusIIIAimpoint\n    {\n        public GladiusIIIAimpointOmni() : base(0x1ACE, true, \"mi_02&col03\", 0x03)\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Gladius III Aimpoint (OMNI)\";\n        }\n\n        public override int USBPacketSize()\n        {\n            return 64;\n        }\n    }\n}\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/GladiusIIIWireless.cs",
    "content": "﻿namespace GHelper.Peripherals.Mouse.Models\n{\n    //P706_Wireless\n    public class GladiusIIIWireless : AsusMouse\n    {\n        public GladiusIIIWireless() : base(0x0B05, 0x197F, \"mi_00\", true)\n        {\n        }\n\n        protected GladiusIIIWireless(ushort vendorId, bool wireless) : base(0x0B05, vendorId, \"mi_00\", wireless)\n        {\n        }\n\n        public override int DPIProfileCount()\n        {\n            return 4;\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Gladius III (Wireless)\";\n        }\n\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR125Hz,\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz\n            };\n        }\n\n        public override int ProfileCount()\n        {\n            return 5;\n        }\n        public override int MaxDPI()\n        {\n            return 26_000;\n        }\n\n        public override bool HasDebounceSetting()\n        {\n            return true;\n        }\n\n        public override bool HasLiftOffSetting()\n        {\n            return true;\n        }\n\n        public override bool HasRGB()\n        {\n            return true;\n        }\n\n        public override LightingZone[] SupportedLightingZones()\n        {\n            return new LightingZone[] { LightingZone.Logo, LightingZone.Scrollwheel, LightingZone.Underglow };\n        }\n\n        public override bool HasAutoPowerOff()\n        {\n            return true;\n        }\n\n        public override bool HasAngleSnapping()\n        {\n            return true;\n        }\n\n        public override bool HasLowBatteryWarning()\n        {\n            return true;\n        }\n    }\n\n    public class GladiusIIIWired : GladiusIIIWireless\n    {\n        public GladiusIIIWired() : base(0x197d, false)\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Gladius III (Wired)\";\n        }\n    }\n\n\n    //P514\n    public class GladiusIII : GladiusIIIWireless\n    {\n        public GladiusIII() : base(0x197B, false)\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Gladius III\";\n        }\n\n        public override bool HasAutoPowerOff()\n        {\n            return false;\n        }\n\n        public override bool HasLowBatteryWarning()\n        {\n            return false;\n        }\n\n        public override bool HasBattery()\n        {\n            return false;\n        }\n\n        public override bool IsLightingModeSupported(LightingMode lightingMode)\n        {\n            return lightingMode == LightingMode.Static\n                || lightingMode == LightingMode.Breathing\n                || lightingMode == LightingMode.ColorCycle\n                || lightingMode == LightingMode.Rainbow\n                || lightingMode == LightingMode.React\n                || lightingMode == LightingMode.Comet;\n        }\n    }\n}\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/GladiusIIWireless.cs",
    "content": "﻿namespace GHelper.Peripherals.Mouse.Models\n{\n    public class GladiusIIWireless : AsusMouse\n    {\n        public GladiusIIWireless() : base(0x0B05, 0x18A0, \"mi_02\", true)\n        {\n        }\n\n        public override int DPIProfileCount()\n        {\n            return 2;\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"Gladius II Wireless\";\n        }\n\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR125Hz,\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz\n            };\n        }\n\n        public override int ProfileCount()\n        {\n            return 1;\n        }\n        public override int MaxDPI()\n        {\n            return 16_000;\n        }\n\n        public override bool HasRGB()\n        {\n            return true;\n        }\n\n        public override bool HasAutoPowerOff()\n        {\n            return true;\n        }\n\n        public override bool HasAngleSnapping()\n        {\n            return true;\n        }\n\n        public override bool HasAngleTuning()\n        {\n            return true;\n        }\n\n        public override bool HasDebounceSetting()\n        {\n            return true;\n        }\n        public override bool HasLiftOffSetting()\n        {\n            return false;\n        }\n\n        public override bool HasLowBatteryWarning()\n        {\n            return true;\n        }\n\n        public override int LowBatteryWarningStep()\n        {\n            return 25;\n        }\n\n        public override bool HasBattery()\n        {\n            return true;\n        }\n\n        public override bool HasDPIColors()\n        {\n            return false;\n        }\n\n        public override bool IsLightingModeSupported(LightingMode lightingMode)\n        {\n            return lightingMode == LightingMode.Static\n                || lightingMode == LightingMode.Breathing\n                || lightingMode == LightingMode.ColorCycle\n                || lightingMode == LightingMode.React\n                || lightingMode == LightingMode.BatteryState;\n        }\n\n        public override LightingZone[] SupportedLightingZones()\n        {\n            return new LightingZone[] { LightingZone.Logo, LightingZone.Scrollwheel };\n        }\n\n        public override int DPIIncrements()\n        {\n            return 100;\n        }\n\n        public override bool CanChangeDPIProfile()\n        {\n            return true;\n        }\n\n        public override int MaxBrightness()\n        {\n            return 4;\n        }\n\n        //Has 25% increments\n        protected override int ParseBattery(byte[] packet)\n        {\n            if (packet[1] == 0x12 && packet[2] == 0x07)\n            {\n                return packet[5] * 25;\n            }\n\n            return -1;\n        }\n\n        protected override byte[] GetUpdateLightingModePacket(LightingSetting lightingSetting, LightingZone zone)\n        {\n            /*\n             * This mouse uses different speed values for rainbow mode compared to others.\n             * 51 28 03 00 03 04 FF 00 00 00 00 [8C] 00 00 00 00\n             * 51 28 03 00 03 04 FF 00 00 00 00 [64] 00 00 00 00\n             * 51 28 03 00 03 04 FF 00 00 00 00 [3F] 00 00 00 00\n             */\n\n            if (lightingSetting.LightingMode == LightingMode.Rainbow)\n            {\n                byte speed = 0x3F;\n\n                switch (lightingSetting.AnimationSpeed)\n                {\n                    case AnimationSpeed.Slow:\n                        speed = 0x3F;\n                        break;\n                    case AnimationSpeed.Medium:\n                        speed = 0x64;\n                        break;\n                    case AnimationSpeed.Fast:\n                        speed = 0x8C;\n                        break;\n                }\n\n                return new byte[] { reportId, 0x51, 0x28, (byte)zone, 0x00,\n                    IndexForLightingMode(lightingSetting.LightingMode),\n                    (byte)lightingSetting.Brightness,\n                    0xFF, 0x00, 0x00,\n                    (byte)(SupportsAnimationDirection(lightingSetting.LightingMode) ? lightingSetting.AnimationDirection : 0x00),\n                    (byte)((lightingSetting.RandomColor && SupportsRandomColor(lightingSetting.LightingMode)) ? 0x01: 0x00),\n                    (byte)(SupportsAnimationSpeed(lightingSetting.LightingMode) ? speed : 0x00)\n                };\n            }\n\n            return base.GetUpdateLightingModePacket(lightingSetting, zone);\n        }\n\n\n        protected override byte[] GetReadLightingModePacket(LightingZone zone)\n        {\n            return new byte[] { 0x00, 0x12, 0x03, 0x00 };\n        }\n\n        protected LightingSetting? ParseLightingSetting(byte[] packet, LightingZone zone)\n        {\n            if (packet[1] != 0x12 || packet[2] != 0x03)\n            {\n                return null;\n            }\n\n            int offset = 5 + (((int)zone) * 5);\n\n            LightingSetting setting = new LightingSetting();\n\n            setting.LightingMode = LightingModeForIndex(packet[offset + 0]);\n            setting.Brightness = packet[offset + 1];\n\n            setting.RGBColor = Color.FromArgb(packet[offset + 2], packet[offset + 3], packet[offset + 4]);\n\n\n            return setting;\n        }\n\n        public override void ReadLightingSetting()\n        {\n            if (!HasRGB())\n            {\n                return;\n            }\n            //Mouse sends all lighting zones in one response                       Direction, Random col, Speed\n            //00 12 03 00 00 [00 04 ff 00 80] [00 04 00 ff ff] [00 04 ff ff ff] 00 [00] [00] [00] 00 00 \n            //00 12 03 00 00 [03 04 00 00 00] [03 04 00 00 00] [03 04 00 00 00] 00 [00] [00] [07] 00 00\n            byte[]? response = WriteForResponse(GetReadLightingModePacket(LightingZone.All));\n            if (response is null) return;\n\n            LightingZone[] lz = SupportedLightingZones();\n            for (int i = 0; i < lz.Length; ++i)\n            {\n                LightingSetting? ls = ParseLightingSetting(response, lz[i]);\n                if (ls is null)\n                {\n                    Logger.WriteLine(GetDisplayName() + \": Failed to read RGB Setting for Zone \" + lz[i].ToString());\n                    continue;\n                }\n                ls.AnimationDirection = SupportsAnimationDirection(ls.LightingMode)\n                   ? (AnimationDirection)response[21]\n                   : AnimationDirection.Clockwise;\n\n                ls.RandomColor = SupportsRandomColor(ls.LightingMode) && response[22] == 0x01;\n\n                ls.AnimationSpeed = SupportsAnimationSpeed(ls.LightingMode)\n                    ? (AnimationSpeed)response[23]\n                    : AnimationSpeed.Medium;\n\n                if (ls.AnimationSpeed != AnimationSpeed.Fast\n                    && ls.AnimationSpeed != AnimationSpeed.Medium\n                    && ls.AnimationSpeed != AnimationSpeed.Slow)\n                {\n                    ls.AnimationSpeed = AnimationSpeed.Medium;\n                }\n\n                Logger.WriteLine(GetDisplayName() + \": Read RGB Setting for Zone \" + lz[i].ToString() + \": \" + ls.ToString());\n                LightingSetting[i] = ls;\n            }\n        }\n\n\n\n        protected override PollingRate ParsePollingRate(byte[] packet)\n        {\n            if (packet[1] == 0x12 && packet[2] == 0x04 && packet[3] == 0x00)\n            {\n                return (PollingRate)packet[9];\n            }\n\n            return PollingRate.PR125Hz;\n        }\n\n        protected override byte[] GetUpdatePollingRatePacket(PollingRate pollingRate)\n        {\n            return new byte[] { reportId, 0x51, 0x31, 0x02, 0x00, (byte)pollingRate };\n        }\n\n        protected override bool ParseAngleSnapping(byte[] packet)\n        {\n            if (packet[1] == 0x12 && packet[2] == 0x04 && packet[3] == 0x00)\n            {\n                return packet[13] == 0x01;\n            }\n\n            return false;\n        }\n\n        protected override byte[] GetUpdateAngleSnappingPacket(bool angleSnapping)\n        {\n            return new byte[] { reportId, 0x51, 0x31, 0x04, 0x00, (byte)(angleSnapping ? 0x01 : 0x00) };\n        }\n\n        protected override DebounceTime ParseDebounce(byte[] packet)\n        {\n            if (packet[1] != 0x12 || packet[2] != 0x04 || packet[3] != 0x00)\n            {\n                return DebounceTime.MS12;\n            }\n\n            if (packet[11] < 0x02)\n            {\n                return DebounceTime.MS12;\n            }\n\n            if (packet[11] > 0x07)\n            {\n                return DebounceTime.MS32;\n            }\n\n            return (DebounceTime)packet[11];\n        }\n\n        protected override byte[] GetUpdateDebouncePacket(DebounceTime debounce)\n        {\n            return new byte[] { reportId, 0x51, 0x31, 0x03, 0x00, ((byte)debounce) };\n        }\n    }\n\n}\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/HarpeAceAimLab.cs",
    "content": "﻿namespace GHelper.Peripherals.Mouse.Models\n{\n    //P713_Wireless\n    public class HarpeAceAimLabEdition : AsusMouse\n    {\n        public HarpeAceAimLabEdition() : base(0x0B05, 0x1A94, \"mi_00\", true)\n        {\n        }\n\n        protected HarpeAceAimLabEdition(ushort productId, bool wireless, string endpoint, byte reportId) : base(0x0B05, productId, endpoint, wireless, reportId)\n        {\n        }\n\n        public override int DPIProfileCount()\n        {\n            return 4;\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Harpe Ace Aim Lab Edition (Wireless)\";\n        }\n\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR125Hz,\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz,\n                PollingRate.PR2000Hz,\n                PollingRate.PR4000Hz,\n                PollingRate.PR8000Hz,\n            };\n        }\n\n        public override int ProfileCount()\n        {\n            return 5;\n        }\n        public override int MaxDPI()\n        {\n            return 36_000;\n        }\n\n        public override int MinDPI()\n        {\n            return 50;\n        }\n\n        public override bool HasXYDPI()\n        {\n            return true;\n        }\n\n        public override bool HasDebounceSetting()\n        {\n            return true;\n        }\n\n        public override bool HasLiftOffSetting()\n        {\n            return true;\n        }\n\n        public override bool HasRGB()\n        {\n            return true;\n        }\n\n        public override LightingZone[] SupportedLightingZones()\n        {\n            return new LightingZone[] { LightingZone.Scrollwheel };\n        }\n\n        public override bool IsLightingModeSupported(LightingMode lightingMode)\n        {\n            return lightingMode == LightingMode.Static\n                || lightingMode == LightingMode.Breathing\n                || lightingMode == LightingMode.ColorCycle\n                || lightingMode == LightingMode.React\n                || lightingMode == LightingMode.BatteryState\n                || lightingMode == LightingMode.Off;\n        }\n\n        public override bool HasAutoPowerOff()\n        {\n            return true;\n        }\n\n        public override bool HasAngleSnapping()\n        {\n            return true;\n        }\n\n        public override bool HasAngleTuning()\n        {\n            return true;\n        }\n\n        public override bool HasLowBatteryWarning()\n        {\n            return true;\n        }\n\n        public override bool HasDPIColors()\n        {\n            return true;\n        }\n\n        public override int AngleTuningStep()\n        {\n            return 1;\n        }\n\n        public override int AngleTuningMin()\n        {\n            return -30;\n        }\n\n        public override int AngleTuningMax()\n        {\n            return 30;\n        }\n\n        public override bool HasAcceleration()\n        {\n            return true;\n        }\n\n        public override bool HasDeceleration()\n        {\n            return true;\n        }\n\n        public override int MaxAcceleration()\n        {\n            return 9;\n        }\n        public override int MaxDeceleration()\n        {\n            return 9;\n        }\n    }\n\n    public class HarpeAceAimLabEditionWired : HarpeAceAimLabEdition\n    {\n        public HarpeAceAimLabEditionWired() : base(0x1A92, false, \"mi_00\", 0x00)\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Harpe Ace Aim Lab Edition (Wired)\";\n        }\n    }\n\n    public class HarpeAceAimLabEditionOmni : HarpeAceAimLabEdition\n    {\n        public HarpeAceAimLabEditionOmni() : base(0x1ACE, true, \"mi_02&col03\", 0x03)\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Harpe Ace Aim Lab Edition (OMNI)\";\n        }\n\n        public override int USBPacketSize()\n        {\n            return 64;\n        }\n    }\n\n\n    public class HarpeAceExtremeWeird : HarpeAceAimLabEdition\n    {\n        public HarpeAceExtremeWeird() : base(0x1B67, false, \"mi_00\", 0x00)\n        {\n        }\n        public override int MaxDPI()\n        {\n            return 42_000;\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Harpe Ace Extreme (Wired)\";\n        }\n    }\n\n    public class HarpeAceExtremeOmni : HarpeAceAimLabEdition\n    {\n        public HarpeAceExtremeOmni() : base(0x1ACE, true, \"mi_02&col03\", 0x03)\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Harpe Ace Extreme (OMNI)\";\n        }\n\n        public override int USBPacketSize()\n        {\n            return 64;\n        }\n        public override int MaxDPI()\n        {\n            return 42_000;\n        }\n    }\n\n}\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/HarpeAceMini.cs",
    "content": "﻿namespace GHelper.Peripherals.Mouse.Models\n{\n    //P716_Wireless\n    public class HarpeAceMiniWired : AsusMouse\n    {\n\n        public HarpeAceMiniWired() : base(0x0B05, 0x1B63, \"mi_00\", false)\n        {\n        }\n\n        protected HarpeAceMiniWired(ushort productId, bool wireless, string endpoint, byte reportId) : base(0x0B05, productId, endpoint, wireless, reportId)\n        {\n        }\n\n        public override int DPIProfileCount()\n        {\n            return 4;\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"Harpe Ace Mini (Wired)\";\n        }\n\n        public override bool CanChangeDPICount()\n        {\n            return true;\n        }\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR125Hz,\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz\n            };\n        }\n\n        public override int ProfileCount()\n        {\n            return 5;\n        }\n        public override int MaxDPI()\n        {\n            return 42_000;\n        }\n\n        public override bool HasXYDPI()\n        {\n            return true;\n        }\n\n        public override bool HasLiftOffSetting()\n        {\n            return true;\n        }\n\n        public override bool HasRGB()\n        {\n            return true;\n        }\n\n        public override LightingZone[] SupportedLightingZones()\n        {\n            return new LightingZone[] { LightingZone.Scrollwheel };\n        }\n\n        public override bool IsLightingModeSupported(LightingMode lightingMode)\n        {\n            return lightingMode == LightingMode.Static\n                || lightingMode == LightingMode.Breathing\n                || lightingMode == LightingMode.ColorCycle\n                || lightingMode == LightingMode.React\n                || lightingMode == LightingMode.BatteryState\n                || lightingMode == LightingMode.Off;\n        }\n\n        public override bool HasAutoPowerOff()\n        {\n            return true;\n        }\n\n        public override bool HasAngleSnapping()\n        {\n            return true;\n        }\n\n        public override bool HasAngleTuning()\n        {\n            return true;\n        }\n\n        public override bool HasLowBatteryWarning()\n        {\n            return true;\n        }\n\n        public override bool HasDPIColors()\n        {\n            return true;\n        }\n\n        public override int AngleTuningStep()\n        {\n            return 5;\n        }\n\n        public override int USBPacketSize()\n        {\n            return 64;\n        }\n    }\n\n    public class HarpeAceMiniOmni : HarpeAceMiniWired\n    {\n        public HarpeAceMiniOmni() : base(0x1ACE, true, \"mi_02&col03\", 0x03)\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"Harpe Ace Mini (OMNI)\";\n        }\n    }\n\n}\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/HarpeIIAce.cs",
    "content": "﻿namespace GHelper.Peripherals.Mouse.Models\n{\n    //P723 - ROG HARPE II ACE (USB Wired)\n    public class HarpeIIAceWired : AsusMouse\n    {\n        public HarpeIIAceWired() : base(0x0B05, 0x1C69, \"mi_00\", false)\n        {\n        }\n\n        protected HarpeIIAceWired(ushort productId, bool wireless, string endpoint, byte reportId) : base(0x0B05, productId, endpoint, wireless, reportId)\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG HARPE II ACE (Wired)\";\n        }\n\n        public override int DPIProfileCount()\n        {\n            return 4;\n        }\n\n        public override int MaxDPI()\n        {\n            return 42_000;\n        }\n\n        public override int MinDPI()\n        {\n            return 100;\n        }\n        public override bool HasXYDPI()\n        {\n            return true;\n        }\n        public override bool HasDPIColors()\n        {\n            return true;\n        }\n        public override bool HasBattery()\n        {\n            return true;\n        }\n\n        public override bool HasAutoPowerOff()\n        {\n            return true;\n        }\n\n        public override bool HasLowBatteryWarning()\n        {\n            return true;\n        }\n\n        public override int ProfileCount()\n        {\n            return 5;\n        }\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR125Hz,\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz,\n                PollingRate.PR2000Hz,\n                PollingRate.PR4000Hz,\n                PollingRate.PR8000Hz\n            };\n        }\n\n        public override bool HasLiftOffSetting()\n        {\n            return true;\n        }\n\n        public override bool HasAngleSnapping()\n        {\n            return true;\n        }\n\n        public override bool HasAngleTuning()\n        {\n            return true;\n        }\n\n        public override bool HasMotionSync()\n        {\n            return true;\n        }\n\n\n\n        public override bool HasRGB()\n        {\n            return true;\n        }\n\n        public override LightingZone[] SupportedLightingZones()\n        {\n            return new LightingZone[] { LightingZone.Scrollwheel };\n        }\n\n\n        public override bool IsLightingModeSupported(LightingMode lightingMode)\n        {\n            return lightingMode == LightingMode.Static\n                || lightingMode == LightingMode.Breathing\n                || lightingMode == LightingMode.ColorCycle\n                || lightingMode == LightingMode.React\n                || lightingMode == LightingMode.BatteryState\n                || lightingMode == LightingMode.Off;\n        }\n\n        public override bool CanChangeDPICount()\n        {\n            return true;\n        }\n\n        public override int USBPacketSize()\n        {\n            return 64;\n        }\n    }\n\n    //P723 - ROG HARPE II ACE (Wireless 2.4GHz RF)\n    public class HarpeIIAceWireless : HarpeIIAceWired\n    {\n        public HarpeIIAceWireless() : base(0x1AD0, true, \"mi_02&col03\", 0x03)\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG HARPE II ACE (Wireless)\";\n        }\n\n        public override bool HasZoneMode()\n        {\n            return true;\n        }\n    }\n}"
  },
  {
    "path": "app/Peripherals/Mouse/Models/KerisIIAce.cs",
    "content": "﻿namespace GHelper.Peripherals.Mouse.Models\n{\n\n    public class KerisIIAceWired : AsusMouse\n    {\n        public KerisIIAceWired() : base(0x0B05, 0x1B16, \"mi_00\", true)\n        {\n        }\n\n        protected KerisIIAceWired(ushort productId, bool wireless, string endpoint, byte reportId) : base(0x0B05, productId, endpoint, wireless, reportId)\n        {\n        }\n\n        public override int DPIProfileCount()\n        {\n            return 4;\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Keris II Ace (Wired)\";\n        }\n\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR125Hz,\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz\n            };\n        }\n\n        public override int ProfileCount()\n        {\n            return 5;\n        }\n\n\n        public override int MaxDPI()\n        {\n            return 42_000;\n        }\n\n        public override bool HasLiftOffSetting()\n        {\n            return true;\n        }\n\n        public override bool HasRGB()\n        {\n            return true;\n        }\n\n        public override bool HasXYDPI()\n        {\n            return true;\n        }\n\n\n        public override bool IsLightingModeSupported(LightingMode lightingMode)\n        {\n            return lightingMode == LightingMode.Static\n                || lightingMode == LightingMode.Breathing\n                || lightingMode == LightingMode.ColorCycle\n                || lightingMode == LightingMode.BatteryState\n                || lightingMode == LightingMode.React\n                || lightingMode == LightingMode.Off;\n        }\n\n        public override bool HasAutoPowerOff()\n        {\n            return true;\n        }\n\n        public override bool HasAngleSnapping()\n        {\n            return true;\n        }\n\n        public override bool HasAngleTuning()\n        {\n            return true;\n        }\n\n        public override bool HasLowBatteryWarning()\n        {\n            return true;\n        }\n\n        public override bool HasDPIColors()\n        {\n            return true;\n        }\n\n        public override int AngleTuningStep()\n        {\n            return 5;\n        }\n    }\n\n    public class KerisAceIIOmni : KerisIIAceWired\n    {\n        public KerisAceIIOmni() : base(0x1ACE, true, \"mi_02&col03\", 0x03)\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Keris II Ace (OMNI)\";\n        }\n\n        public override int USBPacketSize()\n        {\n            return 64;\n        }\n    }\n}\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/KerisIIOrigin.cs",
    "content": "﻿namespace GHelper.Peripherals.Mouse.Models\n{\n\n    public class KerisIIOriginWired : AsusMouse\n    {\n        public KerisIIOriginWired() : base(0x0B05, 0x1C0C, \"mi_00\", true)\n        {\n        }\n\n        protected KerisIIOriginWired(ushort productId, bool wireless, string endpoint, byte reportId) : base(0x0B05, productId, endpoint, wireless, reportId)\n        {\n        }\n\n        public override int DPIProfileCount()\n        {\n            return 4;\n        }\n\n        public override bool CanChangeDPICount()\n        {\n            return true;\n        }\n\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Keris II Origin (Wired)\";\n        }\n\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR125Hz,\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz,\n                PollingRate.PR2000Hz,\n                PollingRate.PR4000Hz,\n                PollingRate.PR8000Hz\n            };\n        }\n\n        public override int ProfileCount()\n        {\n            return 5;\n        }\n\n\n        public override int MaxDPI()\n        {\n            return 42_000;\n        }\n\n        public override bool HasLiftOffSetting()\n        {\n            return true;\n        }\n\n        public override bool HasRGB()\n        {\n            return true;\n        }\n\n        public override LightingZone[] SupportedLightingZones()\n        {\n            return new LightingZone[] { LightingZone.Logo, LightingZone.Scrollwheel, LightingZone.Underglow };\n        }\n\n        public override bool HasXYDPI()\n        {\n            return true;\n        }\n\n\n        public override bool IsLightingModeSupported(LightingMode lightingMode)\n        {\n            return lightingMode == LightingMode.Static\n                || lightingMode == LightingMode.Breathing\n                || lightingMode == LightingMode.ColorCycle\n                || lightingMode == LightingMode.BatteryState\n                || lightingMode == LightingMode.React\n                || lightingMode == LightingMode.Off;\n        }\n\n        public override bool HasAutoPowerOff()\n        {\n            return true;\n        }\n\n        public override bool HasAngleSnapping()\n        {\n            return true;\n        }\n\n        public override bool HasAngleTuning()\n        {\n            return true;\n        }\n\n        public override bool HasLowBatteryWarning()\n        {\n            return true;\n        }\n\n        public override bool HasDPIColors()\n        {\n            return true;\n        }\n\n        public override int AngleTuningStep()\n        {\n            return 5;\n        }\n\n        public override int USBPacketSize()\n        {\n            return 64;\n        }\n    }\n\n    public class KerisIIOriginOmni : KerisIIOriginWired\n    {\n        public KerisIIOriginOmni() : base(0x1ACE, true, \"mi_02&col03\", 0x03)\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Keris II Origin (OMNI)\";\n        }\n \n    }\n}\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/KerisWireless.cs",
    "content": "﻿namespace GHelper.Peripherals.Mouse.Models\n{\n    //P513\n    public class KerisWireless : AsusMouse\n    {\n        public KerisWireless() : base(0x0B05, 0x1960, \"mi_00\", true)\n        {\n        }\n\n        protected KerisWireless(ushort vendorId, bool wireless) : base(0x0B05, vendorId, \"mi_00\", wireless)\n        {\n        }\n\n        public override int DPIProfileCount()\n        {\n            return 4;\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Keris (Wireless)\";\n        }\n\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR125Hz,\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz\n            };\n        }\n\n        public override int ProfileCount()\n        {\n            return 3;\n        }\n        public override int MaxDPI()\n        {\n            return 16_000;\n        }\n\n        public override bool HasLiftOffSetting()\n        {\n            return true;\n        }\n\n        public override bool HasRGB()\n        {\n            return true;\n        }\n\n        public override bool HasAutoPowerOff()\n        {\n            return true;\n        }\n\n        public override bool HasAngleSnapping()\n        {\n            return true;\n        }\n\n        public override bool HasAngleTuning()\n        {\n            return false;\n        }\n\n        public override bool HasLowBatteryWarning()\n        {\n            return true;\n        }\n\n        public override bool HasDPIColors()\n        {\n            return false;\n        }\n\n        public override bool IsLightingModeSupported(LightingMode lightingMode)\n        {\n            return lightingMode == LightingMode.Static\n                || lightingMode == LightingMode.Breathing\n                || lightingMode == LightingMode.ColorCycle\n                || lightingMode == LightingMode.React\n                || lightingMode == LightingMode.BatteryState\n                || lightingMode == LightingMode.Off;\n        }\n\n        //Has 25% increments\n        protected override int ParseBattery(byte[] packet)\n        {\n            if (packet[1] == 0x12 && packet[2] == 0x07)\n            {\n                return packet[5] * 25;\n            }\n\n            return -1;\n        }\n\n\n        public override int DPIIncrements()\n        {\n            return 100;\n        }\n        public override bool HasDebounceSetting()\n        {\n            return true;\n        }\n\n        public override bool CanChangeDPIProfile()\n        {\n            return false;\n        }\n\n        protected override byte[] GetUpdateEnergySettingsPacket(int lowBatteryWarning, PowerOffSetting powerOff)\n        {\n            return base.GetUpdateEnergySettingsPacket(lowBatteryWarning / 25, powerOff);\n        }\n\n        protected override int ParseLowBatteryWarning(byte[] packet)\n        {\n            int lowBat = base.ParseLowBatteryWarning(packet);\n\n            return lowBat * 25;\n        }\n\n        protected override LiftOffDistance ParseLiftOffDistance(byte[] packet)\n        {\n            if (packet[1] != 0x12 || packet[2] != 0x06)\n            {\n                return LiftOffDistance.Low;\n            }\n\n            return (LiftOffDistance)packet[5];\n        }\n\n        protected override byte[] GetUpdateLiftOffDistancePacket(LiftOffDistance liftOffDistance)\n        {\n            return new byte[] { 0x00, 0x51, 0x35, 0x00, 0x00, ((byte)liftOffDistance) };\n        }\n\n        public override LightingZone[] SupportedLightingZones()\n        {\n            return new LightingZone[] { LightingZone.Logo, LightingZone.Scrollwheel };\n        }\n\n        public override int MaxBrightness()\n        {\n            return 4;\n        }\n\n        protected override byte IndexForLightingMode(LightingMode lightingMode)\n        {\n            if (lightingMode == LightingMode.Off)\n            {\n                return 0xFF;\n            }\n            return ((byte)lightingMode);\n        }\n    }\n\n    //P509\n    public class Keris : KerisWireless\n    {\n        public Keris() : base(0x195C, false)\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Keris\";\n        }\n\n        public override bool HasBattery()\n        {\n            return false;\n        }\n\n        public override bool HasLowBatteryWarning()\n        {\n            return false;\n        }\n\n        public override bool HasAutoPowerOff()\n        {\n            return false;\n        }\n    }\n\n    public class KerisWirelessWired : KerisWireless\n    {\n        public KerisWirelessWired() : base(0x195E, false)\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Keris (Wired)\";\n        }\n    }\n\n    public class KerisWirelessEvaEdition : KerisWireless\n    {\n        public KerisWirelessEvaEdition() : base(0x1A59, true)\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Keris EVA Edition\";\n        }\n    }\n\n    public class KerisWirelessEvaEditionWired : KerisWireless\n    {\n        public KerisWirelessEvaEditionWired() : base(0x1A57, false)\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Keris EVA Edition (Wired)\";\n        }\n    }\n}\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/KerisWirelssAimpoint.cs",
    "content": "﻿namespace GHelper.Peripherals.Mouse.Models\n{\n    //P709_Wireless\n    public class KerisWirelssAimpoint : AsusMouse\n    {\n        public KerisWirelssAimpoint() : base(0x0B05, 0x1A68, \"mi_00\", true)\n        {\n        }\n\n        protected KerisWirelssAimpoint(ushort vendorId, bool wireless) : base(0x0B05, vendorId, \"mi_00\", wireless)\n        {\n        }\n\n        protected KerisWirelssAimpoint(ushort productId, bool wireless, string endpoint, byte reportId) : base(0x0B05, productId, endpoint, wireless, reportId)\n        {\n        }\n\n        public override int DPIProfileCount()\n        {\n            return 4;\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Keris Wireless Aimpoint (Wireless)\";\n        }\n\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR125Hz,\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz\n            };\n        }\n\n        public override int ProfileCount()\n        {\n            return 5;\n        }\n        public override int MaxDPI()\n        {\n            return 36_000;\n        }\n\n        public override bool HasXYDPI()\n        {\n            return true;\n        }\n\n        public override bool HasDebounceSetting()\n        {\n            return true;\n        }\n\n        public override bool HasLiftOffSetting()\n        {\n            return true;\n        }\n\n        public override bool HasRGB()\n        {\n            return true;\n        }\n\n        public override LightingZone[] SupportedLightingZones()\n        {\n            return new LightingZone[] { LightingZone.Logo };\n        }\n\n        public override bool IsLightingModeSupported(LightingMode lightingMode)\n        {\n            return lightingMode == LightingMode.Static\n                || lightingMode == LightingMode.Breathing\n                || lightingMode == LightingMode.ColorCycle\n                || lightingMode == LightingMode.BatteryState\n                || lightingMode == LightingMode.React;\n        }\n\n        public override bool HasAutoPowerOff()\n        {\n            return true;\n        }\n\n        public override bool HasAngleSnapping()\n        {\n            return true;\n        }\n\n        public override bool HasAngleTuning()\n        {\n            return true;\n        }\n\n        public override bool HasLowBatteryWarning()\n        {\n            return true;\n        }\n\n        public override bool HasDPIColors()\n        {\n            return true;\n        }\n    }\n\n    public class KerisWirelssAimpointWired : KerisWirelssAimpoint\n    {\n        public KerisWirelssAimpointWired() : base(0x1A66, false)\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Keris Wireless Aimpoint (Wired)\";\n        }\n    }\n\n    public class KerisWirelssAimpointOmni : KerisWirelssAimpoint\n    {\n        public KerisWirelssAimpointOmni() : base(0x1ACE, true, \"mi_02&col03\", 0x03)\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"Keris Wireless Aimpoint (OMNI)\";\n        }\n\n        public override int USBPacketSize()\n        {\n            return 64;\n        }\n    }\n\n}\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/Pugio.cs",
    "content": "﻿namespace GHelper.Peripherals.Mouse.Models\n{\n    //P503\n    public class Pugio : AsusMouse\n    {\n        public Pugio() : base(0x0B05, 0x1846, \"mi_02\", false)\n        {\n        }\n\n        public override int DPIProfileCount()\n        {\n            return 2;\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Pugio\";\n        }\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR125Hz,\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz\n            };\n        }\n\n        public override int ProfileCount()\n        {\n            return 3;\n        }\n        public override int MaxDPI()\n        {\n            return 7_200;\n        }\n        public override int DPIIncrements()\n        {\n            return 50;\n        }\n\n        public override int MinDPI()\n        {\n            return 50;\n        }\n\n        public override bool HasLiftOffSetting()\n        {\n            return true;\n        }\n\n        public override bool HasRGB()\n        {\n            return true;\n        }\n\n        public override bool HasAngleSnapping()\n        {\n            return true;\n        }\n\n        public override bool CanChangeDPIProfile()\n        {\n            return true;\n        }\n\n        public override bool HasBattery()\n        {\n            return false;\n        }\n\n        public override bool HasAutoPowerOff()\n        {\n            return false;\n        }\n\n        //00 12 04 00 00 1f 00 07 00 [03] 00 02 00 00 00\n        protected override PollingRate ParsePollingRate(byte[] packet)\n        {\n            if (packet[1] == 0x12 && packet[2] == 0x04 && packet[3] == 0x00)\n            {\n                return (PollingRate)packet[9];\n            }\n\n            return PollingRate.PR125Hz;\n        }\n\n        public override int MaxBrightness()\n        {\n            return 4;\n        }\n\n        public override LightingZone[] SupportedLightingZones()\n        {\n            return new LightingZone[] { LightingZone.Logo, LightingZone.Scrollwheel, LightingZone.Underglow };\n        }\n\n        public override bool IsLightingModeSupported(LightingMode lightingMode)\n        {\n            return lightingMode == LightingMode.Static\n                || lightingMode == LightingMode.Breathing\n                || lightingMode == LightingMode.ColorCycle\n                || lightingMode == LightingMode.Rainbow\n                || lightingMode == LightingMode.React\n                || lightingMode == LightingMode.Comet;\n        }\n\n        protected override byte[] GetUpdateLightingModePacket(LightingSetting lightingSetting, LightingZone zone)\n        {\n            // 00 51 28 03 00 00 04 00 ff 40 00 00 00 00 00 00 00 00 00 00\n\n            /*\n             * This mouse uses different speed values for rainbow mode compared to others.\n             * 00 51 28 03 00 03 04 FF 00 00 00 00 [8C] 00 00 00 00\n             * 00 51 28 03 00 03 04 FF 00 00 00 00 [64] 00 00 00 00\n             * 00 51 28 03 00 03 04 FF 00 00 00 00 [3F] 00 00 00 00\n             */\n\n            if (lightingSetting.LightingMode == LightingMode.Rainbow)\n            {\n                byte speed = 0x3F;\n\n                switch (lightingSetting.AnimationSpeed)\n                {\n                    case AnimationSpeed.Slow:\n                        speed = 0x3F;\n                        break;\n                    case AnimationSpeed.Medium:\n                        speed = 0x64;\n                        break;\n                    case AnimationSpeed.Fast:\n                        speed = 0x8C;\n                        break;\n                }\n\n                return new byte[] { reportId, 0x51, 0x28, (byte)zone, 0x00,\n                    IndexForLightingMode(lightingSetting.LightingMode),\n                    (byte)lightingSetting.Brightness,\n                    0xFF, 0x00, 0x00,\n                    (byte)(SupportsAnimationDirection(lightingSetting.LightingMode) ? lightingSetting.AnimationDirection : 0x00),\n                    (byte)((lightingSetting.RandomColor && SupportsRandomColor(lightingSetting.LightingMode)) ? 0x01: 0x00),\n                    (byte)(SupportsAnimationSpeed(lightingSetting.LightingMode) ? speed : 0x00)\n                };\n            }\n\n            return base.GetUpdateLightingModePacket(lightingSetting, zone);\n        }\n\n        protected override byte[] GetReadLightingModePacket(LightingZone zone)\n        {\n            return new byte[] { 0x00, 0x12, 0x03, 0x00 };\n        }\n\n        protected LightingSetting? ParseLightingSetting(byte[] packet, LightingZone zone)\n        {\n            if (packet[1] != 0x12 || packet[2] != 0x03)\n            {\n                return null;\n            }\n\n            int offset = 5 + (((int)zone) * 5);\n\n            LightingSetting setting = new LightingSetting();\n\n            setting.LightingMode = LightingModeForIndex(packet[offset + 0]);\n            setting.Brightness = packet[offset + 1];\n\n            setting.RGBColor = Color.FromArgb(packet[offset + 2], packet[offset + 3], packet[offset + 4]);\n\n\n            return setting;\n        }\n\n        public override void ReadLightingSetting()\n        {\n            if (!HasRGB())\n            {\n                return;\n            }\n            //Mouse sends all lighting zones in one response             (0x19) Direction, Random col, Speed\n            //00 12 03 00 00 [03 04 00 00 00] [03 04 00 00 00] [03 04 00 00 00] 01 [00] [00] [8c] 00\n            //00 12 03 00 00 [00 04 00 00 00] [00 04 00 00 00] [00 04 00 00 00] 01 [00] [00] [00] 00\n            byte[]? response = WriteForResponse(GetReadLightingModePacket(LightingZone.All));\n            if (response is null) return;\n\n            LightingZone[] lz = SupportedLightingZones();\n            for (int i = 0; i < lz.Length; ++i)\n            {\n                LightingSetting? ls = ParseLightingSetting(response, lz[i]);\n                if (ls is null)\n                {\n                    Logger.WriteLine(GetDisplayName() + \": Failed to read RGB Setting for Zone \" + lz[i].ToString());\n                    continue;\n                }\n                ls.AnimationDirection = SupportsAnimationDirection(ls.LightingMode)\n                   ? (AnimationDirection)response[21]\n                   : AnimationDirection.Clockwise;\n\n                ls.RandomColor = SupportsRandomColor(ls.LightingMode) && response[22] == 0x01;\n\n                ls.AnimationSpeed = SupportsAnimationSpeed(ls.LightingMode)\n                    ? (AnimationSpeed)response[23]\n                    : AnimationSpeed.Medium;\n\n                if (ls.AnimationSpeed != AnimationSpeed.Fast\n                    && ls.AnimationSpeed != AnimationSpeed.Medium\n                    && ls.AnimationSpeed != AnimationSpeed.Slow)\n                {\n                    ls.AnimationSpeed = AnimationSpeed.Medium;\n                }\n\n                Logger.WriteLine(GetDisplayName() + \": Read RGB Setting for Zone \" + lz[i].ToString() + \": \" + ls.ToString());\n                LightingSetting[i] = ls;\n            }\n        }\n    }\n}"
  },
  {
    "path": "app/Peripherals/Mouse/Models/PugioII.cs",
    "content": "﻿\nnamespace GHelper.Peripherals.Mouse.Models\n{\n    //P705\n    public class PugioII : AsusMouse\n    {\n        public PugioII() : base(0x0B05, 0x1908, \"mi_00\", true)\n        {\n        }\n\n        protected PugioII(ushort vendorId, bool wireless) : base(0x0B05, vendorId, \"mi_00\", wireless)\n        {\n        }\n        public override int DPIProfileCount()\n        {\n            return 4;\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Pugio II (Wireless)\";\n        }\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR125Hz,\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz\n            };\n        }\n\n\n        public override int ProfileCount()\n        {\n            return 3;\n        }\n        public override int MaxDPI()\n        {\n            return 16_000;\n        }\n\n        public override bool HasDebounceSetting()\n        {\n            return true;\n        }\n        public override bool HasLiftOffSetting()\n        {\n            return true;\n        }\n        public override int DPIIncrements()\n        {\n            return 100;\n        }\n\n        public override bool HasRGB()\n        {\n            return true;\n        }\n        public override int MaxBrightness()\n        {\n            return 4;\n        }\n\n        public override LightingZone[] SupportedLightingZones()\n        {\n            return new LightingZone[] { LightingZone.Logo, LightingZone.Scrollwheel, LightingZone.Underglow };\n        }\n\n        public override bool HasAutoPowerOff()\n        {\n            return true;\n        }\n\n        public override bool HasAngleSnapping()\n        {\n            return true;\n        }\n\n        public override bool HasAngleTuning()\n        {\n            return false;\n        }\n\n        public override bool HasLowBatteryWarning()\n        {\n            return true;\n        }\n\n        public override int LowBatteryWarningStep()\n        {\n            return 25;\n        }\n\n        public override int LowBatteryWarningMax()\n        {\n            return 100;\n        }\n\n        protected override int ParseBattery(byte[] packet)\n        {\n            return base.ParseBattery(packet) * 25;\n        }\n        protected override int ParseLowBatteryWarning(byte[] packet)\n        {\n            return base.ParseLowBatteryWarning(packet) * 25;\n        }\n        protected override byte[] GetUpdateEnergySettingsPacket(int lowBatteryWarning, PowerOffSetting powerOff)\n        {\n            return base.GetUpdateEnergySettingsPacket(lowBatteryWarning / 25, powerOff);\n        }\n        protected override byte[] GetReadLightingModePacket(LightingZone zone)\n        {\n            return new byte[] { 0x00, 0x12, 0x03, 0x00 };\n        }\n\n        protected LightingSetting? ParseLightingSetting(byte[] packet, LightingZone zone)\n        {\n            if (packet[1] != 0x12 || packet[2] != 0x03)\n            {\n                return null;\n            }\n\n            int offset = 5 + (((int)zone) * 5);\n\n            LightingSetting setting = new LightingSetting();\n\n            setting.LightingMode = LightingModeForIndex(packet[offset + 0]);\n            setting.Brightness = packet[offset + 1];\n\n            setting.RGBColor = Color.FromArgb(packet[offset + 2], packet[offset + 3], packet[offset + 4]);\n\n            setting.AnimationDirection = SupportsAnimationDirection(setting.LightingMode)\n                 ? (AnimationDirection)packet[21]\n                 : AnimationDirection.Clockwise;\n\n            if (setting.AnimationDirection != AnimationDirection.Clockwise\n                && setting.AnimationDirection != AnimationDirection.CounterClockwise)\n            {\n                setting.AnimationDirection = AnimationDirection.Clockwise;\n            }\n\n            setting.RandomColor = SupportsRandomColor(setting.LightingMode) && packet[22] == 0x01;\n            setting.AnimationSpeed = SupportsAnimationSpeed(setting.LightingMode)\n                ? (AnimationSpeed)packet[23]\n                : AnimationSpeed.Medium;\n\n            //If the mouse reports an out of range value, which it does when the current setting has no speed option, chose medium as default\n            if (setting.AnimationSpeed != AnimationSpeed.Fast\n                && setting.AnimationSpeed != AnimationSpeed.Medium\n                && setting.AnimationSpeed != AnimationSpeed.Slow)\n            {\n                setting.AnimationSpeed = AnimationSpeed.Medium;\n            }\n            return setting;\n        }\n\n        public override void ReadLightingSetting()\n        {\n            if (!HasRGB())\n            {\n                return;\n            }\n            //Mouse sends all lighting zones in one response\n            //21: Direction\n            //22: Random\n            //23: Speed\n            //                                                                  20 21 22 23\n            //00 12 03 00 00 [03 04 00 00 ff] [03 04 00 00 ff] [03 04 00 00 ff] 00 04 00 00\n            //00 12 03 00 00 [05 02 ff 00 ff] [05 02 ff 00 ff] [05 02 ff 00 ff] 00 01 01 00\n            //00 12 03 00 00 [03 01 00 00 ff] [03 01 00 00 ff] [03 01 00 00 ff] 00 01 00 01\n            byte[]? response = WriteForResponse(GetReadLightingModePacket(LightingZone.All));\n            if (response is null) return;\n\n            LightingZone[] lz = SupportedLightingZones();\n            for (int i = 0; i < lz.Length; ++i)\n            {\n                LightingSetting? ls = ParseLightingSetting(response, lz[i]);\n                if (ls is null)\n                {\n                    Logger.WriteLine(GetDisplayName() + \": Failed to read RGB Setting for Zone \" + lz[i].ToString());\n                    continue;\n                }\n\n                Logger.WriteLine(GetDisplayName() + \": Read RGB Setting for Zone \" + lz[i].ToString() + \": \" + ls.ToString());\n                LightingSetting[i] = ls;\n            }\n        }\n\n        public override bool CanChangeDPIProfile()\n        {\n            return false;\n        }\n    }\n\n\n    public class PugioIIWired : PugioII\n    {\n        public PugioIIWired() : base(0x1906, false)\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Pugio II (Wired)\";\n        }\n    }\n}\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/SpathaX.cs",
    "content": "﻿\nnamespace GHelper.Peripherals.Mouse.Models\n{\n    //SPATHA_WIRELESS\n    public class SpathaX : AsusMouse\n    {\n        public SpathaX() : base(0x0B05, 0x1979, \"mi_00\", true)\n        {\n        }\n\n        protected SpathaX(ushort vendorId, bool wireless) : base(0x0B05, vendorId, \"mi_00\", wireless)\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Spatha X (Wireless)\";\n        }\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz\n            };\n        }\n\n        public override bool HasAngleSnapping()\n        {\n            return true;\n        }\n\n        public override int ProfileCount()\n        {\n            return 5;\n        }\n\n        public override int DPIProfileCount()\n        {\n            return 4;\n        }\n\n        public override int MaxDPI()\n        {\n            return 19_000;\n        }\n\n        public override bool HasXYDPI()\n        {\n            return false;\n        }\n\n        public override bool HasDebounceSetting()\n        {\n            return false;\n        }\n\n        public override bool HasLiftOffSetting()\n        {\n            return true;\n        }\n\n        public override bool HasRGB()\n        {\n            return true;\n        }\n\n        public override LightingZone[] SupportedLightingZones()\n        {\n            return new LightingZone[] { LightingZone.Logo, LightingZone.Scrollwheel, LightingZone.Underglow };\n        }\n\n        public override bool HasAutoPowerOff()\n        {\n            return true;\n        }\n\n        public override bool HasAngleTuning()\n        {\n            return false;\n        }\n\n        public override bool HasLowBatteryWarning()\n        {\n            return true;\n        }\n\n        public override bool HasDPIColors()\n        {\n            return true;\n        }\n    }\n\n    public class SpathaXWired : SpathaX\n    {\n        public SpathaXWired() : base(0x1977, false)\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Spatha X (Wired)\";\n        }\n    }\n}\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/StrixCarry.cs",
    "content": "﻿namespace GHelper.Peripherals.Mouse.Models\n{\n    //P508\n    public class StrixCarry : AsusMouse\n    {\n        public StrixCarry() : base(0x0B05, 0x18B4, \"mi_01\", true)\n        {\n        }\n\n        public override int DPIProfileCount()\n        {\n            return 2;\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Strix Carry (Wireless)\";\n        }\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR125Hz,\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz\n            };\n        }\n\n        public override int ProfileCount()\n        {\n            return 3;\n        }\n        public override int MaxDPI()\n        {\n            return 7_200;\n        }\n        public override int DPIIncrements()\n        {\n            return 50;\n        }\n\n        public override int MinDPI()\n        {\n            return 50;\n        }\n\n        public override bool HasDebounceSetting()\n        {\n            return true;\n        }\n\n        public override bool HasLiftOffSetting()\n        {\n            //Potentially does nothing. AC does not show the setting, but the mouse responds to it and stores it.\n            return true;\n        }\n\n        public override bool HasRGB()\n        {\n            return false;\n        }\n\n        public override bool HasAutoPowerOff()\n        {\n            return true;\n        }\n\n        public override bool HasAngleSnapping()\n        {\n            return true;\n        }\n        public override bool HasXYDPI()\n        {\n            return false;\n        }\n\n        public override bool CanChangeDPIProfile()\n        {\n            return false;\n        }\n\n        //Has 25% increments only.\n        protected override int ParseBattery(byte[] packet)\n        {\n            if (packet[1] == 0x12 && packet[2] == 0x07)\n            {\n                return packet[7] * 25;\n            }\n\n            return -1;\n        }\n\n        protected override PowerOffSetting ParsePowerOffSetting(byte[] packet)\n        {\n            if (packet[1] == 0x12 && packet[2] == 0x07)\n            {\n                return (PowerOffSetting)packet[5];\n            }\n\n            return PowerOffSetting.Never;\n        }\n\n        protected override PollingRate ParsePollingRate(byte[] packet)\n        {\n            if (packet[1] == 0x12 && packet[2] == 0x04 && packet[3] == 0x00)\n            {\n                return (PollingRate)packet[9];\n            }\n\n            return PollingRate.PR125Hz;\n        }\n\n        protected override byte[] GetUpdatePollingRatePacket(PollingRate pollingRate)\n        {\n            return new byte[] { reportId, 0x51, 0x31, 0x02, 0x00, (byte)pollingRate };\n        }\n\n        protected override bool ParseAngleSnapping(byte[] packet)\n        {\n            if (packet[1] == 0x12 && packet[2] == 0x04 && packet[3] == 0x00)\n            {\n                return packet[13] == 0x01;\n            }\n\n            return false;\n        }\n\n        protected override byte[] GetUpdateAngleSnappingPacket(bool angleSnapping)\n        {\n            return new byte[] { reportId, 0x51, 0x31, 0x04, 0x00, (byte)(angleSnapping ? 0x01 : 0x00) };\n        }\n\n        protected override DebounceTime ParseDebounce(byte[] packet)\n        {\n            if (packet[1] != 0x12 || packet[2] != 0x04 || packet[3] != 0x00)\n            {\n                return DebounceTime.MS12;\n            }\n\n            if (packet[11] < 0x02)\n            {\n                return DebounceTime.MS12;\n            }\n\n            if (packet[11] > 0x07)\n            {\n                return DebounceTime.MS32;\n            }\n\n            return (DebounceTime)packet[11];\n        }\n\n        protected override byte[] GetUpdateDebouncePacket(DebounceTime debounce)\n        {\n            return new byte[] { reportId, 0x51, 0x31, 0x03, 0x00, ((byte)debounce) };\n        }\n\n        protected override int ParseProfile(byte[] packet)\n        {\n            if (packet[1] == 0x12 && packet[2] == 0x00 && packet[3] == 0x00)\n            {\n                return packet[10];\n            }\n            Logger.WriteLine(GetDisplayName() + \": Failed to decode active profile\");\n            return 0;\n        }\n\n        protected override int ParseDPIProfile(byte[] packet)\n        {\n            if (packet[1] == 0x12 && packet[2] == 0x00 && packet[3] == 0x00)\n            {\n                return packet[11];\n            }\n            Logger.WriteLine(GetDisplayName() + \": Failed to decode active profile\");\n            return 1;\n        }\n\n        protected override byte[] GetUpdateEnergySettingsPacket(int lowBatteryWarning, PowerOffSetting powerOff)\n        {\n            return new byte[] { 0x00, 0x51, 0x37, 0x00, 0x00, (byte)powerOff, 0x00, (byte)lowBatteryWarning };\n        }\n    }\n}\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/StrixEvolve.cs",
    "content": "﻿namespace GHelper.Peripherals.Mouse.Models\n{\n    public class StrixEvolve : AsusMouse\n    {\n        public StrixEvolve() : base(0x0B05, 0x185B, \"mi_00\", false)\n        {\n        }\n\n\n        public override int DPIProfileCount()\n        {\n            return 2;\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"Strix Evolve\";\n        }\n\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR125Hz,\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz\n            };\n        }\n\n        public override int ProfileCount()\n        {\n            return 2;\n        }\n        public override int MaxDPI()\n        {\n            return 7_200;\n        }\n\n        public override bool HasRGB()\n        {\n            return true;\n        }\n\n        public override bool HasAutoPowerOff()\n        {\n            return false;\n        }\n\n        public override bool HasDebounceSetting()\n        {\n            return true;\n        }\n\n        public override bool HasLowBatteryWarning()\n        {\n            return false;\n        }\n\n        public override bool HasBattery()\n        {\n            return false;\n        }\n\n        public override bool HasDPIColors()\n        {\n            return false;\n        }\n\n        public override bool IsLightingModeSupported(LightingMode lightingMode)\n        {\n            return lightingMode == LightingMode.Static\n                || lightingMode == LightingMode.Breathing\n                || lightingMode == LightingMode.ColorCycle\n                || lightingMode == LightingMode.React;\n        }\n\n        public override LightingZone[] SupportedLightingZones()\n        {\n            return new LightingZone[] { LightingZone.Logo };\n        }\n\n        public override int DPIIncrements()\n        {\n            return 100;\n        }\n\n\n        public override int MinDPI()\n        {\n            return 50;\n        }\n\n        public override bool CanChangeDPIProfile()\n        {\n            return true;\n        }\n\n        public override int MaxBrightness()\n        {\n            return 4;\n        }\n\n        public override bool HasLiftOffSetting()\n        {\n            return true;\n        }\n\n        public override bool HasAngleSnapping()\n        {\n            return true;\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/StrixImpact.cs",
    "content": "﻿namespace GHelper.Peripherals.Mouse.Models\n{\n    //P303\n    public class StrixImpact : AsusMouse\n    {\n        public StrixImpact() : base(0x0B05, 0x1847, \"mi_02\", false)\n        {\n        }\n\n        public StrixImpact(ushort productId, string path) : base(0x0B05, productId, path, false)\n        {\n        }\n\n        public override int DPIProfileCount()\n        {\n            return 2;\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"Strix Impact\";\n        }\n\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR125Hz,\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz\n            };\n        }\n\n        public override int ProfileCount()\n        {\n            return 1;\n        }\n        public override int MaxDPI()\n        {\n            return 5_000;\n        }\n\n        public override bool HasRGB()\n        {\n            return true;\n        }\n\n        public override bool HasAutoPowerOff()\n        {\n            return false;\n        }\n\n        public override bool HasDebounceSetting()\n        {\n            return true;\n        }\n\n        public override bool HasLowBatteryWarning()\n        {\n            return false;\n        }\n\n        public override bool HasBattery()\n        {\n            return false;\n        }\n\n        public override bool HasDPIColors()\n        {\n            return false;\n        }\n\n        public override bool IsLightingModeSupported(LightingMode lightingMode)\n        {\n            return lightingMode == LightingMode.Static\n                || lightingMode == LightingMode.Breathing\n                || lightingMode == LightingMode.ColorCycle\n                || lightingMode == LightingMode.React;\n        }\n\n        public override LightingZone[] SupportedLightingZones()\n        {\n            return new LightingZone[] { LightingZone.Logo };\n        }\n\n        public override int DPIIncrements()\n        {\n            return 50;\n        }\n\n\n\n        public override bool CanChangeDPIProfile()\n        {\n            return true;\n        }\n\n        public override int MaxBrightness()\n        {\n            return 4;\n        }\n\n        protected override byte[] GetUpdateLightingModePacket(LightingSetting lightingSetting, LightingZone zone)\n        {\n            /*\n             * 51 28 00 00 [00] [04] [35 04 FF] 00 00 00 00 00 00 00\n             */\n\n            return new byte[] { reportId, 0x51, 0x28, 0x00, 0x00,\n                IndexForLightingMode(lightingSetting.LightingMode),\n                (byte)lightingSetting.Brightness,\n                lightingSetting.RGBColor.R, lightingSetting.RGBColor.G, lightingSetting.RGBColor.B\n            };\n        }\n\n        protected override byte[] GetReadLightingModePacket(LightingZone zone)\n        {\n            return new byte[] { 0x00, 0x12, 0x03, 0x00 };\n        }\n\n        protected LightingSetting? ParseLightingSetting(byte[] packet, LightingZone zone)\n        {\n            if (packet[1] != 0x12 || packet[2] != 0x03)\n            {\n                return null;\n            }\n\n            int offset = 5 + (((int)zone) * 5);\n\n            LightingSetting setting = new LightingSetting();\n\n            setting.LightingMode = LightingModeForIndex(packet[offset + 0]);\n            setting.Brightness = packet[offset + 1];\n\n            setting.RGBColor = Color.FromArgb(packet[offset + 2], packet[offset + 3], packet[offset + 4]);\n\n\n            return setting;\n        }\n\n        public override void ReadLightingSetting()\n        {\n            if (!HasRGB())\n            {\n                return;\n            }\n            //Mouse sends all lighting zones in one response                       Direction, Random col, Speed\n            //00 12 03 00 00 [00 04 ff 00 80] [00 04 00 ff ff] [00 04 ff ff ff] 00 [00] [00] [00] 00 00 \n            //00 12 03 00 00 [03 04 00 00 00] [03 04 00 00 00] [03 04 00 00 00] 00 [00] [00] [07] 00 00\n            byte[]? response = WriteForResponse(GetReadLightingModePacket(LightingZone.All));\n            if (response is null) return;\n\n            LightingZone[] lz = SupportedLightingZones();\n            for (int i = 0; i < lz.Length; ++i)\n            {\n                LightingSetting? ls = ParseLightingSetting(response, lz[i]);\n                if (ls is null)\n                {\n                    Logger.WriteLine(GetDisplayName() + \": Failed to read RGB Setting for Zone \" + lz[i].ToString());\n                    continue;\n                }\n                ls.AnimationDirection = SupportsAnimationDirection(ls.LightingMode)\n                   ? (AnimationDirection)response[21]\n                   : AnimationDirection.Clockwise;\n\n                ls.RandomColor = SupportsRandomColor(ls.LightingMode) && response[22] == 0x01;\n\n                ls.AnimationSpeed = SupportsAnimationSpeed(ls.LightingMode)\n                    ? (AnimationSpeed)response[23]\n                    : AnimationSpeed.Medium;\n\n                if (ls.AnimationSpeed != AnimationSpeed.Fast\n                    && ls.AnimationSpeed != AnimationSpeed.Medium\n                    && ls.AnimationSpeed != AnimationSpeed.Slow)\n                {\n                    ls.AnimationSpeed = AnimationSpeed.Medium;\n                }\n\n                Logger.WriteLine(GetDisplayName() + \": Read RGB Setting for Zone \" + lz[i].ToString() + \": \" + ls.ToString());\n                LightingSetting[i] = ls;\n            }\n        }\n\n\n\n        protected override PollingRate ParsePollingRate(byte[] packet)\n        {\n            if (packet[1] == 0x12 && packet[2] == 0x04 && packet[3] == 0x00)\n            {\n                return (PollingRate)packet[9];\n            }\n\n            return PollingRate.PR125Hz;\n        }\n\n        protected override byte[] GetUpdatePollingRatePacket(PollingRate pollingRate)\n        {\n            return new byte[] { reportId, 0x51, 0x31, 0x02, 0x00, (byte)pollingRate };\n        }\n\n        protected override bool ParseAngleSnapping(byte[] packet)\n        {\n            if (packet[1] == 0x12 && packet[2] == 0x04 && packet[3] == 0x00)\n            {\n                return packet[13] == 0x01;\n            }\n\n            return false;\n        }\n\n        protected override byte[] GetUpdateAngleSnappingPacket(bool angleSnapping)\n        {\n            return new byte[] { reportId, 0x51, 0x31, 0x04, 0x00, (byte)(angleSnapping ? 0x01 : 0x00) };\n        }\n\n        protected override DebounceTime ParseDebounce(byte[] packet)\n        {\n            if (packet[1] != 0x12 || packet[2] != 0x04 || packet[3] != 0x00)\n            {\n                return DebounceTime.MS12;\n            }\n\n            if (packet[11] < 0x02)\n            {\n                return DebounceTime.MS12;\n            }\n\n            if (packet[11] > 0x07)\n            {\n                return DebounceTime.MS32;\n            }\n\n            return (DebounceTime)packet[11];\n        }\n\n        protected override byte[] GetUpdateDebouncePacket(DebounceTime debounce)\n        {\n            return new byte[] { reportId, 0x51, 0x31, 0x03, 0x00, ((byte)debounce) };\n        }\n    }\n\n}\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/StrixImpactII.cs",
    "content": "﻿namespace GHelper.Peripherals.Mouse.Models\n{\n    //P506\n    public class StrixImpactII : AsusMouse\n    {\n        public StrixImpactII() : base(0x0B05, 0x18E1, \"mi_00\", false)\n        {\n        }\n\n        public StrixImpactII(ushort pid) : base(0x0B05, pid, \"mi_00\", false)\n        {\n        }\n\n        public override int DPIProfileCount()\n        {\n            return 4;\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Strix Impact II\";\n        }\n\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR125Hz,\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz\n            };\n        }\n\n        public override int ProfileCount()\n        {\n            return 3;\n        }\n        public override int MaxDPI()\n        {\n            return 6_200;\n        }\n\n        public override bool HasRGB()\n        {\n            return true;\n        }\n\n        public override bool HasAutoPowerOff()\n        {\n            return false;\n        }\n\n        public override bool HasAngleSnapping()\n        {\n            return true;\n        }\n\n        public override bool HasAngleTuning()\n        {\n            return false;\n        }\n\n        public override bool HasDebounceSetting()\n        {\n            return true;\n        }\n\n        public override bool HasLowBatteryWarning()\n        {\n            return false;\n        }\n\n        public override bool HasBattery()\n        {\n            return false;\n        }\n\n        public override bool HasDPIColors()\n        {\n            return false;\n        }\n\n        public override bool IsLightingModeSupported(LightingMode lightingMode)\n        {\n            return lightingMode == LightingMode.Static\n                || lightingMode == LightingMode.Breathing\n                || lightingMode == LightingMode.ColorCycle\n                || lightingMode == LightingMode.React;\n        }\n\n        public override LightingZone[] SupportedLightingZones()\n        {\n            return new LightingZone[] { LightingZone.Logo, LightingZone.Scrollwheel, LightingZone.Underglow };\n        }\n\n        public override int DPIIncrements()\n        {\n            return 100;\n        }\n\n        public override bool CanChangeDPIProfile()\n        {\n            return true;\n        }\n\n        public override int MaxBrightness()\n        {\n            return 4;\n        }\n\n        protected override byte IndexForLightingMode(LightingMode lightingMode)\n        {\n            if (lightingMode == LightingMode.React)\n            {\n                return 0x03;\n            }\n\n            return ((byte)lightingMode);\n        }\n        protected override LightingMode LightingModeForIndex(byte lightingMode)\n        {\n            if (lightingMode == 0x03)\n            {\n                return LightingMode.React;\n            }\n            return base.LightingModeForIndex(lightingMode);\n        }\n\n        protected override byte[] GetReadLightingModePacket(LightingZone zone)\n        {\n            return new byte[] { 0x00, 0x12, 0x03, 0x00 };\n        }\n\n        protected LightingSetting? ParseLightingSetting(byte[] packet, LightingZone zone)\n        {\n            if (packet[1] != 0x12 || packet[2] != 0x03)\n            {\n                return null;\n            }\n\n            int offset = 5 + (((int)zone) * 5);\n\n            LightingSetting setting = new LightingSetting();\n\n            setting.LightingMode = LightingModeForIndex(packet[offset + 0]);\n            setting.Brightness = packet[offset + 1];\n\n            setting.RGBColor = Color.FromArgb(packet[offset + 2], packet[offset + 3], packet[offset + 4]);\n\n\n            return setting;\n        }\n\n        public override void ReadLightingSetting()\n        {\n            if (!HasRGB())\n            {\n                return;\n            }\n            //Mouse sends all lighting zones in one response\n            //00 12 03 00 00 [00 04 ff 00 80] [00 04 00 ff ff] [00 04 ff ff ff] 00 00 00 00 00 00 00 00 00 00 00 00 00 0\n            byte[]? response = WriteForResponse(GetReadLightingModePacket(LightingZone.All));\n            if (response is null) return;\n\n            LightingZone[] lz = SupportedLightingZones();\n            for (int i = 0; i < lz.Length; ++i)\n            {\n                LightingSetting? ls = ParseLightingSetting(response, lz[i]);\n                if (ls is null)\n                {\n                    Logger.WriteLine(GetDisplayName() + \": Failed to read RGB Setting for Zone \" + lz[i].ToString());\n                    continue;\n                }\n\n                Logger.WriteLine(GetDisplayName() + \": Read RGB Setting for Zone \" + lz[i].ToString() + \": \" + ls.ToString());\n                LightingSetting[i] = ls;\n            }\n        }\n    }\n\n    public class StrixImpactIIElectroPunk : StrixImpactII\n    {\n\n        public StrixImpactIIElectroPunk() : base(0x1956)\n        {\n\n        }\n\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Strix Impact II Electro Punk\";\n        }\n    }\n}\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/StrixImpactIII.cs",
    "content": "﻿namespace GHelper.Peripherals.Mouse.Models\n{\n    //P518\n    public class StrixImpactIII : AsusMouse\n    {\n        public StrixImpactIII() : base(0x0B05, 0x1A88, \"mi_00\", false)\n        {\n        }\n\n\n        public override int DPIProfileCount()\n        {\n            return 4;\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Strix Impact III\";\n        }\n\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR125Hz,\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz\n            };\n        }\n\n        public override int ProfileCount()\n        {\n            return 3;\n        }\n\n        public override int MaxDPI()\n        {\n            return 12_000;\n        }\n\n        public override bool HasRGB()\n        {\n            return true;\n        }\n\n        public override LightingZone[] SupportedLightingZones()\n        {\n            return new LightingZone[] { LightingZone.Logo, LightingZone.Scrollwheel };\n        }\n\n        public override bool IsLightingModeSupported(LightingMode lightingMode)\n        {\n            return lightingMode == LightingMode.Static\n                || lightingMode == LightingMode.Breathing\n                || lightingMode == LightingMode.ColorCycle\n                || lightingMode == LightingMode.React\n                || lightingMode == LightingMode.Off;\n        }\n\n\n        public override bool HasBattery()\n        {\n            return false;\n        }\n\n        public override bool HasAngleSnapping()\n        {\n            return true;\n        }\n\n        public override bool HasLowBatteryWarning()\n        {\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/StrixImpactIIIWireless.cs",
    "content": "﻿namespace GHelper.Peripherals.Mouse.Models\n{\n    //P520\n    public class StrixImpactIIIWirelessOmni : AsusMouse\n    {\n\n        public StrixImpactIIIWirelessOmni() : base(0x0B05, 0x1ACE, \"mi_02&col03\", true, 0x03)\n        {\n        }\n\n        public override int DPIProfileCount()\n        {\n            return 4;\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"Strix Impact III Wireless (OMNI)\";\n        }\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR125Hz,\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz\n            };\n        }\n\n        public override int ProfileCount()\n        {\n            return 5;\n        }\n        public override int MaxDPI()\n        {\n            return 36_000;\n        }\n\n        public override bool HasXYDPI()\n        {\n            return true;\n        }\n\n        public override bool HasLiftOffSetting()\n        {\n            return true;\n        }\n\n        public override bool HasRGB()\n        {\n            return true;\n        }\n\n        public override LightingZone[] SupportedLightingZones()\n        {\n            return new LightingZone[] { LightingZone.Scrollwheel };\n        }\n\n        public override bool IsLightingModeSupported(LightingMode lightingMode)\n        {\n            return lightingMode == LightingMode.Static\n                || lightingMode == LightingMode.Breathing\n                || lightingMode == LightingMode.ColorCycle\n                || lightingMode == LightingMode.React\n                || lightingMode == LightingMode.BatteryState\n                || lightingMode == LightingMode.Off;\n        }\n\n        public override bool HasAutoPowerOff()\n        {\n            return true;\n        }\n\n        public override bool HasAngleSnapping()\n        {\n            return true;\n        }\n\n        public override bool HasAngleTuning()\n        {\n            return true;\n        }\n\n        public override bool HasLowBatteryWarning()\n        {\n            return true;\n        }\n\n        public override bool HasDPIColors()\n        {\n            return true;\n        }\n\n        public override int AngleTuningStep()\n        {\n            return 5;\n        }\n\n        public override int USBPacketSize()\n        {\n            return 64;\n        }\n    }\n}\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/StrixImpactIIWireless.cs",
    "content": "﻿namespace GHelper.Peripherals.Mouse.Models\n{\n    //P513\n    public class StrixImpactIIWireless : AsusMouse\n    {\n        public StrixImpactIIWireless() : base(0x0B05, 0x1949, \"mi_00\", true)\n        {\n        }\n\n        protected StrixImpactIIWireless(ushort vendorId, bool wireless) : base(0x0B05, vendorId, \"mi_00\", wireless)\n        {\n        }\n\n        public override int DPIProfileCount()\n        {\n            return 4;\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Strix Impact II (Wireless)\";\n        }\n\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR125Hz,\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz\n            };\n        }\n\n        public override int ProfileCount()\n        {\n            return 3;\n        }\n        public override int MaxDPI()\n        {\n            return 16_000;\n        }\n\n        public override bool HasLiftOffSetting()\n        {\n            return true;\n        }\n\n        public override bool HasRGB()\n        {\n            return true;\n        }\n\n        public override bool HasAutoPowerOff()\n        {\n            return true;\n        }\n\n        public override bool HasAngleSnapping()\n        {\n            return true;\n        }\n\n        public override bool HasAngleTuning()\n        {\n            return false;\n        }\n\n        public override bool HasLowBatteryWarning()\n        {\n            return true;\n        }\n\n        public override bool HasDPIColors()\n        {\n            return false;\n        }\n\n        public override bool IsLightingModeSupported(LightingMode lightingMode)\n        {\n            return lightingMode == LightingMode.Static\n                || lightingMode == LightingMode.Breathing\n                || lightingMode == LightingMode.ColorCycle\n                || lightingMode == LightingMode.React\n                || lightingMode == LightingMode.BatteryState\n                || lightingMode == LightingMode.Off;\n        }\n\n        public override LightingZone[] SupportedLightingZones()\n        {\n            return new LightingZone[] { LightingZone.Logo, LightingZone.Scrollwheel };\n        }\n\n        //Has 25% increments\n        protected override int ParseBattery(byte[] packet)\n        {\n            if (packet[1] == 0x12 && packet[2] == 0x07)\n            {\n                return packet[5] * 25;\n            }\n\n            return -1;\n        }\n\n\n        public override int DPIIncrements()\n        {\n            return 100;\n        }\n\n        public override bool CanChangeDPIProfile()\n        {\n            return false;\n        }\n\n        protected override byte[] GetUpdateEnergySettingsPacket(int lowBatteryWarning, PowerOffSetting powerOff)\n        {\n            return base.GetUpdateEnergySettingsPacket(lowBatteryWarning / 25, powerOff);\n        }\n\n        protected override int ParseLowBatteryWarning(byte[] packet)\n        {\n            int lowBat = base.ParseLowBatteryWarning(packet);\n\n            return lowBat * 25;\n        }\n\n        protected override LiftOffDistance ParseLiftOffDistance(byte[] packet)\n        {\n            if (packet[1] != 0x12 || packet[2] != 0x06)\n            {\n                return LiftOffDistance.Low;\n            }\n\n            return (LiftOffDistance)packet[5];\n        }\n\n        protected override byte[] GetUpdateLiftOffDistancePacket(LiftOffDistance liftOffDistance)\n        {\n            return new byte[] { 0x00, 0x51, 0x35, 0x00, 0x00, ((byte)liftOffDistance) };\n        }\n\n        public override int MaxBrightness()\n        {\n            return 4;\n        }\n\n        public override bool HasDebounceSetting()\n        {\n            return true;\n        }\n\n        protected override byte IndexForLightingMode(LightingMode lightingMode)\n        {\n            if (lightingMode == LightingMode.Off)\n            {\n                return 0xFF;\n            }\n            return ((byte)lightingMode);\n        }\n\n        protected override byte[] GetReadLightingModePacket(LightingZone zone)\n        {\n            return new byte[] { 0x00, 0x12, 0x03, 0x00 };\n        }\n\n        protected LightingSetting? ParseLightingSetting(byte[] packet, LightingZone zone)\n        {\n            if (packet[1] != 0x12 || packet[2] != 0x03)\n            {\n                return null;\n            }\n\n            int offset = 5 + (((int)zone) * 5);\n\n            LightingSetting setting = new LightingSetting();\n\n            setting.LightingMode = LightingModeForIndex(packet[offset + 0]);\n            setting.Brightness = packet[offset + 1];\n\n            setting.RGBColor = Color.FromArgb(packet[offset + 2], packet[offset + 3], packet[offset + 4]);\n\n\n            return setting;\n        }\n\n        public override void ReadLightingSetting()\n        {\n            if (!HasRGB())\n            {\n                return;\n            }\n            //Mouse sends all lighting zones in one response\n            //00 12 03 00 00 [00 04 ff 00 80] [00 04 00 ff ff] [00 04 ff ff ff] 00 00 00 00 00 00 00 00 00 00 00 00 00 0\n            //No idea what the 3rd zone is as the mouse only has 2\n            byte[]? response = WriteForResponse(GetReadLightingModePacket(LightingZone.All));\n            if (response is null) return;\n\n            LightingZone[] lz = SupportedLightingZones();\n            for (int i = 0; i < lz.Length; ++i)\n            {\n                LightingSetting? ls = ParseLightingSetting(response, lz[i]);\n                if (ls is null)\n                {\n                    Logger.WriteLine(GetDisplayName() + \": Failed to read RGB Setting for Zone \" + lz[i].ToString());\n                    continue;\n                }\n\n                Logger.WriteLine(GetDisplayName() + \": Read RGB Setting for Zone \" + lz[i].ToString() + \": \" + ls.ToString());\n                LightingSetting[i] = ls;\n            }\n        }\n    }\n\n    public class StrixImpactIIWirelessWired : StrixImpactIIWireless\n    {\n        public StrixImpactIIWirelessWired() : base(0x1947, false)\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"ROG Strix Impact II (Wired)\";\n        }\n    }\n}\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/TUFM3.cs",
    "content": "﻿namespace GHelper.Peripherals.Mouse.Models\n{\n    //P306_Wireless\n    public class TUFM3 : AsusMouse\n    {\n        public TUFM3() : base(0x0B05, 0x1910, \"mi_01\", false)\n        {\n        }\n\n        public TUFM3(ushort productId, string path) : base(0x0B05, productId, path, false)\n        {\n        }\n\n        public override int DPIProfileCount()\n        {\n            return 4;\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"TUF GAMING M3\";\n        }\n\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR125Hz,\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz\n            };\n        }\n\n        //Mouse has React mapped to 0x03 instead of 0x04 like other mice\n        protected override byte IndexForLightingMode(LightingMode lightingMode)\n        {\n            if (lightingMode == LightingMode.React)\n            {\n                return 0x03;\n            }\n            return ((byte)lightingMode);\n        }\n\n        //Mouse has React mapped to 0x03 instead of 0x04 like other mice\n        protected override LightingMode LightingModeForIndex(byte lightingMode)\n        {\n            if (lightingMode == 0x03)\n            {\n                return LightingMode.React;\n            }\n            return base.LightingModeForIndex(lightingMode);\n\n        }\n\n        public override int ProfileCount()\n        {\n            return 1;\n        }\n        public override int MaxDPI()\n        {\n            return 7_000;\n        }\n        public override bool HasBattery()\n        {\n            return false;\n        }\n\n        public override bool HasLiftOffSetting()\n        {\n            return false;\n        }\n        public override LightingZone[] SupportedLightingZones()\n        {\n            return new LightingZone[] { LightingZone.Logo };\n        }\n\n        public override bool HasRGB()\n        {\n            return true;\n        }\n\n        public override bool HasAngleSnapping()\n        {\n            return true;\n        }\n\n        public override int DPIIncrements()\n        {\n            return 100;\n        }\n\n        public override bool CanChangeDPIProfile()\n        {\n            return true;\n        }\n\n        public override bool HasDebounceSetting()\n        {\n            return true;\n        }\n\n        public override int MaxBrightness()\n        {\n            return 4;\n        }\n\n        public override bool IsLightingModeSupported(LightingMode lightingMode)\n        {\n            return lightingMode == LightingMode.Static\n                || lightingMode == LightingMode.Breathing\n                || lightingMode == LightingMode.ColorCycle\n                || lightingMode == LightingMode.React;\n        }\n    }\n\n    public class TUFM3GenII : TUFM3\n    {\n        public TUFM3GenII() : base(0x1A9B, \"mi_02\")\n        {\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"TUF GAMING M3 (Gen II)\";\n        }\n\n        public override int MaxBrightness()\n        {\n            return 100;\n        }\n\n        public override int MaxDPI()\n        {\n            return 8_000;\n        }\n\n        public override int MinDPI()\n        {\n            return 100;\n        }\n\n        public override int DPIIncrements()\n        {\n            return 50;\n        }\n\n        public override bool HasDPIColors()\n        {\n            return true;\n        }\n\n        protected override int ParseDPIProfile(byte[] packet)\n        {\n            return base.ParseDPIProfile(packet) + 1;\n        }\n\n        protected override byte[] GetChangeDPIProfilePacket(int profile)\n        {\n            return new byte[] { reportId, 0x51, 0x31, 0x0A, 0x00, 0x04 };\n        }\n\n        protected override byte[] GetChangeDPIProfilePacket2(int profile)\n        {\n            return new byte[] { reportId, 0x51, 0x31, 0x09, 0x00, (byte)(profile - 1) };\n        }\n\n    }\n}\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/TUFM4Air.cs",
    "content": "﻿namespace GHelper.Peripherals.Mouse.Models\n{\n    //P307\n    public class TUFM4Air : AsusMouse\n    {\n        public TUFM4Air() : base(0x0B05, 0x1A03, \"mi_00\", false)\n        {\n        }\n\n        public override int DPIProfileCount()\n        {\n            return 4;\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"TUF GAMING M4 Air\";\n        }\n\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR125Hz,\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz\n            };\n        }\n\n        public override int ProfileCount()\n        {\n            return 3;\n        }\n        public override int MaxDPI()\n        {\n            return 16_000;\n        }\n\n        public override bool HasLiftOffSetting()\n        {\n            return true;\n        }\n\n        public override bool HasAngleSnapping()\n        {\n            return true;\n        }\n\n        public override bool HasAngleTuning()\n        {\n            return false;\n        }\n\n        public override bool HasBattery()\n        {\n            return false;\n        }\n\n        public override int DPIIncrements()\n        {\n            return 100;\n        }\n    }\n\n}\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/TUFM4Wireless.cs",
    "content": "﻿namespace GHelper.Peripherals.Mouse.Models\n{\n    //P306_Wireless\n    public class TUFM4Wirelss : AsusMouse\n    {\n        public TUFM4Wirelss() : base(0x0B05, 0x19F4, \"mi_00\", true)\n        {\n        }\n\n        public TUFM4Wirelss(ushort productId, bool wireless) : base(0x0B05, productId, \"mi_00\", wireless)\n        {\n        }\n\n        public override int DPIProfileCount()\n        {\n            return 4;\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"TUF GAMING M4 (Wireless)\";\n        }\n\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR125Hz,\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz\n            };\n        }\n\n        public override int ProfileCount()\n        {\n            return 3;\n        }\n        public override int MaxDPI()\n        {\n            return 12_000;\n        }\n\n        public override bool HasLiftOffSetting()\n        {\n            return false;\n        }\n\n        public override bool HasDebounceSetting()\n        {\n            return true;\n        }\n\n        public override bool HasAutoPowerOff()\n        {\n            return true;\n        }\n\n        public override bool HasAngleSnapping()\n        {\n            return true;\n        }\n\n        public override bool HasAngleTuning()\n        {\n            return false;\n        }\n\n        public override bool HasLowBatteryWarning()\n        {\n            return true;\n        }\n\n        public override bool HasDPIColors()\n        {\n            return false;\n        }\n\n        public override int DPIIncrements()\n        {\n            return 100;\n        }\n\n        public override bool CanChangeDPIProfile()\n        {\n            return true;\n        }\n    }\n\n    //P310\n    public class TUFM4WirelssCN : TUFM4Wirelss\n    {\n        public TUFM4WirelssCN() : base(0x1A8D, true)\n        {\n\n        }\n\n\n        public override string GetDisplayName()\n        {\n            return \"TX GAMING MOUSE (Wireless)\";\n        }\n    }\n\n    //P519_Wireless\n    public class TXGamingMini : TUFM4Wirelss\n    {\n        public TXGamingMini() : base(0x1AF5, true)\n        {\n        }\n\n        public TXGamingMini(ushort productId, bool wireless) : base(productId, wireless)\n        {\n        }\n\n        public override int DPIIncrements()\n        {\n            return 50;\n        }\n\n\n        public override string GetDisplayName()\n        {\n            return \"TX GAMING MOUSE Mini (Wireless)\";\n        }\n\n        public override bool HasXYDPI()\n        {\n            return true;\n        }\n\n    }\n\n    //P519_Wired\n    public class TXGamingMiniWired : TXGamingMini\n    {\n        public TXGamingMiniWired() : base(0x1AF3, false)\n        {\n        }\n\n        public override int DPIIncrements()\n        {\n            return 50;\n        }\n\n\n        public override string GetDisplayName()\n        {\n            return \"TX GAMING MOUSE Mini (Wired)\";\n        }\n\n    }\n}\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/TUFM5.cs",
    "content": "﻿namespace GHelper.Peripherals.Mouse.Models\n{\n    //P304\n    public class TUFM5 : AsusMouse\n    {\n        public TUFM5() : base(0x0B05, 0x1898, \"mi_02\", false)\n        {\n        }\n\n        public override int DPIProfileCount()\n        {\n            return 2;\n        }\n\n        public override string GetDisplayName()\n        {\n            return \"TUF GAMING M5\";\n        }\n\n\n        public override PollingRate[] SupportedPollingrates()\n        {\n            return new PollingRate[] {\n                PollingRate.PR125Hz,\n                PollingRate.PR250Hz,\n                PollingRate.PR500Hz,\n                PollingRate.PR1000Hz\n            };\n        }\n\n        //Mouse has React mapped to 0x03 instead of 0x04 like other mice\n        protected override byte IndexForLightingMode(LightingMode lightingMode)\n        {\n            if (lightingMode == LightingMode.React)\n            {\n                return 0x03;\n            }\n            return ((byte)lightingMode);\n        }\n\n        //Mouse has React mapped to 0x03 instead of 0x04 like other mice\n        protected override LightingMode LightingModeForIndex(byte lightingMode)\n        {\n            if (lightingMode == 0x03)\n            {\n                return LightingMode.React;\n            }\n            return base.LightingModeForIndex(lightingMode);\n\n        }\n\n        public override int ProfileCount()\n        {\n            return 3;\n        }\n        public override int MaxDPI()\n        {\n            return 6_200;\n        }\n        public override bool HasBattery()\n        {\n            return false;\n        }\n\n        public override bool HasLiftOffSetting()\n        {\n            return false;\n        }\n        public override LightingZone[] SupportedLightingZones()\n        {\n            return new LightingZone[] { LightingZone.Logo };\n        }\n\n        public override bool HasRGB()\n        {\n            return true;\n        }\n\n        public override bool HasAngleSnapping()\n        {\n            return true;\n        }\n\n        public override int DPIIncrements()\n        {\n            return 100;\n        }\n\n        public override bool CanChangeDPIProfile()\n        {\n            return true;\n        }\n\n        public override bool HasDebounceSetting()\n        {\n            return true;\n        }\n\n        public override int MaxBrightness()\n        {\n            return 4;\n        }\n\n        public override bool IsLightingModeSupported(LightingMode lightingMode)\n        {\n            return lightingMode == LightingMode.Static\n                || lightingMode == LightingMode.Breathing\n                || lightingMode == LightingMode.ColorCycle\n                || lightingMode == LightingMode.React;\n        }\n\n\n        protected override byte[] GetUpdatePollingRatePacket(PollingRate pollingRate)\n        {\n            return new byte[] { reportId, 0x51, 0x31, 0x02, 0x00, (byte)pollingRate };\n        }\n\n        protected override byte[] GetUpdateAngleSnappingPacket(bool angleSnapping)\n        {\n            return new byte[] { reportId, 0x51, 0x31, 0x04, 0x00, (byte)(angleSnapping ? 0x01 : 0x00) };\n        }\n\n        protected override PollingRate ParsePollingRate(byte[] packet)\n        {\n\n            if (packet[1] == 0x12 && packet[2] == 0x04 && packet[3] == 0x00)\n            {\n                return (PollingRate)packet[9];\n            }\n\n            return PollingRate.PR125Hz;\n        }\n\n        protected override bool ParseAngleSnapping(byte[] packet)\n        {\n\n            if (packet[1] == 0x12 && packet[2] == 0x04 && packet[3] == 0x00)\n            {\n                return packet[13] == 0x01;\n            }\n\n            return false;\n        }\n\n        protected override byte[] GetUpdateDebouncePacket(DebounceTime debounce)\n        {\n            return new byte[] { reportId, 0x51, 0x31, 0x03, 0x00, ((byte)debounce) };\n        }\n\n        protected override DebounceTime ParseDebounce(byte[] packet)\n        {\n            if (packet[1] != 0x12 || packet[2] != 0x04 || packet[3] != 0x00)\n            {\n                return DebounceTime.MS12;\n            }\n\n            if (packet[11] < 0x02)\n            {\n                return DebounceTime.MS12;\n            }\n\n            if (packet[11] > 0x07)\n            {\n                return DebounceTime.MS32;\n            }\n\n            return (DebounceTime)packet[11];\n        }\n    }\n}\n"
  },
  {
    "path": "app/Peripherals/PeripheralsProvider.cs",
    "content": "﻿using GHelper.Peripherals.Mouse;\nusing GHelper.Peripherals.Mouse.Models;\nusing HidSharp;\nusing System.IO;\nusing System.Runtime.CompilerServices;\nusing System.Text;\n\nnamespace GHelper.Peripherals\n{\n    public class PeripheralsProvider\n    {\n        private static readonly object _LOCK = new object();\n\n        public static List<AsusMouse> ConnectedMice = new List<AsusMouse>();\n\n        public static event EventHandler? DeviceChanged;\n\n        private static System.Timers.Timer timer = new System.Timers.Timer(1000);\n\n        static PeripheralsProvider()\n        {\n            timer.Elapsed += DeviceTimer_Elapsed;\n        }\n\n\n        private static long lastRefresh;\n\n        public static bool IsMouseConnected()\n        {\n            lock (_LOCK)\n            {\n                return ConnectedMice.Count > 0;\n            }\n        }\n\n        public static bool IsDeviceConnected(IPeripheral peripheral)\n        {\n            return AllPeripherals().Contains(peripheral);\n        }\n\n        //Expand if keyboards or other device get supported later.\n        public static bool IsAnyPeripheralConnect()\n        {\n            return IsMouseConnected();\n        }\n\n        public static List<IPeripheral> AllPeripherals()\n        {\n            List<IPeripheral> l = new List<IPeripheral>();\n            lock (_LOCK)\n            {\n                l.AddRange(ConnectedMice);\n            }\n            return l;\n        }\n\n        public static void RefreshBatteryForAllDevices()\n        {\n            RefreshBatteryForAllDevices(false);\n        }\n\n        public static void RefreshBatteryForAllDevices(bool force)\n        {\n            //Polling the battery every 20s should be enough\n            if (!force && Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastRefresh) < 20_000) return;\n            lastRefresh = DateTimeOffset.Now.ToUnixTimeMilliseconds();\n\n            List<IPeripheral> l = AllPeripherals();\n\n            foreach (IPeripheral m in l)\n            {\n                if (!m.IsDeviceReady)\n                {\n                    //Try to sync the device if that hasn't been done yet\n                    m.SynchronizeDevice();\n                }\n                else\n                {\n                    m.ReadBattery();\n                }\n            }\n        }\n\n        public static void Disconnect(AsusMouse am)\n        {\n            lock (_LOCK)\n            {\n                am.Disconnect -= Mouse_Disconnect;\n                am.MouseReadyChanged -= MouseReadyChanged;\n                am.BatteryUpdated -= BatteryUpdated;\n                ConnectedMice.Remove(am);\n            }\n            if (DeviceChanged is not null)\n            {\n                DeviceChanged(am, EventArgs.Empty);\n            }\n        }\n\n        public static void Connect(AsusMouse am)\n        {\n\n            if (IsDeviceConnected(am))\n            {\n                //Mouse already connected;\n                return;\n            }\n\n            try\n            {\n                am.Connect();\n            }\n            catch (IOException e)\n            {\n                Logger.WriteLine(am.GetDisplayName() + \" failed to connect to device: \" + e);\n                return;\n            }\n\n            //The Mouse might needs a few ms to register all its subdevices or the sync will fail.\n            //Retry 3 times. Do not call this on main thread! It would block the UI\n\n            int tries = 0;\n            while (!am.IsDeviceReady && tries < 3)\n            {\n                Thread.Sleep(250);\n                Logger.WriteLine(am.GetDisplayName() + \" synchronising. Try \" + (tries + 1));\n                am.SynchronizeDevice();\n                ++tries;\n            }\n\n            lock (_LOCK)\n            {\n                ConnectedMice.Add(am);\n            }\n            Logger.WriteLine(am.GetDisplayName() + \" added to the list: \" + ConnectedMice.Count + \" device are conneted.\");\n\n\n            am.Disconnect += Mouse_Disconnect;\n            am.MouseReadyChanged += MouseReadyChanged;\n            am.BatteryUpdated += BatteryUpdated;\n            if (DeviceChanged is not null)\n            {\n                DeviceChanged(am, EventArgs.Empty);\n            }\n            UpdateSettingsView();\n        }\n\n        private static void BatteryUpdated(object? sender, EventArgs e)\n        {\n            UpdateSettingsView();\n        }\n\n        private static void MouseReadyChanged(object? sender, EventArgs e)\n        {\n            UpdateSettingsView();\n        }\n\n        private static void Mouse_Disconnect(object? sender, EventArgs e)\n        {\n            if (sender is null)\n            {\n                return;\n            }\n\n            AsusMouse am = (AsusMouse)sender;\n            lock (_LOCK)\n            {\n                ConnectedMice.Remove(am);\n            }\n\n            Logger.WriteLine(am.GetDisplayName() + \" reported disconnect. \" + ConnectedMice.Count + \" device are conneted.\");\n            am.Dispose();\n\n            UpdateSettingsView();\n        }\n\n\n        private static void UpdateSettingsView()\n        {\n            Program.settingsForm.Invoke(delegate\n            {\n                Program.settingsForm.VisualizePeripherals();\n            });\n        }\n\n        [MethodImpl(MethodImplOptions.Synchronized)]\n        public static void DetectAllAsusMice()\n        {\n            //Add one line for every supported mouse class here to support them.\n            DedectOmniMouse();\n            DetectMouse(new ChakramX());\n            DetectMouse(new ChakramXWired());\n            DetectMouse(new GladiusIIIAimpoint());\n            DetectMouse(new GladiusIIIAimpointWired());\n            DetectMouse(new GladiusIIOrigin());\n            DetectMouse(new GladiusIIOriginPink());\n            DetectMouse(new GladiusII());\n            DetectMouse(new GladiusIIWireless());\n            DetectMouse(new KerisWireless());\n            DetectMouse(new KerisWirelessWired());\n            DetectMouse(new Keris());\n            DetectMouse(new KerisWirelessEvaEdition());\n            DetectMouse(new KerisWirelessEvaEditionWired());\n            DetectMouse(new TUFM4Air());\n            DetectMouse(new TUFM4Wirelss());\n            DetectMouse(new TUFM4WirelssCN());\n            DetectMouse(new StrixImpactIIWireless());\n            DetectMouse(new StrixImpactIIWirelessWired());\n            DetectMouse(new GladiusIIIWireless());\n            DetectMouse(new GladiusIIIWired());\n            DetectMouse(new GladiusIII());\n            DetectMouse(new GladiusIIIAimpointEva2());\n            DetectMouse(new GladiusIIIAimpointEva2Wired());\n            DetectMouse(new HarpeAceAimLabEdition());\n            DetectMouse(new HarpeAceAimLabEditionWired());\n            DetectMouse(new HarpeAceExtremeWeird());\n            DetectMouse(new HarpeAceMiniWired());\n            DetectMouse(new HarpeIIAceWireless());\n            DetectMouse(new HarpeIIAceWired());\n            DetectMouse(new TUFM3());\n            DetectMouse(new TUFM3GenII());\n            DetectMouse(new TUFM5());\n            DetectMouse(new KerisWirelssAimpoint());\n            DetectMouse(new KerisWirelssAimpointWired());\n            DetectMouse(new KerisIIAceWired());\n            DetectMouse(new KerisIIOriginWired()); \n            DetectMouse(new PugioII());\n            DetectMouse(new PugioIIWired());\n            DetectMouse(new StrixImpactII());\n            DetectMouse(new StrixImpactIIElectroPunk());\n            DetectMouse(new Chakram());\n            DetectMouse(new ChakramWired());\n            DetectMouse(new ChakramCore());\n            DetectMouse(new SpathaX());\n            DetectMouse(new SpathaXWired());\n            DetectMouse(new StrixCarry());\n            DetectMouse(new StrixImpactIII());\n            DetectMouse(new StrixImpact());\n            DetectMouse(new TXGamingMini());\n            DetectMouse(new TXGamingMiniWired());\n            DetectMouse(new Pugio());\n        }\n\n        public static void DedectOmniMouse()\n        {\n            try\n            {\n                var device = DeviceList.Local.GetHidDevices(0x0B05, 0x1ACE).FirstOrDefault(x => x.DevicePath.Contains(\"mi_02&col03\"));\n                if (device is null) return;\n\n                var config = new OpenConfiguration();\n                config.SetOption(OpenOption.Interruptible, true);\n                config.SetOption(OpenOption.Exclusive, false);\n                config.SetOption(OpenOption.Priority, 10);\n\n                using (var stream = device.Open(config))\n                {\n                    var response = new byte[64];\n                    stream.Write(new byte[] { 0x03, 0x12, 0x12, 0x01 });\n                    stream.Read(response);\n                    Logger.WriteLine(\"Omni Mouse ID1: \" + Encoding.ASCII.GetString(response.Skip(5).Take(12).ToArray()));\n\n                    stream.Write(new byte[] { 0x03, 0x12, 0x12, 0x02 });\n                    stream.Read(response);\n\n                    Logger.WriteLine(\"Omni Mouse ID: \" + BitConverter.ToString(response));\n                    var signatureBytes = response.Skip(5).Take(12).ToArray();\n                    string signatureStr = Encoding.ASCII.GetString(signatureBytes);\n\n                    Logger.WriteLine(\"Signature: \" + BitConverter.ToString(signatureBytes) + \" = \" + signatureStr);\n\n                    AsusMouse omniMouse = signatureStr switch\n                    {\n                        var s when s.StartsWith(\"B241226660\") => new HarpeAceMiniOmni(),                // B24122666061\n                        var s when s.StartsWith(\"B23\") => new HarpeAceAimLabEditionOmni(),              // B23072800062\n                        var s when s.StartsWith(\"B241\") => new HarpeAceAimLabEditionOmni(),             // B24122666771\n                        var s when s.StartsWith(\"B2501\") => new HarpeAceAimLabEditionOmni(),            // B25010476524\n                        var s when s.StartsWith(\"B2504\") => new HarpeAceAimLabEditionOmni(),            // B25043063148\n                        var s when s.StartsWith(\"S7\") => new HarpeAceMiniOmni(),                        // S7MPKR053847\n                        var s when s.StartsWith(\"B24\") => new HarpeAceMiniOmni(),                       // B24082550833\n                        var s when s.StartsWith(\"B25\") => new HarpeAceMiniOmni(),                       // B25030817186\n                        var s when s.StartsWith(\"R1\") => new KerisWirelssAimpointOmni(),                // R13121351391\n                        var s when s.StartsWith(\"F24\") => new KerisWirelssAimpointOmni(),               // F24B21DD03F4\n                        var s when s.StartsWith(\"FB\") => new KerisWirelssAimpointOmni(),                // FBA0CC1D6F9C\n                        var s when s.StartsWith(\"024\") => new KerisAceIIOmni(),                         // 024031316969\n                        var s when s.StartsWith(\"02501\") => new KerisAceIIOmni(),                       // 0250105027981\n                        var s when s.StartsWith(\"025\") => new KerisIIOriginOmni(),                      // 025050613700\n                        var s when s.StartsWith(\"20\") => new StrixImpactIIIWirelessOmni(),              // 202405290700\n                        var s when s.StartsWith(\"R8\") => new GladiusIIIAimpointOmni(),                  // R82020155689\n                        var s when s.StartsWith(\"R6\") => new GladiusIIIAimpointOmni(),                  // R60120331787\n                        var s when s.StartsWith(\"RC\") => new GladiusIIIAimpointOmni(),                  // RC1519430455\n                        var s when s.StartsWith(\"R903\") => new GladiusIIIAimpointOmni(),                // R90319215881\n                        var s when s.StartsWith(\"R923\") => new GladiusIIIAimpointOmni(),                // R92307410710\n                        var s when s.StartsWith(\"R9\") => new KerisWirelssAimpointOmni(),                // R90518300572\n                        var s when s.StartsWith(\"T5\") => new HarpeAceExtremeOmni(),                     // T5MPKR018406\n                        _ => new HarpeAceAimLabEditionOmni()\n                    };\n\n                    DetectMouse(omniMouse);\n                }\n            }\n            catch\n            {\n                return;\n            }\n        }\n\n        public static void DetectMouse(AsusMouse am)\n        {\n            if (am.IsDeviceConnected() && !IsDeviceConnected(am))\n            {\n                Logger.WriteLine(\"Detected a new\" + am.GetDisplayName() + \" . Connecting...\");\n                Connect(am);\n            }\n        }\n\n        public static void RegisterForDeviceEvents()\n        {\n            HidSharp.DeviceList.Local.Changed += Device_Changed;\n        }\n\n        public static void UnregisterForDeviceEvents()\n        {\n            HidSharp.DeviceList.Local.Changed -= Device_Changed;\n        }\n\n        private static void Device_Changed(object? sender, HidSharp.DeviceListChangedEventArgs e)\n        {\n            timer.Start();\n        }\n\n        private static void DeviceTimer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)\n        {\n            timer.Stop();\n            Logger.WriteLine(\"HID Device Event: Checking for new ASUS Mice\");\n            DetectAllAsusMice();\n            if (AppConfig.IsZ13()) Program.inputDispatcher.Init();\n        }\n    }\n}\n"
  },
  {
    "path": "app/Program.cs",
    "content": "using GHelper.Ally;\nusing GHelper.Battery;\nusing GHelper.Display;\nusing GHelper.Gpu;\nusing GHelper.Helpers;\nusing GHelper.Input;\nusing GHelper.Mode;\nusing GHelper.Peripherals;\nusing GHelper.USB;\nusing Microsoft.Win32;\nusing Ryzen;\nusing System.Diagnostics;\nusing System.Globalization;\nusing System.Reflection;\nusing System.Text;\nusing static NativeMethods;\n\nnamespace GHelper\n{\n\n    static class Program\n    {\n        public static NotifyIcon trayIcon;\n        public static AsusACPI acpi;\n\n        public static SettingsForm settingsForm = new SettingsForm();\n\n        public static ModeControl modeControl = new ModeControl();\n        public static GPUModeControl gpuControl = new GPUModeControl(settingsForm);\n        public static AllyControl allyControl = new AllyControl(settingsForm);\n        public static ClamshellModeControl clamshellControl = new ClamshellModeControl();\n\n        public static ToastForm toast = new ToastForm();\n\n        public static IntPtr unRegPowerNotify, unRegPowerNotifyLid;\n        public static int WM_TASKBARCREATED = 0;\n\n        private static long lastAuto;\n        private static long lastTheme;\n\n        public static InputDispatcher? inputDispatcher;\n\n        private static PowerLineStatus isPlugged = SystemInformation.PowerStatus.PowerLineStatus;\n\n        // The main entry point for the application\n        public static void Main(string[] args)\n        {\n\n            string action = \"\";\n            if (args.Length > 0) action = args[0];\n\n            if (action == \"charge\")\n            {\n                if (AppConfig.IsZ13())\n                {\n                    AsusHid.Write([\n                        [AsusHid.AURA_ID, 0xB9],\n                        Encoding.ASCII.GetBytes(\"]ASUS Tech.Inc.\"),\n                        [AsusHid.AURA_ID, 0x05, 0x20, 0x31, 0, 0x1A],\n                        [AsusHid.AURA_ID, 0xC0, 0x03, 0x01]\n                    ], \"Init\");\n                }\n\n                BatteryLimit();\n                try\n                {\n                    InputDispatcher.StartupBacklight();\n                } catch (Exception ex) { \n                    Logger.WriteLine($\"Startup Backlight: {ex.Message}\");\n                }\n                Application.Exit();\n                return;\n            }\n\n            string language = AppConfig.GetString(\"language\");\n\n            if (language != null && language.Length > 0)\n                Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(language);\n            else\n            {\n                var culture = CultureInfo.CurrentUICulture;\n                if (culture.ToString() == \"kr\") culture = CultureInfo.GetCultureInfo(\"ko\");\n                Thread.CurrentThread.CurrentUICulture = culture;\n            }\n\n            ProcessHelper.CheckAlreadyRunning();\n            ProcessHelper.SetPriority();\n\n            Logger.WriteLine(\"------------\");\n            Logger.WriteLine(\"App launched: \" + AppConfig.GetModel() + \" :\" + Assembly.GetExecutingAssembly().GetName().Version.ToString() + CultureInfo.CurrentUICulture + (ProcessHelper.IsUserAdministrator() ? \".\" : \"\"));\n\n            var startCount = AppConfig.Get(\"start_count\") + 1;\n            AppConfig.Set(\"start_count\", startCount);\n            Logger.WriteLine(\"Start Count: \" + startCount);\n\n            acpi = new AsusACPI();\n\n            if (!acpi.IsConnected() && AppConfig.IsASUS())\n            {\n                DialogResult dialogResult = MessageBox.Show(Properties.Strings.ACPIError, Properties.Strings.StartupError, MessageBoxButtons.YesNo);\n                if (dialogResult == DialogResult.Yes)\n                {\n                    Process.Start(new ProcessStartInfo(\"https://www.asus.com/support/FAQ/1047338/\") { UseShellExecute = true });\n                }\n\n                Application.Exit();\n                return;\n            }\n\n            ProcessHelper.KillByName(\"ASUSSmartDisplayControl\");\n\n            Application.EnableVisualStyles();\n\n            HardwareControl.RecreateGpuControl();\n            RyzenControl.Init();\n\n            trayIcon = new NotifyIcon\n            {\n                Text = \"G-Helper\",\n                Icon = Properties.Resources.standard,\n                Visible = true\n            };\n\n            WM_TASKBARCREATED = RegisterWindowMessage(\"TaskbarCreated\");\n            Logger.WriteLine($\"Tray Icon: {trayIcon.Visible} | {WM_TASKBARCREATED}\");\n\n            settingsForm.SetContextMenu();\n            trayIcon.MouseClick += TrayIcon_MouseClick;\n            trayIcon.MouseMove += TrayIcon_MouseMove;\n\n\n            inputDispatcher = new InputDispatcher();\n\n            settingsForm.InitAura();\n            settingsForm.InitMatrix();\n\n            XGM.Init();\n\n            SetAutoModes(init: true);\n\n            // Subscribing for system power change events\n            SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;\n            SystemEvents.UserPreferenceChanged += SystemEvents_UserPreferenceChanged;\n\n            SystemEvents.SessionSwitch += SystemEvents_SessionSwitch;\n            SystemEvents.SessionEnding += SystemEvents_SessionEnding;\n\n            clamshellControl.RegisterDisplayEvents();\n            clamshellControl.ToggleLidAction();\n\n            // Subscribing for monitor power on events\n            unRegPowerNotify = NativeMethods.RegisterPowerSettingNotification(settingsForm.Handle, PowerSettingGuid.ConsoleDisplayState, NativeMethods.DEVICE_NOTIFY_WINDOW_HANDLE);\n            unRegPowerNotifyLid = NativeMethods.RegisterPowerSettingNotification(settingsForm.Handle, PowerSettingGuid.LIDSWITCH_STATE_CHANGE, NativeMethods.DEVICE_NOTIFY_WINDOW_HANDLE);\n\n\n            Task task = Task.Run((Action)PeripheralsProvider.DetectAllAsusMice);\n            PeripheralsProvider.RegisterForDeviceEvents();\n\n            if (Environment.CurrentDirectory.Trim('\\\\') == Application.StartupPath.Trim('\\\\') || action.Length > 0)\n            {\n                SettingsToggle(false);\n            }\n\n            switch (action)\n            {\n                case \"cpu\":\n                    Startup.ReScheduleAdmin();\n                    settingsForm.FansToggle();\n                    break;\n                case \"gpu\":\n                    Startup.ReScheduleAdmin();\n                    settingsForm.FansToggle(1);\n                    break;\n                case \"services\":\n                    settingsForm.extraForm = new Extra();\n                    settingsForm.extraForm.Show();\n                    settingsForm.extraForm.ServiesToggle();\n                    break;\n                case \"uv\":\n                    Startup.ReScheduleAdmin();\n                    settingsForm.FansToggle(2);\n                    modeControl.SetRyzen();\n                    break;\n                case \"colors\":\n                    Task.Run(async () =>\n                    {\n                        await ColorProfileHelper.InstallProfile();\n                        settingsForm.Invoke(delegate\n                        {\n                            settingsForm.InitVisual();\n                        });\n                    });\n                    break;\n                default:\n                    Task.Run(Startup.StartupCheck);\n                    break;\n            }\n\n            Task.Run(() =>\n            {\n                settingsForm.VisualiseArmoury(AsusService.IsArmouryRunning());\n            });\n\n            Application.Run();\n\n        }\n\n\n        private static void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)\n        {\n            gpuControl.StandardModeFix();\n            modeControl.ShutdownReset();\n            BatteryControl.AutoBattery();\n            InputDispatcher.ShutdownStatusLed();\n        }\n\n        private static void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)\n        {\n            if (e.Reason == SessionSwitchReason.SessionLogon || e.Reason == SessionSwitchReason.SessionUnlock)\n            {\n                Logger.WriteLine(\"Session:\" + e.Reason.ToString());\n                Aura.sessionLock = false;\n                ScreenControl.AutoScreen();\n            }\n            if (e.Reason == SessionSwitchReason.SessionLock)\n            {\n                Logger.WriteLine(\"Session:\" + e.Reason.ToString());\n                Aura.sessionLock = true;\n            }\n        }\n\n        static void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e)\n        {\n\n            if (Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastTheme) < 2000) return;\n\n            switch (e.Category)\n            {\n                case UserPreferenceCategory.General:\n                    bool changed = settingsForm.InitTheme();\n                    settingsForm.InitContextMenuTheme();\n                    settingsForm.VisualiseIcon();\n\n                    if (changed)\n                    {\n                        Debug.WriteLine(\"Theme Changed\");\n                        lastTheme = DateTimeOffset.Now.ToUnixTimeMilliseconds();\n                    }\n\n                    if (settingsForm.fansForm is not null && settingsForm.fansForm.Text != \"\")\n                        settingsForm.fansForm.InitTheme();\n\n                    if (settingsForm.extraForm is not null && settingsForm.extraForm.Text != \"\")\n                        settingsForm.extraForm.InitTheme();\n\n                    if (settingsForm.updatesForm is not null && settingsForm.updatesForm.Text != \"\")\n                        settingsForm.updatesForm.InitTheme();\n\n                    if (settingsForm.matrixForm is not null && settingsForm.matrixForm.Text != \"\")\n                        settingsForm.matrixForm.InitTheme();\n\n                    if (settingsForm.handheldForm is not null && settingsForm.handheldForm.Text != \"\")\n                        settingsForm.handheldForm.InitTheme();\n\n                    break;\n            }\n        }\n\n\n\n        public static bool SetAutoModes(bool powerChanged = false, bool init = false, bool wakeup = false)\n        {\n            int skipDelay = wakeup ? 10000 : 3000;\n\n            if (Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastAuto) < skipDelay) return false;\n            lastAuto = DateTimeOffset.Now.ToUnixTimeMilliseconds();\n\n            isPlugged = SystemInformation.PowerStatus.PowerLineStatus;\n            Logger.WriteLine(\"AutoSetting for \" + isPlugged.ToString());\n\n            BatteryControl.AutoBattery(init);\n            if (init) InputDispatcher.InitScreenpad();\n            DynamicLightingHelper.Init();\n            ScreenControl.InitOptimalBrightness();\n\n            inputDispatcher.Init();\n            //HardwareControl.ReadSensors(true);\n\n            modeControl.AutoPerformance(powerChanged);\n\n            settingsForm.matrixControl.SetDevice(true);\n            InputDispatcher.InitStatusLed();\n            XGM.InitLight();\n\n            if (AppConfig.IsAlly())\n            {\n                allyControl.Init();\n            }\n            else\n            {\n                InputDispatcher.AutoKeyboard();\n            }\n\n            bool switched = gpuControl.AutoGPUMode(delay: 1000);\n            if (!switched)\n            {\n                gpuControl.InitGPUMode();\n                ScreenControl.AutoScreen();\n            }\n\n            ScreenControl.InitMiniled();\n            VisualControl.InitBrightness();\n\n            return true;\n        }\n\n        private static void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)\n        {\n            if (e.Mode == PowerModes.Suspend)\n            {\n                Logger.WriteLine(\"Power Mode Changed:\" + e.Mode.ToString());\n                gpuControl.StandardModeFix(true);\n                modeControl.ShutdownReset();\n                InputDispatcher.ShutdownStatusLed();\n            }\n\n            if (SystemInformation.PowerStatus.PowerLineStatus == isPlugged) return;\n            Logger.WriteLine($\"Power Mode {e.Mode}: {SystemInformation.PowerStatus.PowerLineStatus}\");\n            \n            if (AppConfig.Is(\"disable_power_event\")) return;\n\n            int delay = AppConfig.Get(\"charger_delay\");\n            if (delay > 0)\n            {\n                Logger.WriteLine($\"Charger Delay: {delay}\");\n                Thread.Sleep(delay);\n                if (SystemInformation.PowerStatus.PowerLineStatus == isPlugged) return;\n            }\n\n            SetAutoModes(powerChanged: true);\n        }\n\n        public static void SettingsToggle(bool checkForFocus = true, bool trayClick = false)\n        {\n            if (settingsForm.Visible)\n            {\n                // If helper window is not on top, this just focuses on the app again\n                // Pressing the ghelper button again will hide the app\n                if (checkForFocus && !settingsForm.HasAnyFocus(trayClick) && !AppConfig.Is(\"topmost\"))\n                {\n                    settingsForm.ShowAll();\n                }\n                else\n                {\n                    settingsForm.HideAll();\n                }\n            }\n            else\n            {\n                var screen = Screen.PrimaryScreen;\n                if (screen is null) screen = Screen.FromControl(settingsForm);\n\n                settingsForm.Location = screen.WorkingArea.Location;\n                settingsForm.Left = screen.WorkingArea.Width - 10 - settingsForm.Width;\n                settingsForm.Top = screen.WorkingArea.Height - 10 - settingsForm.Height;\n\n                settingsForm.Show();\n                settingsForm.ShowAll();\n\n                settingsForm.Left = screen.WorkingArea.Width - 10 - settingsForm.Width;\n\n                if (AppConfig.IsAlly())\n                    settingsForm.Top = Math.Max(10, screen.Bounds.Height - 110 - settingsForm.Height);\n                else\n                    settingsForm.Top = screen.WorkingArea.Height - 10 - settingsForm.Height;\n\n                settingsForm.VisualiseGPUMode();\n            }\n        }\n\n        static void TrayIcon_MouseClick(object? sender, MouseEventArgs e)\n        {\n            if (e.Button == MouseButtons.Left)\n                SettingsToggle(trayClick: true);\n\n        }\n\n        static void TrayIcon_MouseMove(object? sender, MouseEventArgs e)\n        {\n            settingsForm.RefreshSensors();\n        }\n\n        static void OnExit(object sender, EventArgs e)\n        {\n            if (trayIcon is not null)\n            {\n                trayIcon.Visible = false;\n                trayIcon.Dispose();\n            }\n\n            PeripheralsProvider.UnregisterForDeviceEvents();\n            clamshellControl.UnregisterDisplayEvents();\n            NativeMethods.UnregisterPowerSettingNotification(unRegPowerNotify);\n            NativeMethods.UnregisterPowerSettingNotification(unRegPowerNotifyLid);\n            Application.Exit();\n        }\n\n        static void BatteryLimit()\n        {\n            try\n            {\n                int limit = AppConfig.Get(\"charge_limit\");\n                if (limit > 0 && limit < 100)\n                {\n                    Logger.WriteLine($\"------- Startup Battery Limit {limit} -------\");\n                    ProcessHelper.StartEnableService(\"ATKWMIACPIIO\", false);\n                    Logger.WriteLine($\"Connecting to ACPI\");\n                    acpi = new AsusACPI();\n                    Logger.WriteLine($\"Setting Limit\");\n                    acpi.DeviceSet(AsusACPI.BatteryLimit, limit, \"Limit\");\n                }\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine(\"Startup Battery Limit Error: \" + ex.Message);\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "app/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace GHelper.Properties\n{\n    using System;\n\n\n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"17.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources\n    {\n\n        private static global::System.Resources.ResourceManager resourceMan;\n\n        private static global::System.Globalization.CultureInfo resourceCulture;\n\n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources()\n        {\n        }\n\n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager\n        {\n            get\n            {\n                if (object.ReferenceEquals(resourceMan, null))\n                {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"GHelper.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n\n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture\n        {\n            get\n            {\n                return resourceCulture;\n            }\n            set\n            {\n                resourceCulture = value;\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap ally\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"ally\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap backlight\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"backlight\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap backlight_down\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"backlight_down\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap backlight_up\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"backlight_up\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap brightness_down\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"brightness_down\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap brightness_up\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"brightness_up\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Icon similar to (Icon).\n        /// </summary>\n        internal static System.Drawing.Icon dark_eco\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"dark_eco\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Icon similar to (Icon).\n        /// </summary>\n        internal static System.Drawing.Icon dark_standard\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"dark_standard\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap dot_eco\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"dot_eco\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap dot_standard\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"dot_standard\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap dot_ultimate\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"dot_ultimate\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Icon similar to (Icon).\n        /// </summary>\n        internal static System.Drawing.Icon eco\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"eco\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_add_64\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8_add_64\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_animation_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-animation-32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_automation_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-automation-32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_batterie_voll_geladen_48\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8_batterie_voll_geladen_48\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_bicycle_48__1_\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-bicycle-48 (1)\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_brightness_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-brightness-32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_charged_battery_96\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8_charged_battery_96\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_charging_battery_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-charging-battery-32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_charging_battery_96\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8_charging_battery_96\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_color_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-color-32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_controller_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-controller-32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_controller_96\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8_controller_96\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_controls_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-controls-32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_dollar_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-dollar-32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_edit_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8_edit_32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_fan_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8_fan_32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_fan_48\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-fan-48\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_fiat_500_48\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-fiat-500-48\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_function\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8_function\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_game_controller_48\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-game-controller-48\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_gauge_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-gauge-32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_heartbeat_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-heartbeat-32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_help_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-help-32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_hibernate_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-hibernate-32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_joystick_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-joystick-32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_keyboard_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-keyboard-32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_keyboard_32__1_\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-keyboard-32 (1)\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_ladende_batterie_48\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8_ladende_batterie_48\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_laptop_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-laptop-32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_leaf_48\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-leaf-48\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_log_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-log-32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_matrix_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-matrix-32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_maus_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8_maus_32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_maus_48\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8_maus_48\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_mauszeiger_50\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8_mauszeiger_50\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_microphone_96\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8_microphone_96\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_mute_unmute_96\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8_mute_unmute_96\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_next_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-next-32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_processor_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8_processor_32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_project_management_48__1_\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-project-management-48 (1)\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_quit_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-quit-32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_refresh_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-refresh-32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_remove_64\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8_remove_64\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_rocket_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8_rocket_32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_rocket_48\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-rocket-48\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_save_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-save-32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_search_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-search-32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_settings_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-settings-32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_share_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8_share_32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_software_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8_software_32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_software_32_white\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-software-32-white\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_soonvibes_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-soonvibes-32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_spa_flower_48\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-spa-flower-48\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_temperature_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8_temperature_32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_touchpad_96\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8_touchpad_96\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_video_48\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8_video_48\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_video_card_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-video-card-32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_voltage_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8_voltage_32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_xbox_lt_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-xbox-lt-32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap icons8_xbox_rt_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"icons8-xbox-rt-32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Icon similar to (Icon).\n        /// </summary>\n        internal static System.Drawing.Icon light_eco\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"light_eco\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Icon similar to (Icon).\n        /// </summary>\n        internal static System.Drawing.Icon light_standard\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"light_standard\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap lighting_dot_24\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"lighting_dot_24\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap lighting_dot_32\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"lighting_dot_32\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap lighting_dot_48\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"lighting_dot_48\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap cross_23\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"cross_23\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Byte[].\n        /// </summary>\n        internal static byte[] MFont\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"MFont\", resourceCulture);\n                return ((byte[])(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Icon similar to (Icon).\n        /// </summary>\n        internal static System.Drawing.Icon standard\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"standard\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Icon similar to (Icon).\n        /// </summary>\n        internal static System.Drawing.Icon ultimate\n        {\n            get\n            {\n                object obj = ResourceManager.GetObject(\"ultimate\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Windows.Forms\" name=\"System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  <data name=\"lighting_dot_48\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\lighting_dot_48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"lighting_dot_24\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\lighting_dot_24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8_charged_battery_96\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-charged-battery-96.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-search-32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-search-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8_edit_32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-edit-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8_microphone_96\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-microphone-96.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8_maus_48\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-maus-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-bicycle-48 (1)\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-bicycle-48 (1).png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"standard\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\standard.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"eco\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\eco.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8_mute_unmute_96\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-mute-unmute-96.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8_batterie_voll_geladen_48\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-batterie-voll-geladen-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-spa-flower-48\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-spa-flower-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-quit-32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-quit-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-controller-32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-controller-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-controls-32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-controls-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-next-32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-next-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-automation-32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-automation-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"light_standard\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\light-standard.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"brightness_up\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\brightness-up.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8_processor_32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-processor-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-fiat-500-48\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-fiat-500-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8_touchpad_96\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-touchpad-96.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-game-controller-48\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-game-controller-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-help-32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-help-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"light_eco\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\light-eco.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-matrix-32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-matrix-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-laptop-32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-laptop-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"ally\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\ally.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8_remove_64\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-remove-64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8_function\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-function-mac-96.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-joystick-32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-joystick-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-keyboard-32 (1)\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-keyboard-32 (1).png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-xbox-lt-32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-xbox-lt-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-video-card-32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-video-card-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"backlight\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\backlight.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-color-32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-color-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-refresh-32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-refresh-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-hibernate-32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-hibernate-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"ultimate\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\ultimate.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-keyboard-32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-keyboard-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-xbox-rt-32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-xbox-rt-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8_controller_96\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-controller-96.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-fan-48\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-fan-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-settings-32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-settings-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8_maus_32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-maus-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8_charging_battery_96\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-charging-battery-96.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-animation-32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-animation-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"dot_ultimate\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\dot-ultimate.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-heartbeat-32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-heartbeat-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"brightness_down\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\brightness-down.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"backlight_up\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\backlight-up.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"backlight_down\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\backlight-down.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-brightness-32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-brightness-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"dot_standard\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\dot-standard.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8_rocket_32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-rocket-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"dark_eco\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\dark-eco.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-project-management-48 (1)\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-project-management-48 (1).png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8_mauszeiger_50\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-mauszeiger-50.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-save-32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-save-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8_ladende_batterie_48\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-ladende-batterie-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"dark_standard\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\dark-standard.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8_video_48\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-video-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"MFont\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Font.otf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </data>\n  <data name=\"dot_eco\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\dot-eco.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-gauge-32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-gauge-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-rocket-48\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-rocket-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8_fan_32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-fan-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8_voltage_32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-voltage-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-software-32-white\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-software-32-white.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-log-32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-log-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8_temperature_32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-temperature-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-leaf-48\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-leaf-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8_add_64\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-add-64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8_software_32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-software-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8_share_32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-share-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-soonvibes-32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-soonvibes-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"lighting_dot_32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\lighting_dot_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-charging-battery-32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-charging-battery-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"icons8-dollar-32\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\icons8-dollar-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"cross_23\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\cross-23.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n</root>"
  },
  {
    "path": "app/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace GHelper.Properties {\n    \n    \n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"17.4.0.0\")]\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {\n        \n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\n        \n        public static Settings Default {\n            get {\n                return defaultInstance;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"http://schemas.microsoft.com/VisualStudio/2004/01/settings\" CurrentProfile=\"(Default)\">\n  <Profiles>\n    <Profile Name=\"(Default)\" />\n  </Profiles>\n</SettingsFile>\n"
  },
  {
    "path": "app/Properties/Strings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace GHelper.Properties {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"17.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Strings {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Strings() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"GHelper.Properties.Strings\", typeof(Strings).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Acceleration.\n        /// </summary>\n        internal static string Acceleration {\n            get {\n                return ResourceManager.GetString(\"Acceleration\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Can&apos;t connect to ASUS ACPI. Application can&apos;t function without it. Try to install Asus System Control Interface.\n        /// </summary>\n        internal static string ACPIError {\n            get {\n                return ResourceManager.GetString(\"ACPIError\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Restart your device to apply changes.\n        /// </summary>\n        internal static string AlertAPUMemoryRestart {\n            get {\n                return ResourceManager.GetString(\"AlertAPUMemoryRestart\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Restart now?.\n        /// </summary>\n        internal static string AlertAPUMemoryRestartTitle {\n            get {\n                return ResourceManager.GetString(\"AlertAPUMemoryRestartTitle\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Looks like GPU is in heavy use, disable it?.\n        /// </summary>\n        internal static string AlertDGPU {\n            get {\n                return ResourceManager.GetString(\"AlertDGPU\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Eco Mode.\n        /// </summary>\n        internal static string AlertDGPUTitle {\n            get {\n                return ResourceManager.GetString(\"AlertDGPUTitle\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Switching off Ultimate Mode requires restart.\n        /// </summary>\n        internal static string AlertUltimateOff {\n            get {\n                return ResourceManager.GetString(\"AlertUltimateOff\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Ultimate Mode requires restart.\n        /// </summary>\n        internal static string AlertUltimateOn {\n            get {\n                return ResourceManager.GetString(\"AlertUltimateOn\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Reboot now?.\n        /// </summary>\n        internal static string AlertUltimateTitle {\n            get {\n                return ResourceManager.GetString(\"AlertUltimateTitle\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Ally Controller.\n        /// </summary>\n        internal static string AllyController {\n            get {\n                return ResourceManager.GetString(\"AllyController\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Ambient mode may increase resource usage.\n        /// </summary>\n        internal static string AmbientModeResources {\n            get {\n                return ResourceManager.GetString(\"AmbientModeResources\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Animation Speed.\n        /// </summary>\n        internal static string AnimationSpeed {\n            get {\n                return ResourceManager.GetString(\"AnimationSpeed\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Anime Matrix.\n        /// </summary>\n        internal static string AnimeMatrix {\n            get {\n                return ResourceManager.GetString(\"AnimeMatrix\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to App already running.\n        /// </summary>\n        internal static string AppAlreadyRunning {\n            get {\n                return ResourceManager.GetString(\"AppAlreadyRunning\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to G-Helper is already running. Check system tray for an icon..\n        /// </summary>\n        internal static string AppAlreadyRunningText {\n            get {\n                return ResourceManager.GetString(\"AppAlreadyRunningText\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Apply.\n        /// </summary>\n        internal static string Apply {\n            get {\n                return ResourceManager.GetString(\"Apply\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Apply Custom Fan Curve.\n        /// </summary>\n        internal static string ApplyFanCurve {\n            get {\n                return ResourceManager.GetString(\"ApplyFanCurve\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Apply Power Limits.\n        /// </summary>\n        internal static string ApplyPowerLimits {\n            get {\n                return ResourceManager.GetString(\"ApplyPowerLimits\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Auto adjust Windows Power Modes.\n        /// </summary>\n        internal static string ApplyWindowsPowerPlan {\n            get {\n                return ResourceManager.GetString(\"ApplyWindowsPowerPlan\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Memory Assigned to GPU.\n        /// </summary>\n        internal static string APUMemory {\n            get {\n                return ResourceManager.GetString(\"APUMemory\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Asus Services Running.\n        /// </summary>\n        internal static string AsusServicesRunning {\n            get {\n                return ResourceManager.GetString(\"AsusServicesRunning\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Battery State.\n        /// </summary>\n        internal static string AuraBatteryState {\n            get {\n                return ResourceManager.GetString(\"AuraBatteryState\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Breathe.\n        /// </summary>\n        internal static string AuraBreathe {\n            get {\n                return ResourceManager.GetString(\"AuraBreathe\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Clockwise.\n        /// </summary>\n        internal static string AuraClockwise {\n            get {\n                return ResourceManager.GetString(\"AuraClockwise\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Color Cycle.\n        /// </summary>\n        internal static string AuraColorCycle {\n            get {\n                return ResourceManager.GetString(\"AuraColorCycle\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Comet.\n        /// </summary>\n        internal static string AuraComet {\n            get {\n                return ResourceManager.GetString(\"AuraComet\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Counterclockwise.\n        /// </summary>\n        internal static string AuraCounterClockwise {\n            get {\n                return ResourceManager.GetString(\"AuraCounterClockwise\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Fast.\n        /// </summary>\n        internal static string AuraFast {\n            get {\n                return ResourceManager.GetString(\"AuraFast\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Lighting Mode.\n        /// </summary>\n        internal static string AuraLightingMode {\n            get {\n                return ResourceManager.GetString(\"AuraLightingMode\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Normal.\n        /// </summary>\n        internal static string AuraNormal {\n            get {\n                return ResourceManager.GetString(\"AuraNormal\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Rainbow.\n        /// </summary>\n        internal static string AuraRainbow {\n            get {\n                return ResourceManager.GetString(\"AuraRainbow\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Random.\n        /// </summary>\n        internal static string AuraRandomColor {\n            get {\n                return ResourceManager.GetString(\"AuraRandomColor\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to React.\n        /// </summary>\n        internal static string AuraReact {\n            get {\n                return ResourceManager.GetString(\"AuraReact\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Slow.\n        /// </summary>\n        internal static string AuraSlow {\n            get {\n                return ResourceManager.GetString(\"AuraSlow\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Static.\n        /// </summary>\n        internal static string AuraStatic {\n            get {\n                return ResourceManager.GetString(\"AuraStatic\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Strobe.\n        /// </summary>\n        internal static string AuraStrobe {\n            get {\n                return ResourceManager.GetString(\"AuraStrobe\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to All.\n        /// </summary>\n        internal static string AuraZoneAll {\n            get {\n                return ResourceManager.GetString(\"AuraZoneAll\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Dock.\n        /// </summary>\n        internal static string AuraZoneDock {\n            get {\n                return ResourceManager.GetString(\"AuraZoneDock\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Logo.\n        /// </summary>\n        internal static string AuraZoneLogo {\n            get {\n                return ResourceManager.GetString(\"AuraZoneLogo\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Scrollwheel.\n        /// </summary>\n        internal static string AuraZoneScroll {\n            get {\n                return ResourceManager.GetString(\"AuraZoneScroll\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Underglow.\n        /// </summary>\n        internal static string AuraZoneUnderglow {\n            get {\n                return ResourceManager.GetString(\"AuraZoneUnderglow\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Auto Apply.\n        /// </summary>\n        internal static string AutoApply {\n            get {\n                return ResourceManager.GetString(\"AutoApply\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Auto.\n        /// </summary>\n        internal static string AutoMode {\n            get {\n                return ResourceManager.GetString(\"AutoMode\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Sets 60Hz to save battery, and back when plugged.\n        /// </summary>\n        internal static string AutoRefreshTooltip {\n            get {\n                return ResourceManager.GetString(\"AutoRefreshTooltip\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Awake.\n        /// </summary>\n        internal static string Awake {\n            get {\n                return ResourceManager.GetString(\"Awake\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Low.\n        /// </summary>\n        internal static string BacklightLow {\n            get {\n                return ResourceManager.GetString(\"BacklightLow\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Max.\n        /// </summary>\n        internal static string BacklightMax {\n            get {\n                return ResourceManager.GetString(\"BacklightMax\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Mid.\n        /// </summary>\n        internal static string BacklightMid {\n            get {\n                return ResourceManager.GetString(\"BacklightMid\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Off.\n        /// </summary>\n        internal static string BacklightOff {\n            get {\n                return ResourceManager.GetString(\"BacklightOff\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Timeout plugged / on battery (0 - ON).\n        /// </summary>\n        internal static string BacklightTimeout {\n            get {\n                return ResourceManager.GetString(\"BacklightTimeout\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Backlight Timeout when on battery.\n        /// </summary>\n        internal static string BacklightTimeoutBattery {\n            get {\n                return ResourceManager.GetString(\"BacklightTimeoutBattery\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Backlight Timeout when plugged.\n        /// </summary>\n        internal static string BacklightTimeoutPlugged {\n            get {\n                return ResourceManager.GetString(\"BacklightTimeoutPlugged\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Balanced.\n        /// </summary>\n        internal static string Balanced {\n            get {\n                return ResourceManager.GetString(\"Balanced\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Charge.\n        /// </summary>\n        internal static string BatteryCharge {\n            get {\n                return ResourceManager.GetString(\"BatteryCharge\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Battery Charge Limit.\n        /// </summary>\n        internal static string BatteryChargeLimit {\n            get {\n                return ResourceManager.GetString(\"BatteryChargeLimit\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Battery Health.\n        /// </summary>\n        internal static string BatteryHealth {\n            get {\n                return ResourceManager.GetString(\"BatteryHealth\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to One time charge to 100%.\n        /// </summary>\n        internal static string BatteryLimitFull {\n            get {\n                return ResourceManager.GetString(\"BatteryLimitFull\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Binding.\n        /// </summary>\n        internal static string Binding {\n            get {\n                return ResourceManager.GetString(\"Binding\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Primary.\n        /// </summary>\n        internal static string BindingPrimary {\n            get {\n                return ResourceManager.GetString(\"BindingPrimary\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Secondary.\n        /// </summary>\n        internal static string BindingSecondary {\n            get {\n                return ResourceManager.GetString(\"BindingSecondary\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to BIOS and Driver Updates.\n        /// </summary>\n        internal static string BiosAndDriverUpdates {\n            get {\n                return ResourceManager.GetString(\"BiosAndDriverUpdates\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Boot.\n        /// </summary>\n        internal static string Boot {\n            get {\n                return ResourceManager.GetString(\"Boot\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Boot Sound.\n        /// </summary>\n        internal static string BootSound {\n            get {\n                return ResourceManager.GetString(\"BootSound\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Brightness.\n        /// </summary>\n        internal static string Brightness {\n            get {\n                return ResourceManager.GetString(\"Brightness\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Brightness Down.\n        /// </summary>\n        internal static string BrightnessDown {\n            get {\n                return ResourceManager.GetString(\"BrightnessDown\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Brightness Up.\n        /// </summary>\n        internal static string BrightnessUp {\n            get {\n                return ResourceManager.GetString(\"BrightnessUp\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Black and white tray icon.\n        /// </summary>\n        internal static string BWTrayIcon {\n            get {\n                return ResourceManager.GetString(\"BWTrayIcon\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Calibrate.\n        /// </summary>\n        internal static string Calibrate {\n            get {\n                return ResourceManager.GetString(\"Calibrate\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Charging.\n        /// </summary>\n        internal static string Charging {\n            get {\n                return ResourceManager.GetString(\"Charging\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Color.\n        /// </summary>\n        internal static string Color {\n            get {\n                return ResourceManager.GetString(\"Color\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Contrast.\n        /// </summary>\n        internal static string Contrast {\n            get {\n                return ResourceManager.GetString(\"Contrast\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Controller.\n        /// </summary>\n        internal static string Controller {\n            get {\n                return ResourceManager.GetString(\"Controller\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to CPU Boost.\n        /// </summary>\n        internal static string CPUBoost {\n            get {\n                return ResourceManager.GetString(\"CPUBoost\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Custom.\n        /// </summary>\n        internal static string Custom {\n            get {\n                return ResourceManager.GetString(\"Custom\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Deceleration.\n        /// </summary>\n        internal static string Deceleration {\n            get {\n                return ResourceManager.GetString(\"Deceleration\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Default.\n        /// </summary>\n        internal static string Default {\n            get {\n                return ResourceManager.GetString(\"Default\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Disable Controller.\n        /// </summary>\n        internal static string DisableController {\n            get {\n                return ResourceManager.GetString(\"DisableController\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Please disable Windows &gt; Dynamic Lighting.\n        /// </summary>\n        internal static string DisableDynamicLighting {\n            get {\n                return ResourceManager.GetString(\"DisableDynamicLighting\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Disable on lid close.\n        /// </summary>\n        internal static string DisableOnLidClose {\n            get {\n                return ResourceManager.GetString(\"DisableOnLidClose\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Disable screen overdrive.\n        /// </summary>\n        internal static string DisableOverdrive {\n            get {\n                return ResourceManager.GetString(\"DisableOverdrive\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Discharging.\n        /// </summary>\n        internal static string Discharging {\n            get {\n                return ResourceManager.GetString(\"Discharging\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Donate.\n        /// </summary>\n        internal static string Donate {\n            get {\n                return ResourceManager.GetString(\"Donate\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Download Color Profiles.\n        /// </summary>\n        internal static string DownloadColorProfiles {\n            get {\n                return ResourceManager.GetString(\"DownloadColorProfiles\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Download.\n        /// </summary>\n        internal static string DownloadUpdate {\n            get {\n                return ResourceManager.GetString(\"DownloadUpdate\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Drivers and Software.\n        /// </summary>\n        internal static string DriverAndSoftware {\n            get {\n                return ResourceManager.GetString(\"DriverAndSoftware\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Disables dGPU to save battery.\n        /// </summary>\n        internal static string EcoGPUTooltip {\n            get {\n                return ResourceManager.GetString(\"EcoGPUTooltip\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Eco.\n        /// </summary>\n        internal static string EcoMode {\n            get {\n                return ResourceManager.GetString(\"EcoMode\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Enable GPU on shutdown (prevents issue with Eco mode).\n        /// </summary>\n        internal static string EnableGPUOnShutdown {\n            get {\n                return ResourceManager.GetString(\"EnableGPUOnShutdown\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Disabling the dGPU by going into Eco mode while Display Mode in NVIDIA Control Panel is not set to Optimus might cause problems with brightness controls until after the next reboot. \n        ///\n        ///Do you still want to continue?.\n        /// </summary>\n        internal static string EnableOptimusText {\n            get {\n                return ResourceManager.GetString(\"EnableOptimusText\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to NVIDIA Display Mode is not set to Optimus.\n        /// </summary>\n        internal static string EnableOptimusTitle {\n            get {\n                return ResourceManager.GetString(\"EnableOptimusTitle\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Energy Settings.\n        /// </summary>\n        internal static string EnergySettings {\n            get {\n                return ResourceManager.GetString(\"EnergySettings\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Export Profile.\n        /// </summary>\n        internal static string Export {\n            get {\n                return ResourceManager.GetString(\"Export\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Extra.\n        /// </summary>\n        internal static string Extra {\n            get {\n                return ResourceManager.GetString(\"Extra\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Extra Settings.\n        /// </summary>\n        internal static string ExtraSettings {\n            get {\n                return ResourceManager.GetString(\"ExtraSettings\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Factory Defaults.\n        /// </summary>\n        internal static string FactoryDefaults {\n            get {\n                return ResourceManager.GetString(\"FactoryDefaults\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Fan Curves.\n        /// </summary>\n        internal static string FanCurves {\n            get {\n                return ResourceManager.GetString(\"FanCurves\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to CPU Fan Profile.\n        /// </summary>\n        internal static string FanProfileCPU {\n            get {\n                return ResourceManager.GetString(\"FanProfileCPU\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to GPU Fan Profile.\n        /// </summary>\n        internal static string FanProfileGPU {\n            get {\n                return ResourceManager.GetString(\"FanProfileGPU\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Mid Fan Profile.\n        /// </summary>\n        internal static string FanProfileMid {\n            get {\n                return ResourceManager.GetString(\"FanProfileMid\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Fan Profiles.\n        /// </summary>\n        internal static string FanProfiles {\n            get {\n                return ResourceManager.GetString(\"FanProfiles\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Fans and Power.\n        /// </summary>\n        internal static string FansAndPower {\n            get {\n                return ResourceManager.GetString(\"FansAndPower\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Fan.\n        /// </summary>\n        internal static string FanSpeed {\n            get {\n                return ResourceManager.GetString(\"FanSpeed\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Fans + Power.\n        /// </summary>\n        internal static string FansPower {\n            get {\n                return ResourceManager.GetString(\"FansPower\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Flicker-free Dimming.\n        /// </summary>\n        internal static string FlickerFreeDimming {\n            get {\n                return ResourceManager.GetString(\"FlickerFreeDimming\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Process Fn+F hotkeys without Fn.\n        /// </summary>\n        internal static string FnLock {\n            get {\n                return ResourceManager.GetString(\"FnLock\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to FN-Lock Off.\n        /// </summary>\n        internal static string FnLockOff {\n            get {\n                return ResourceManager.GetString(\"FnLockOff\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to FN-Lock On.\n        /// </summary>\n        internal static string FnLockOn {\n            get {\n                return ResourceManager.GetString(\"FnLockOn\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Dynamic Boost.\n        /// </summary>\n        internal static string GPUBoost {\n            get {\n                return ResourceManager.GetString(\"GPUBoost\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Changing.\n        /// </summary>\n        internal static string GPUChanging {\n            get {\n                return ResourceManager.GetString(\"GPUChanging\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Core Clock Offset.\n        /// </summary>\n        internal static string GPUCoreClockOffset {\n            get {\n                return ResourceManager.GetString(\"GPUCoreClockOffset\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Memory Clock Offset.\n        /// </summary>\n        internal static string GPUMemoryClockOffset {\n            get {\n                return ResourceManager.GetString(\"GPUMemoryClockOffset\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to GPU Mode.\n        /// </summary>\n        internal static string GPUMode {\n            get {\n                return ResourceManager.GetString(\"GPUMode\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to iGPU only.\n        /// </summary>\n        internal static string GPUModeEco {\n            get {\n                return ResourceManager.GetString(\"GPUModeEco\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to iGPU + dGPU.\n        /// </summary>\n        internal static string GPUModeStandard {\n            get {\n                return ResourceManager.GetString(\"GPUModeStandard\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to dGPU exclusive.\n        /// </summary>\n        internal static string GPUModeUltimate {\n            get {\n                return ResourceManager.GetString(\"GPUModeUltimate\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to GPU Power.\n        /// </summary>\n        internal static string GPUPower {\n            get {\n                return ResourceManager.GetString(\"GPUPower\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to GPU Settings.\n        /// </summary>\n        internal static string GPUSettings {\n            get {\n                return ResourceManager.GetString(\"GPUSettings\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Temperature Target.\n        /// </summary>\n        internal static string GPUTempTarget {\n            get {\n                return ResourceManager.GetString(\"GPUTempTarget\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Minutes till Hibernation in sleep on battery (0 - OFF).\n        /// </summary>\n        internal static string HibernateAfter {\n            get {\n                return ResourceManager.GetString(\"HibernateAfter\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to High.\n        /// </summary>\n        internal static string High {\n            get {\n                return ResourceManager.GetString(\"High\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Image Rotation.\n        /// </summary>\n        internal static string ImageRotation {\n            get {\n                return ResourceManager.GetString(\"ImageRotation\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Import Profile.\n        /// </summary>\n        internal static string Import {\n            get {\n                return ResourceManager.GetString(\"Import\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Interval Off.\n        /// </summary>\n        internal static string IntervalOff {\n            get {\n                return ResourceManager.GetString(\"IntervalOff\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Interval {0}s.\n        /// </summary>\n        internal static string IntervalSeconds {\n            get {\n                return ResourceManager.GetString(\"IntervalSeconds\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Key Bindings.\n        /// </summary>\n        internal static string KeyBindings {\n            get {\n                return ResourceManager.GetString(\"KeyBindings\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Keyboard.\n        /// </summary>\n        internal static string Keyboard {\n            get {\n                return ResourceManager.GetString(\"Keyboard\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Stop all apps using GPU when switching to Eco.\n        /// </summary>\n        internal static string KillGpuApps {\n            get {\n                return ResourceManager.GetString(\"KillGpuApps\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Laptop Backlight.\n        /// </summary>\n        internal static string LaptopBacklight {\n            get {\n                return ResourceManager.GetString(\"LaptopBacklight\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Laptop Keyboard.\n        /// </summary>\n        internal static string LaptopKeyboard {\n            get {\n                return ResourceManager.GetString(\"LaptopKeyboard\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Laptop Screen.\n        /// </summary>\n        internal static string LaptopScreen {\n            get {\n                return ResourceManager.GetString(\"LaptopScreen\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to LED Status Indicators.\n        /// </summary>\n        internal static string LEDStatusIndicators {\n            get {\n                return ResourceManager.GetString(\"LEDStatusIndicators\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Legend.\n        /// </summary>\n        internal static string Legend {\n            get {\n                return ResourceManager.GetString(\"Legend\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Can&apos;t check local version.\n        /// </summary>\n        internal static string LegendGray {\n            get {\n                return ResourceManager.GetString(\"LegendGray\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Updated.\n        /// </summary>\n        internal static string LegendGreen {\n            get {\n                return ResourceManager.GetString(\"LegendGreen\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Update Available.\n        /// </summary>\n        internal static string LegendRed {\n            get {\n                return ResourceManager.GetString(\"LegendRed\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Lid.\n        /// </summary>\n        internal static string Lid {\n            get {\n                return ResourceManager.GetString(\"Lid\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Lightbar.\n        /// </summary>\n        internal static string Lightbar {\n            get {\n                return ResourceManager.GetString(\"Lightbar\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Lighting.\n        /// </summary>\n        internal static string Lighting {\n            get {\n                return ResourceManager.GetString(\"Lighting\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Lock Screen.\n        /// </summary>\n        internal static string LockScreen {\n            get {\n                return ResourceManager.GetString(\"LockScreen\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Logo.\n        /// </summary>\n        internal static string Logo {\n            get {\n                return ResourceManager.GetString(\"Logo\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Low.\n        /// </summary>\n        internal static string Low {\n            get {\n                return ResourceManager.GetString(\"Low\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Left Stick Deadzones.\n        /// </summary>\n        internal static string LSDeadzones {\n            get {\n                return ResourceManager.GetString(\"LSDeadzones\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Left Trigger Deadzones.\n        /// </summary>\n        internal static string LTDeadzones {\n            get {\n                return ResourceManager.GetString(\"LTDeadzones\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Audio Visualizer.\n        /// </summary>\n        internal static string MatrixAudio {\n            get {\n                return ResourceManager.GetString(\"MatrixAudio\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Binary Banner.\n        /// </summary>\n        internal static string MatrixBanner {\n            get {\n                return ResourceManager.GetString(\"MatrixBanner\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Bright.\n        /// </summary>\n        internal static string MatrixBright {\n            get {\n                return ResourceManager.GetString(\"MatrixBright\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Clock.\n        /// </summary>\n        internal static string MatrixClock {\n            get {\n                return ResourceManager.GetString(\"MatrixClock\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Dim.\n        /// </summary>\n        internal static string MatrixDim {\n            get {\n                return ResourceManager.GetString(\"MatrixDim\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Rog Logo.\n        /// </summary>\n        internal static string MatrixLogo {\n            get {\n                return ResourceManager.GetString(\"MatrixLogo\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Medium.\n        /// </summary>\n        internal static string MatrixMedium {\n            get {\n                return ResourceManager.GetString(\"MatrixMedium\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Off.\n        /// </summary>\n        internal static string MatrixOff {\n            get {\n                return ResourceManager.GetString(\"MatrixOff\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Picture.\n        /// </summary>\n        internal static string MatrixPicture {\n            get {\n                return ResourceManager.GetString(\"MatrixPicture\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Max refresh rate for lower latency.\n        /// </summary>\n        internal static string MaxRefreshTooltip {\n            get {\n                return ResourceManager.GetString(\"MaxRefreshTooltip\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to 60Hz refresh rate to save battery.\n        /// </summary>\n        internal static string MinRefreshTooltip {\n            get {\n                return ResourceManager.GetString(\"MinRefreshTooltip\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Minute.\n        /// </summary>\n        internal static string Minute {\n            get {\n                return ResourceManager.GetString(\"Minute\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Minutes.\n        /// </summary>\n        internal static string Minutes {\n            get {\n                return ResourceManager.GetString(\"Minutes\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Angle Snapping / Tuning.\n        /// </summary>\n        internal static string MouseAngleSnapping {\n            get {\n                return ResourceManager.GetString(\"MouseAngleSnapping\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Auto Power Off After.\n        /// </summary>\n        internal static string MouseAutoPowerOff {\n            get {\n                return ResourceManager.GetString(\"MouseAutoPowerOff\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Button Response.\n        /// </summary>\n        internal static string MouseButtonResponse {\n            get {\n                return ResourceManager.GetString(\"MouseButtonResponse\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Import failed. Selected file is not a valid mouse profile or corrutpted..\n        /// </summary>\n        internal static string MouseImportFailed {\n            get {\n                return ResourceManager.GetString(\"MouseImportFailed\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Lift Off Distance.\n        /// </summary>\n        internal static string MouseLiftOffDistance {\n            get {\n                return ResourceManager.GetString(\"MouseLiftOffDistance\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Low Battery Warning at.\n        /// </summary>\n        internal static string MouseLowBatteryWarning {\n            get {\n                return ResourceManager.GetString(\"MouseLowBatteryWarning\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Motion Sync.\n        /// </summary>\n        internal static string MouseMotionSync {\n            get {\n                return ResourceManager.GetString(\"MouseMotionSync\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Performance.\n        /// </summary>\n        internal static string MousePerformance {\n            get {\n                return ResourceManager.GetString(\"MousePerformance\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Synchronize with mouse.\n        /// </summary>\n        internal static string MouseSynchronize {\n            get {\n                return ResourceManager.GetString(\"MouseSynchronize\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Zone Mode.\n        /// </summary>\n        internal static string MouseZoneMode {\n            get {\n                return ResourceManager.GetString(\"MouseZoneMode\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Multi Zone.\n        /// </summary>\n        internal static string Multizone {\n            get {\n                return ResourceManager.GetString(\"Multizone\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Multi Zone Strong.\n        /// </summary>\n        internal static string MultizoneStrong {\n            get {\n                return ResourceManager.GetString(\"MultizoneStrong\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Muted.\n        /// </summary>\n        internal static string Muted {\n            get {\n                return ResourceManager.GetString(\"Muted\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Mute Mic.\n        /// </summary>\n        internal static string MuteMic {\n            get {\n                return ResourceManager.GetString(\"MuteMic\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Never.\n        /// </summary>\n        internal static string Never {\n            get {\n                return ResourceManager.GetString(\"Never\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to New updates.\n        /// </summary>\n        internal static string NewUpdates {\n            get {\n                return ResourceManager.GetString(\"NewUpdates\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to No new updates.\n        /// </summary>\n        internal static string NoNewUpdates {\n            get {\n                return ResourceManager.GetString(\"NoNewUpdates\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Not Connected.\n        /// </summary>\n        internal static string NotConnected {\n            get {\n                return ResourceManager.GetString(\"NotConnected\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Off.\n        /// </summary>\n        internal static string Off {\n            get {\n                return ResourceManager.GetString(\"Off\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to On.\n        /// </summary>\n        internal static string On {\n            get {\n                return ResourceManager.GetString(\"On\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to One Zone.\n        /// </summary>\n        internal static string OneZone {\n            get {\n                return ResourceManager.GetString(\"OneZone\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Open G-Helper window.\n        /// </summary>\n        internal static string OpenGHelper {\n            get {\n                return ResourceManager.GetString(\"OpenGHelper\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Optimized.\n        /// </summary>\n        internal static string Optimized {\n            get {\n                return ResourceManager.GetString(\"Optimized\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Switch to Eco on battery and to Standard when plugged in.\n        /// </summary>\n        internal static string OptimizedGPUTooltip {\n            get {\n                return ResourceManager.GetString(\"OptimizedGPUTooltip\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Keep GPU disabled on USB-C charger in Optimized mode.\n        /// </summary>\n        internal static string OptimizedUSBC {\n            get {\n                return ResourceManager.GetString(\"OptimizedUSBC\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Other.\n        /// </summary>\n        internal static string Other {\n            get {\n                return ResourceManager.GetString(\"Other\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Overdrive.\n        /// </summary>\n        internal static string Overdrive {\n            get {\n                return ResourceManager.GetString(\"Overdrive\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Mode.\n        /// </summary>\n        internal static string PerformanceMode {\n            get {\n                return ResourceManager.GetString(\"PerformanceMode\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Peripherals.\n        /// </summary>\n        internal static string Peripherals {\n            get {\n                return ResourceManager.GetString(\"Peripherals\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Picture / Gif.\n        /// </summary>\n        internal static string PictureGif {\n            get {\n                return ResourceManager.GetString(\"PictureGif\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Play / Pause.\n        /// </summary>\n        internal static string PlayPause {\n            get {\n                return ResourceManager.GetString(\"PlayPause\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Polling Rate.\n        /// </summary>\n        internal static string PollingRate {\n            get {\n                return ResourceManager.GetString(\"PollingRate\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Power Limits.\n        /// </summary>\n        internal static string PowerLimits {\n            get {\n                return ResourceManager.GetString(\"PowerLimits\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Power Limits is an experimental feature. Use carefully and at your own risk!.\n        /// </summary>\n        internal static string PPTExperimental {\n            get {\n                return ResourceManager.GetString(\"PPTExperimental\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to PrintScreen.\n        /// </summary>\n        internal static string PrintScreen {\n            get {\n                return ResourceManager.GetString(\"PrintScreen\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Profile.\n        /// </summary>\n        internal static string Profile {\n            get {\n                return ResourceManager.GetString(\"Profile\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Quit.\n        /// </summary>\n        internal static string Quit {\n            get {\n                return ResourceManager.GetString(\"Quit\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Reset.\n        /// </summary>\n        internal static string Reset {\n            get {\n                return ResourceManager.GetString(\"Reset\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Something is using dGPU and preventing Eco mode. Let G-Helper try to restart dGPU in device manager? (Please proceed at your own risk).\n        /// </summary>\n        internal static string RestartGPU {\n            get {\n                return ResourceManager.GetString(\"RestartGPU\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to RPM.\n        /// </summary>\n        internal static string RPM {\n            get {\n                return ResourceManager.GetString(\"RPM\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Right Stick Deadzones.\n        /// </summary>\n        internal static string RSDeadzones {\n            get {\n                return ResourceManager.GetString(\"RSDeadzones\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Right Trigger Deadzones.\n        /// </summary>\n        internal static string RTDeadzones {\n            get {\n                return ResourceManager.GetString(\"RTDeadzones\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Run on Startup.\n        /// </summary>\n        internal static string RunOnStartup {\n            get {\n                return ResourceManager.GetString(\"RunOnStartup\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Scaling Quality.\n        /// </summary>\n        internal static string ScalingQuality {\n            get {\n                return ResourceManager.GetString(\"ScalingQuality\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Screenpad Brightness Down.\n        /// </summary>\n        internal static string ScreenPadDown {\n            get {\n                return ResourceManager.GetString(\"ScreenPadDown\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Screenpad Brightness Up.\n        /// </summary>\n        internal static string ScreenPadUp {\n            get {\n                return ResourceManager.GetString(\"ScreenPadUp\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Shutdown.\n        /// </summary>\n        internal static string Shutdown {\n            get {\n                return ResourceManager.GetString(\"Shutdown\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Silent.\n        /// </summary>\n        internal static string Silent {\n            get {\n                return ResourceManager.GetString(\"Silent\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Battery Level.\n        /// </summary>\n        internal static string SlashBatteryLevel {\n            get {\n                return ResourceManager.GetString(\"SlashBatteryLevel\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Bit Stream.\n        /// </summary>\n        internal static string SlashBitStream {\n            get {\n                return ResourceManager.GetString(\"SlashBitStream\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Bounce.\n        /// </summary>\n        internal static string SlashBounce {\n            get {\n                return ResourceManager.GetString(\"SlashBounce\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Buzzer.\n        /// </summary>\n        internal static string SlashBuzzer {\n            get {\n                return ResourceManager.GetString(\"SlashBuzzer\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Flow.\n        /// </summary>\n        internal static string SlashFlow {\n            get {\n                return ResourceManager.GetString(\"SlashFlow\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Flux.\n        /// </summary>\n        internal static string SlashFlux {\n            get {\n                return ResourceManager.GetString(\"SlashFlux\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Game Over.\n        /// </summary>\n        internal static string SlashGameOver {\n            get {\n                return ResourceManager.GetString(\"SlashGameOver\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Hazard.\n        /// </summary>\n        internal static string SlashHazard {\n            get {\n                return ResourceManager.GetString(\"SlashHazard\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Interfacing.\n        /// </summary>\n        internal static string SlashInterfacing {\n            get {\n                return ResourceManager.GetString(\"SlashInterfacing\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Loading.\n        /// </summary>\n        internal static string SlashLoading {\n            get {\n                return ResourceManager.GetString(\"SlashLoading\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Slash.\n        /// </summary>\n        internal static string SlashMode {\n            get {\n                return ResourceManager.GetString(\"SlashMode\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Phantom.\n        /// </summary>\n        internal static string SlashPhantom {\n            get {\n                return ResourceManager.GetString(\"SlashPhantom\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Ramp.\n        /// </summary>\n        internal static string SlashRamp {\n            get {\n                return ResourceManager.GetString(\"SlashRamp\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Spectrum.\n        /// </summary>\n        internal static string SlashSpectrum {\n            get {\n                return ResourceManager.GetString(\"SlashSpectrum\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Start.\n        /// </summary>\n        internal static string SlashStart {\n            get {\n                return ResourceManager.GetString(\"SlashStart\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Static.\n        /// </summary>\n        internal static string SlashStatic {\n            get {\n                return ResourceManager.GetString(\"SlashStatic\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Transmission.\n        /// </summary>\n        internal static string SlashTransmission {\n            get {\n                return ResourceManager.GetString(\"SlashTransmission\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Sleep.\n        /// </summary>\n        internal static string Sleep {\n            get {\n                return ResourceManager.GetString(\"Sleep\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Enables dGPU for standard use.\n        /// </summary>\n        internal static string StandardGPUTooltip {\n            get {\n                return ResourceManager.GetString(\"StandardGPUTooltip\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Standard.\n        /// </summary>\n        internal static string StandardMode {\n            get {\n                return ResourceManager.GetString(\"StandardMode\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Start.\n        /// </summary>\n        internal static string Start {\n            get {\n                return ResourceManager.GetString(\"Start\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Starting Services.\n        /// </summary>\n        internal static string StartingServices {\n            get {\n                return ResourceManager.GetString(\"StartingServices\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Startup Error.\n        /// </summary>\n        internal static string StartupError {\n            get {\n                return ResourceManager.GetString(\"StartupError\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Stop.\n        /// </summary>\n        internal static string Stop {\n            get {\n                return ResourceManager.GetString(\"Stop\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Stop GPU Applications.\n        /// </summary>\n        internal static string StopGPUApps {\n            get {\n                return ResourceManager.GetString(\"StopGPUApps\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Stopping Services.\n        /// </summary>\n        internal static string StoppingServices {\n            get {\n                return ResourceManager.GetString(\"StoppingServices\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Toggle Aura.\n        /// </summary>\n        internal static string ToggleAura {\n            get {\n                return ResourceManager.GetString(\"ToggleAura\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Auto Toggle Clamshell Mode.\n        /// </summary>\n        internal static string ToggleClamshellMode {\n            get {\n                return ResourceManager.GetString(\"ToggleClamshellMode\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Toggle Fn-Lock.\n        /// </summary>\n        internal static string ToggleFnLock {\n            get {\n                return ResourceManager.GetString(\"ToggleFnLock\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Toggle Miniled (if supported).\n        /// </summary>\n        internal static string ToggleMiniled {\n            get {\n                return ResourceManager.GetString(\"ToggleMiniled\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Toggle Screen.\n        /// </summary>\n        internal static string ToggleScreen {\n            get {\n                return ResourceManager.GetString(\"ToggleScreen\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Toggle Touchscreen.\n        /// </summary>\n        internal static string ToggleTouchscreen {\n            get {\n                return ResourceManager.GetString(\"ToggleTouchscreen\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Touchscreen.\n        /// </summary>\n        internal static string Touchscreen {\n            get {\n                return ResourceManager.GetString(\"Touchscreen\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Turbo.\n        /// </summary>\n        internal static string Turbo {\n            get {\n                return ResourceManager.GetString(\"Turbo\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Turned off.\n        /// </summary>\n        internal static string TurnedOff {\n            get {\n                return ResourceManager.GetString(\"TurnedOff\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Disable on battery.\n        /// </summary>\n        internal static string TurnOffOnBattery {\n            get {\n                return ResourceManager.GetString(\"TurnOffOnBattery\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Routes laptop screen to dGPU, maximizing FPS.\n        /// </summary>\n        internal static string UltimateGPUTooltip {\n            get {\n                return ResourceManager.GetString(\"UltimateGPUTooltip\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Ultimate.\n        /// </summary>\n        internal static string UltimateMode {\n            get {\n                return ResourceManager.GetString(\"UltimateMode\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Undervolting is an experimental and risky feature. If applied values are too low for your hardware, it can become unstable, shut down or cause data corruption. If you want to try - start from small values first, click Apply and test what works for you..\n        /// </summary>\n        internal static string UndervoltingRisky {\n            get {\n                return ResourceManager.GetString(\"UndervoltingRisky\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Unmuted.\n        /// </summary>\n        internal static string Unmuted {\n            get {\n                return ResourceManager.GetString(\"Unmuted\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Updates.\n        /// </summary>\n        internal static string Updates {\n            get {\n                return ResourceManager.GetString(\"Updates\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Version.\n        /// </summary>\n        internal static string VersionLabel {\n            get {\n                return ResourceManager.GetString(\"VersionLabel\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Vibration Strength.\n        /// </summary>\n        internal static string VibrationStrength {\n            get {\n                return ResourceManager.GetString(\"VibrationStrength\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Visual Mode.\n        /// </summary>\n        internal static string VisualMode {\n            get {\n                return ResourceManager.GetString(\"VisualMode\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Visual Modes are not available when HDR is active.\n        /// </summary>\n        internal static string VisualModesHDR {\n            get {\n                return ResourceManager.GetString(\"VisualModesHDR\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Visual Modes are not available when laptop screen is off.\n        /// </summary>\n        internal static string VisualModesScreen {\n            get {\n                return ResourceManager.GetString(\"VisualModesScreen\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Volume Down.\n        /// </summary>\n        internal static string VolumeDown {\n            get {\n                return ResourceManager.GetString(\"VolumeDown\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Volume Mute.\n        /// </summary>\n        internal static string VolumeMute {\n            get {\n                return ResourceManager.GetString(\"VolumeMute\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Volume Up.\n        /// </summary>\n        internal static string VolumeUp {\n            get {\n                return ResourceManager.GetString(\"VolumeUp\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Keep app window always on top.\n        /// </summary>\n        internal static string WindowTop {\n            get {\n                return ResourceManager.GetString(\"WindowTop\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Zoom.\n        /// </summary>\n        internal static string Zoom {\n            get {\n                return ResourceManager.GetString(\"Zoom\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/Properties/Strings.ar.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" id=\"root\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\"/>\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"name\" type=\"xsd:string\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\"/>\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Acceleration\" xml:space=\"preserve\">\n    <value>تسارع</value>\n  </data>\n  <data name=\"ACPIError\" xml:space=\"preserve\">\n    <value>تعذر الاتصال بنظام الطاقة المتقدم من أسوس. لا يمكن للتطبيق العمل بدون هذا النظام. يرجى محاولة تثبيت واجهة التحكم لنظام أسوس.</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestart\" xml:space=\"preserve\">\n    <value>أعد تشغيل جهازك لتطبيق التغييرات</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestartTitle\" xml:space=\"preserve\">\n    <value>هل تريد إعادة التشغيل الآن؟</value>\n  </data>\n  <data name=\"AlertDGPU\" xml:space=\"preserve\">\n    <value>يبدو أن وحدة معالجة الرسومات قيد الاستخدام المكثف، هل ترغب في تعطيلها؟</value>\n  </data>\n  <data name=\"AlertDGPUTitle\" xml:space=\"preserve\">\n    <value>وضع التوفير</value>\n  </data>\n  <data name=\"AlertUltimateOff\" xml:space=\"preserve\">\n    <value>إيقاف وضع الأداء العالي يتطلب إعادة تشغيل</value>\n  </data>\n  <data name=\"AlertUltimateOn\" xml:space=\"preserve\">\n    <value>تفعيل وضع الأداء العالي يتطلب إعادة تشغيل</value>\n  </data>\n  <data name=\"AlertUltimateTitle\" xml:space=\"preserve\">\n    <value>إعادة التشغيل الآن؟</value>\n  </data>\n  <data name=\"AllyController\" xml:space=\"preserve\">\n    <value>وحدة تحكم ألي</value>\n  </data>\n  <data name=\"AnimationSpeed\" xml:space=\"preserve\">\n    <value>سرعة الحركة</value>\n  </data>\n  <data name=\"AnimeMatrix\" xml:space=\"preserve\">\n    <value>أنمي ماتريكس</value>\n  </data>\n  <data name=\"AppAlreadyRunning\" xml:space=\"preserve\">\n    <value>التطبيق يعمل بالفعل</value>\n  </data>\n  <data name=\"AppAlreadyRunningText\" xml:space=\"preserve\">\n    <value>التطبيق يعمل بالفعل. يمكنك العثور على أيقونته في شريط المهام بجانب الساعة.</value>\n  </data>\n  <data name=\"Apply\" xml:space=\"preserve\">\n    <value>تطبيق</value>\n  </data>\n  <data name=\"ApplyFanCurve\" xml:space=\"preserve\">\n    <value>تطبيق منحنى المروحة المخصص</value>\n  </data>\n  <data name=\"ApplyPowerLimits\" xml:space=\"preserve\">\n    <value>تطبيق حدود الطاقة</value>\n  </data>\n  <data name=\"ApplyWindowsPowerPlan\" xml:space=\"preserve\">\n    <value>ضبط أوضاع طاقة ويندوز تلقائيًا</value>\n  </data>\n  <data name=\"APUMemory\" xml:space=\"preserve\">\n    <value>الذاكرة المخصصة لوحدة معالجة الرسومات</value>\n  </data>\n  <data name=\"AsusServicesRunning\" xml:space=\"preserve\">\n    <value>خدمات أسوس قيد التشغيل</value>\n  </data>\n  <data name=\"AuraBatteryState\" xml:space=\"preserve\">\n    <value>حالة البطارية</value>\n  </data>\n  <data name=\"AuraBreathe\" xml:space=\"preserve\">\n    <value>تنفس</value>\n  </data>\n  <data name=\"AuraClockwise\" xml:space=\"preserve\">\n    <value>باتجاه عقارب الساعة</value>\n  </data>\n  <data name=\"AuraColorCycle\" xml:space=\"preserve\">\n    <value>دورة الألوان</value>\n  </data>\n  <data name=\"AuraComet\" xml:space=\"preserve\">\n    <value>مذنب</value>\n  </data>\n  <data name=\"AuraCounterClockwise\" xml:space=\"preserve\">\n    <value>عكس عقارب الساعة</value>\n  </data>\n  <data name=\"AuraFast\" xml:space=\"preserve\">\n    <value>سريع</value>\n  </data>\n  <data name=\"AuraLightingMode\" xml:space=\"preserve\">\n    <value>وضع الإضاءة</value>\n  </data>\n  <data name=\"AuraNormal\" xml:space=\"preserve\">\n    <value>عادي</value>\n  </data>\n  <data name=\"AuraRainbow\" xml:space=\"preserve\">\n    <value>قوس قزح</value>\n  </data>\n  <data name=\"AuraRandomColor\" xml:space=\"preserve\">\n    <value>عشوائي</value>\n  </data>\n  <data name=\"AuraReact\" xml:space=\"preserve\">\n    <value>تفاعل</value>\n  </data>\n  <data name=\"AuraSlow\" xml:space=\"preserve\">\n    <value>بطيء</value>\n  </data>\n  <data name=\"AuraStatic\" xml:space=\"preserve\">\n    <value>ثابت</value>\n  </data>\n  <data name=\"AuraStrobe\" xml:space=\"preserve\">\n    <value>وميض</value>\n  </data>\n  <data name=\"AuraZoneAll\" xml:space=\"preserve\">\n    <value>الكل</value>\n  </data>\n  <data name=\"AuraZoneDock\" xml:space=\"preserve\">\n    <value>القاعدة</value>\n  </data>\n  <data name=\"AuraZoneLogo\" xml:space=\"preserve\">\n    <value>الشعار</value>\n  </data>\n  <data name=\"AuraZoneScroll\" xml:space=\"preserve\">\n    <value>عجلة التمرير</value>\n  </data>\n  <data name=\"AuraZoneUnderglow\" xml:space=\"preserve\">\n    <value>الإضاءة السفلية</value>\n  </data>\n  <data name=\"AutoApply\" xml:space=\"preserve\">\n    <value>تطبيق تلقائي</value>\n  </data>\n  <data name=\"AutoMode\" xml:space=\"preserve\">\n    <value>تلقائي</value>\n  </data>\n  <data name=\"AutoRefreshTooltip\" xml:space=\"preserve\">\n    <value>يضبط الترددَ على 60 هرتز لتوفيرِ البطاريةِ، ويعود للوضعِ السابقِ عند التوصيلِ بالكهرباء</value>\n  </data>\n  <data name=\"Awake\" xml:space=\"preserve\">\n    <value>نشط</value>\n  </data>\n  <data name=\"BacklightLow\" xml:space=\"preserve\">\n    <value>منخفض</value>\n  </data>\n  <data name=\"BacklightMax\" xml:space=\"preserve\">\n    <value>أقصى</value>\n  </data>\n  <data name=\"BacklightMid\" xml:space=\"preserve\">\n    <value>متوسط</value>\n  </data>\n  <data name=\"BacklightOff\" xml:space=\"preserve\">\n    <value>إيقاف</value>\n  </data>\n  <data name=\"BacklightTimeout\" xml:space=\"preserve\">\n    <value>مهلة الإضاءة عند التوصيل/على البطارية (0 - تشغيل)</value>\n  </data>\n  <data name=\"BacklightTimeoutBattery\" xml:space=\"preserve\">\n    <value>مهلة إضاءة الخلفية عند استخدام البطارية</value>\n  </data>\n  <data name=\"BacklightTimeoutPlugged\" xml:space=\"preserve\">\n    <value>مهلة إضاءة الخلفية عند التوصيل بالكهرباء</value>\n  </data>\n  <data name=\"Balanced\" xml:space=\"preserve\">\n    <value>متوازن</value>\n  </data>\n  <data name=\"BatteryCharge\" xml:space=\"preserve\">\n    <value>شحن</value>\n  </data>\n  <data name=\"BatteryChargeLimit\" xml:space=\"preserve\">\n    <value>حد شحن البطارية</value>\n  </data>\n  <data name=\"BatteryHealth\" xml:space=\"preserve\">\n    <value>صحة البطارية</value>\n  </data>\n  <data name=\"BatteryLimitFull\" xml:space=\"preserve\">\n    <value>شحن لمرة واحدة إلى 100٪</value>\n  </data>\n  <data name=\"Binding\" xml:space=\"preserve\">\n    <value>ربط</value>\n  </data>\n  <data name=\"BindingPrimary\" xml:space=\"preserve\">\n    <value>أساسي</value>\n  </data>\n  <data name=\"BindingSecondary\" xml:space=\"preserve\">\n    <value>ثانوي</value>\n  </data>\n  <data name=\"BiosAndDriverUpdates\" xml:space=\"preserve\">\n    <value>تحديثات البيوس والتعريفات</value>\n  </data>\n  <data name=\"Boot\" xml:space=\"preserve\">\n    <value>إقلاع</value>\n  </data>\n  <data name=\"BootSound\" xml:space=\"preserve\">\n    <value>صوت الإقلاع</value>\n  </data>\n  <data name=\"Brightness\" xml:space=\"preserve\">\n    <value>السطوع</value>\n  </data>\n  <data name=\"BrightnessDown\" xml:space=\"preserve\">\n    <value>تخفيض السطوع</value>\n  </data>\n  <data name=\"BrightnessUp\" xml:space=\"preserve\">\n    <value>رفع السطوع</value>\n  </data>\n  <data name=\"BWTrayIcon\" xml:space=\"preserve\">\n    <value>أيقونة شريط المهام بالأبيض والأسود</value>\n  </data>\n  <data name=\"Calibrate\" xml:space=\"preserve\">\n    <value>معايرة</value>\n  </data>\n  <data name=\"Charging\" xml:space=\"preserve\">\n    <value>جاري الشحن</value>\n  </data>\n  <data name=\"Color\" xml:space=\"preserve\">\n    <value>اللون</value>\n  </data>\n  <data name=\"Contrast\" xml:space=\"preserve\">\n    <value>التباين</value>\n  </data>\n  <data name=\"Controller\" xml:space=\"preserve\">\n    <value>وحدة التحكم</value>\n  </data>\n  <data name=\"CPUBoost\" xml:space=\"preserve\">\n    <value>تعزيز وحدة المعالجة المركزية</value>\n  </data>\n  <data name=\"Custom\" xml:space=\"preserve\">\n    <value>مخصص</value>\n  </data>\n  <data name=\"Deceleration\" xml:space=\"preserve\">\n    <value>إبطاء</value>\n  </data>\n  <data name=\"Default\" xml:space=\"preserve\">\n    <value>افتراضي</value>\n  </data>\n  <data name=\"DisableController\" xml:space=\"preserve\">\n    <value>تعطيل وحدة التحكم</value>\n  </data>\n  <data name=\"DisableOnLidClose\" xml:space=\"preserve\">\n    <value>تعطيل عند إغلاق الغطاء</value>\n  </data>\n  <data name=\"DisableOverdrive\" xml:space=\"preserve\">\n    <value>تعطيل تسريع الشاشة</value>\n  </data>\n  <data name=\"Discharging\" xml:space=\"preserve\">\n    <value>تفريغ الشحن</value>\n  </data>\n  <data name=\"DownloadColorProfiles\" xml:space=\"preserve\">\n    <value>تحميل ملفات تعريف الألوان</value>\n  </data>\n  <data name=\"DownloadUpdate\" xml:space=\"preserve\">\n    <value>تحميل</value>\n  </data>\n  <data name=\"DriverAndSoftware\" xml:space=\"preserve\">\n    <value>التعريفات والبرامج</value>\n  </data>\n  <data name=\"EcoGPUTooltip\" xml:space=\"preserve\">\n    <value>تعطيلُ كرتِ الشاشةِ المنفصلِ لتوفيرِ البطاريةِ</value>\n  </data>\n  <data name=\"EcoMode\" xml:space=\"preserve\">\n    <value>توفير الطاقة</value>\n  </data>\n  <data name=\"EnableGPUOnShutdown\" xml:space=\"preserve\">\n    <value>تفعيل كرت الشاشة عند الإغلاق (يمنع مشاكل وضع التوفير)</value>\n  </data>\n  <data name=\"EnableOptimusText\" xml:space=\"preserve\">\n    <value>تعطيل كرت الشاشة المنفصل عن طريق وضع التوفير بينما وضع العرض في لوحة تحكم NVIDIA غير مضبوط على Optimus قد يسبب مشاكل في التحكم بالسطوع حتى إعادة التشغيل القادمة.\n\nهل ترغب في المتابعة؟</value>\n  </data>\n  <data name=\"EnableOptimusTitle\" xml:space=\"preserve\">\n    <value>وضع عرض NVIDIA غير مضبوط على Optimus</value>\n  </data>\n  <data name=\"EnergySettings\" xml:space=\"preserve\">\n    <value>إعدادات الطاقة</value>\n  </data>\n  <data name=\"Export\" xml:space=\"preserve\">\n    <value>تصدير الملف الشخصي</value>\n  </data>\n  <data name=\"Extra\" xml:space=\"preserve\">\n    <value>إضافي</value>\n  </data>\n  <data name=\"ExtraSettings\" xml:space=\"preserve\">\n    <value>إعدادات إضافية</value>\n  </data>\n  <data name=\"FactoryDefaults\" xml:space=\"preserve\">\n    <value>إعدادات المصنع الافتراضية</value>\n  </data>\n  <data name=\"FanCurves\" xml:space=\"preserve\">\n    <value>منحنيات المروحة</value>\n  </data>\n  <data name=\"FanProfileCPU\" xml:space=\"preserve\">\n    <value>ملف تعريف مروحة وحدة المعالجة المركزية</value>\n  </data>\n  <data name=\"FanProfileGPU\" xml:space=\"preserve\">\n    <value>ملف تعريف مروحة وحدة معالجة الرسومات</value>\n  </data>\n  <data name=\"FanProfileMid\" xml:space=\"preserve\">\n    <value>ملف تعريف المروحة المتوسطة</value>\n  </data>\n  <data name=\"FanProfiles\" xml:space=\"preserve\">\n    <value>ملفات تعريف المروحة</value>\n  </data>\n  <data name=\"FansAndPower\" xml:space=\"preserve\">\n    <value>المراوح والطاقة</value>\n  </data>\n  <data name=\"FanSpeed\" xml:space=\"preserve\">\n    <value>المروحة</value>\n  </data>\n  <data name=\"FansPower\" xml:space=\"preserve\">\n    <value>المراوح + الطاقة</value>\n  </data>\n  <data name=\"FlickerFreeDimming\" xml:space=\"preserve\">\n    <value>تعتيم بدون وميض</value>\n  </data>\n  <data name=\"FnLock\" xml:space=\"preserve\">\n    <value>معالجة مفاتيح Fn+F بدون Fn</value>\n  </data>\n  <data name=\"FnLockOff\" xml:space=\"preserve\">\n    <value>إيقاف قفل FN</value>\n  </data>\n  <data name=\"FnLockOn\" xml:space=\"preserve\">\n    <value>تشغيل قفل FN</value>\n  </data>\n  <data name=\"GPUBoost\" xml:space=\"preserve\">\n    <value>تعزيز ديناميكي</value>\n  </data>\n  <data name=\"GPUChanging\" xml:space=\"preserve\">\n    <value>جاري التغيير</value>\n  </data>\n  <data name=\"GPUCoreClockOffset\" xml:space=\"preserve\">\n    <value>إزاحة تردد النواة</value>\n  </data>\n  <data name=\"GPUMemoryClockOffset\" xml:space=\"preserve\">\n    <value>إزاحة تردد الذاكرة</value>\n  </data>\n  <data name=\"GPUMode\" xml:space=\"preserve\">\n    <value>وضع وحدة معالجة الرسومات</value>\n  </data>\n  <data name=\"GPUModeEco\" xml:space=\"preserve\">\n    <value>وحدة معالجة الرسومات المدمجة فقط</value>\n  </data>\n  <data name=\"GPUModeStandard\" xml:space=\"preserve\">\n    <value>وحدة معالجة الرسومات المدمجة + المنفصلة</value>\n  </data>\n  <data name=\"GPUModeUltimate\" xml:space=\"preserve\">\n    <value>وحدة معالجة الرسومات المنفصلة حصرًا</value>\n  </data>\n  <data name=\"GPUPower\" xml:space=\"preserve\">\n    <value>طاقة وحدة معالجة الرسومات</value>\n  </data>\n  <data name=\"GPUSettings\" xml:space=\"preserve\">\n    <value>إعدادات وحدة معالجة الرسومات</value>\n  </data>\n  <data name=\"GPUTempTarget\" xml:space=\"preserve\">\n    <value>هدف درجة الحرارة</value>\n  </data>\n  <data name=\"HibernateAfter\" xml:space=\"preserve\">\n    <value>دقائق حتى السبات أثناء النوم على البطارية (0 - إيقاف)</value>\n  </data>\n  <data name=\"High\" xml:space=\"preserve\">\n    <value>مرتفع</value>\n  </data>\n  <data name=\"ImageRotation\" xml:space=\"preserve\">\n    <value>تدوير الصورة</value>\n  </data>\n  <data name=\"Import\" xml:space=\"preserve\">\n    <value>استيراد الملف الشخصي</value>\n  </data>\n  <data name=\"KeyBindings\" xml:space=\"preserve\">\n    <value>تعيينات المفاتيح</value>\n  </data>\n  <data name=\"Keyboard\" xml:space=\"preserve\">\n    <value>لوحة المفاتيح</value>\n  </data>\n  <data name=\"KillGpuApps\" xml:space=\"preserve\">\n    <value>إيقاف جميع التطبيقات التي تستخدم وحدة معالجة الرسومات عند التبديل إلى وضع التوفير</value>\n  </data>\n  <data name=\"LaptopBacklight\" xml:space=\"preserve\">\n    <value>إضاءة خلفية للحاسوب المحمول</value>\n  </data>\n  <data name=\"LaptopKeyboard\" xml:space=\"preserve\">\n    <value>لوحة مفاتيح الحاسوب المحمول</value>\n  </data>\n  <data name=\"LaptopScreen\" xml:space=\"preserve\">\n    <value>شاشة الحاسوب المحمول</value>\n  </data>\n  <data name=\"LEDStatusIndicators\" xml:space=\"preserve\">\n    <value>مؤشرات حالة LED</value>\n  </data>\n  <data name=\"Lid\" xml:space=\"preserve\">\n    <value>غطاء</value>\n  </data>\n  <data name=\"Lightbar\" xml:space=\"preserve\">\n    <value>شريط الإضاءة</value>\n  </data>\n  <data name=\"Lighting\" xml:space=\"preserve\">\n    <value>الإضاءة</value>\n  </data>\n  <data name=\"LockScreen\" xml:space=\"preserve\">\n    <value>قفل الشاشة</value>\n  </data>\n  <data name=\"Logo\" xml:space=\"preserve\">\n    <value>الشعار</value>\n  </data>\n  <data name=\"Low\" xml:space=\"preserve\">\n    <value>منخفض</value>\n  </data>\n  <data name=\"LSDeadzones\" xml:space=\"preserve\">\n    <value>مناطق الخمول للعصا اليسرى</value>\n  </data>\n  <data name=\"LTDeadzones\" xml:space=\"preserve\">\n    <value>مناطق الخمول للزناد الأيسر</value>\n  </data>\n  <data name=\"MatrixAudio\" xml:space=\"preserve\">\n    <value>مؤثرات الصوت المرئية</value>\n  </data>\n  <data name=\"MatrixBanner\" xml:space=\"preserve\">\n    <value>لافتة ثنائية</value>\n  </data>\n  <data name=\"MatrixBright\" xml:space=\"preserve\">\n    <value>ساطع</value>\n  </data>\n  <data name=\"MatrixClock\" xml:space=\"preserve\">\n    <value>ساعة</value>\n  </data>\n  <data name=\"MatrixDim\" xml:space=\"preserve\">\n    <value>خافت</value>\n  </data>\n  <data name=\"MatrixLogo\" xml:space=\"preserve\">\n    <value>شعار ROG</value>\n  </data>\n  <data name=\"MatrixMedium\" xml:space=\"preserve\">\n    <value>متوسط</value>\n  </data>\n  <data name=\"MatrixOff\" xml:space=\"preserve\">\n    <value>إيقاف</value>\n  </data>\n  <data name=\"MatrixPicture\" xml:space=\"preserve\">\n    <value>صورة</value>\n  </data>\n  <data name=\"MaxRefreshTooltip\" xml:space=\"preserve\">\n    <value>أعلى معدل تحديث لأقل تأخير</value>\n  </data>\n  <data name=\"MinRefreshTooltip\" xml:space=\"preserve\">\n    <value>معدل تحديث 60 هرتز لتوفير البطارية</value>\n  </data>\n  <data name=\"Minute\" xml:space=\"preserve\">\n    <value>دقيقة</value>\n  </data>\n  <data name=\"Minutes\" xml:space=\"preserve\">\n    <value>دقائق</value>\n  </data>\n  <data name=\"MouseAngleSnapping\" xml:space=\"preserve\">\n    <value>Angle Snapping / Tuning</value>\n  </data>\n  <data name=\"MouseAutoPowerOff\" xml:space=\"preserve\">\n    <value>إيقاف تشغيل الماوس تلقائيًا بعد</value>\n  </data>\n  <data name=\"MouseButtonResponse\" xml:space=\"preserve\">\n    <value>استجابة أزرار الماوس</value>\n  </data>\n  <data name=\"MouseImportFailed\" xml:space=\"preserve\">\n    <value>فشل الاستيراد. الملف المحدد ليس ملف إعدادات ماوس صالح أو تالف.</value>\n  </data>\n  <data name=\"MouseLiftOffDistance\" xml:space=\"preserve\">\n    <value>مسافة رفع الماوس</value>\n  </data>\n  <data name=\"MouseLowBatteryWarning\" xml:space=\"preserve\">\n    <value>تحذير بطارية الماوس المنخفضة عند</value>\n  </data>\n  <data name=\"MousePerformance\" xml:space=\"preserve\">\n    <value>أداء</value>\n  </data>\n  <data name=\"MouseSynchronize\" xml:space=\"preserve\">\n    <value>مزامنة مع الماوس</value>\n  </data>\n  <data name=\"Multizone\" xml:space=\"preserve\">\n    <value>عدة مناطق</value>\n  </data>\n  <data name=\"MultizoneStrong\" xml:space=\"preserve\">\n    <value>عدة مناطق قوية</value>\n  </data>\n  <data name=\"Muted\" xml:space=\"preserve\">\n    <value>مكتوم</value>\n  </data>\n  <data name=\"MuteMic\" xml:space=\"preserve\">\n    <value>كتم الميكروفون</value>\n  </data>\n  <data name=\"Never\" xml:space=\"preserve\">\n    <value>أبدًا</value>\n  </data>\n  <data name=\"NewUpdates\" xml:space=\"preserve\">\n    <value>تحديثات جديدة</value>\n  </data>\n  <data name=\"NoNewUpdates\" xml:space=\"preserve\">\n    <value>لا توجد تحديثات جديدة</value>\n  </data>\n  <data name=\"NotConnected\" xml:space=\"preserve\">\n    <value>غير متصل</value>\n  </data>\n  <data name=\"Off\" xml:space=\"preserve\">\n    <value>إيقاف</value>\n  </data>\n  <data name=\"On\" xml:space=\"preserve\">\n    <value>تشغيل</value>\n  </data>\n  <data name=\"OneZone\" xml:space=\"preserve\">\n    <value>منطقة واحدة</value>\n  </data>\n  <data name=\"OpenGHelper\" xml:space=\"preserve\">\n    <value>فتح نافذة G-Helper</value>\n  </data>\n  <data name=\"Optimized\" xml:space=\"preserve\">\n    <value>محسّن</value>\n  </data>\n  <data name=\"OptimizedGPUTooltip\" xml:space=\"preserve\">\n    <value>التبديلُ إلى وضعِ التوفيرِ عند استخدامِ البطاريةِ وإلى وضعٍ قياسيٍّ عند التوصيلِ بالكهرباءِ</value>\n  </data>\n  <data name=\"OptimizedUSBC\" xml:space=\"preserve\">\n    <value>الحفاظ على وحدة معالجة الرسومات معطلة عند استخدام شاحن USB-C في الوضع المحسّن</value>\n  </data>\n  <data name=\"Other\" xml:space=\"preserve\">\n    <value>أخرى</value>\n  </data>\n  <data name=\"Overdrive\" xml:space=\"preserve\">\n    <value>تسريع</value>\n  </data>\n  <data name=\"PerformanceMode\" xml:space=\"preserve\">\n    <value>وضع</value>\n  </data>\n  <data name=\"Peripherals\" xml:space=\"preserve\">\n    <value>الأجهزة الطرفية</value>\n  </data>\n  <data name=\"PictureGif\" xml:space=\"preserve\">\n    <value>صورة / Gif</value>\n  </data>\n  <data name=\"PlayPause\" xml:space=\"preserve\">\n    <value>تشغيل / إيقاف مؤقت</value>\n  </data>\n  <data name=\"PollingRate\" xml:space=\"preserve\">\n    <value>معدل الاستطلاع</value>\n  </data>\n  <data name=\"PowerLimits\" xml:space=\"preserve\">\n    <value>حدود الطاقة</value>\n  </data>\n  <data name=\"PPTExperimental\" xml:space=\"preserve\">\n    <value>حدود الطاقة هي ميزة تجريبية. استخدمها بحذر وعلى مسؤوليتك الخاصة!</value>\n  </data>\n  <data name=\"PrintScreen\" xml:space=\"preserve\">\n    <value>طباعة الشاشة</value>\n  </data>\n  <data name=\"Profile\" xml:space=\"preserve\">\n    <value>ملف التعريف</value>\n  </data>\n  <data name=\"Quit\" xml:space=\"preserve\">\n    <value>خروج</value>\n  </data>\n  <data name=\"Reset\" xml:space=\"preserve\">\n    <value>إعادة ضبط</value>\n  </data>\n  <data name=\"RestartGPU\" xml:space=\"preserve\">\n    <value>هناك شيء يستخدم وحدة معالجة الرسومات المنفصلة ويمنع وضع التوفير. هل تريد أن يحاول G-Helper إعادة تشغيل وحدة معالجة الرسومات في مدير الأجهزة؟ (يرجى المتابعة على مسؤوليتك الخاصة)</value>\n  </data>\n  <data name=\"RPM\" xml:space=\"preserve\">\n    <value>دورة في الدقيقة</value>\n  </data>\n  <data name=\"RSDeadzones\" xml:space=\"preserve\">\n    <value>مناطق الخمول للعصا اليمنى</value>\n  </data>\n  <data name=\"RTDeadzones\" xml:space=\"preserve\">\n    <value>مناطق الخمول للزناد الأيمن</value>\n  </data>\n  <data name=\"RunOnStartup\" xml:space=\"preserve\">\n    <value>تشغيل عند بدء النظام</value>\n  </data>\n  <data name=\"ScalingQuality\" xml:space=\"preserve\">\n    <value>جودة التحجيم</value>\n  </data>\n  <data name=\"ScreenPadDown\" xml:space=\"preserve\">\n    <value>خفض سطوع ScreenPad</value>\n  </data>\n  <data name=\"ScreenPadUp\" xml:space=\"preserve\">\n    <value>زيادة سطوع ScreenPad</value>\n  </data>\n  <data name=\"Shutdown\" xml:space=\"preserve\">\n    <value>إيقاف التشغيل</value>\n  </data>\n  <data name=\"Silent\" xml:space=\"preserve\">\n    <value>هادئ</value>\n  </data>\n  <data name=\"Sleep\" xml:space=\"preserve\">\n    <value>سكون</value>\n  </data>\n  <data name=\"StandardGPUTooltip\" xml:space=\"preserve\">\n    <value>تفعيلُ وحدةِ معالجةِ الرسوماتِ المنفصلةِ للاستخدامِ القياسيِّ</value>\n  </data>\n  <data name=\"StandardMode\" xml:space=\"preserve\">\n    <value>قياسي</value>\n  </data>\n  <data name=\"Start\" xml:space=\"preserve\">\n    <value>بدء</value>\n  </data>\n  <data name=\"StartingServices\" xml:space=\"preserve\">\n    <value>بدء الخدمات</value>\n  </data>\n  <data name=\"StartupError\" xml:space=\"preserve\">\n    <value>خطأ في بدء التشغيل</value>\n  </data>\n  <data name=\"Stop\" xml:space=\"preserve\">\n    <value>إيقاف</value>\n  </data>\n  <data name=\"StopGPUApps\" xml:space=\"preserve\">\n    <value>إيقاف تطبيقات وحدة معالجة الرسومات</value>\n  </data>\n  <data name=\"StoppingServices\" xml:space=\"preserve\">\n    <value>إيقاف الخدمات</value>\n  </data>\n  <data name=\"ToggleAura\" xml:space=\"preserve\">\n    <value>تبديل Aura</value>\n  </data>\n  <data name=\"ToggleClamshellMode\" xml:space=\"preserve\">\n    <value>تبديل وضع الحاسوب المغلق تلقائيًا</value>\n  </data>\n  <data name=\"ToggleFnLock\" xml:space=\"preserve\">\n    <value>تبديل قفل Fn</value>\n  </data>\n  <data name=\"ToggleMiniled\" xml:space=\"preserve\">\n    <value>تبديل Miniled (إذا كان مدعومًا)</value>\n  </data>\n  <data name=\"ToggleScreen\" xml:space=\"preserve\">\n    <value>تبديل الشاشة</value>\n  </data>\n  <data name=\"ToggleTouchscreen\" xml:space=\"preserve\">\n    <value>تبديل شاشة اللمس</value>\n  </data>\n  <data name=\"Touchscreen\" xml:space=\"preserve\">\n    <value>شاشة اللمس</value>\n  </data>\n  <data name=\"Turbo\" xml:space=\"preserve\">\n    <value>توربو</value>\n  </data>\n  <data name=\"TurnedOff\" xml:space=\"preserve\">\n    <value>تم إيقافها</value>\n  </data>\n  <data name=\"TurnOffOnBattery\" xml:space=\"preserve\">\n    <value>تعطيل على البطارية</value>\n  </data>\n  <data name=\"UltimateGPUTooltip\" xml:space=\"preserve\">\n    <value>توجيهُ شاشةِ الحاسوبِ المحمولِ إلى وحدةِ معالجةِ الرسوماتِ المنفصلةِ، مما يزيدُ عددَ الإطاراتِ في الثانيةِ</value>\n  </data>\n  <data name=\"UltimateMode\" xml:space=\"preserve\">\n    <value>مستوى عالي</value>\n  </data>\n  <data name=\"UndervoltingRisky\" xml:space=\"preserve\">\n    <value>تقليل الفولتية هي ميزة تجريبية وخطرة. إذا كانت القيم المطبقة منخفضة جدًا لجهازك، فقد يصبح غير مستقر، أو يتوقف أو يتسبب في تلف البيانات. إذا كنت ترغب في التجربة - ابدأ بقيم صغيرة أولاً، انقر على تطبيق واختبر ما يناسبك.</value>\n  </data>\n  <data name=\"Unmuted\" xml:space=\"preserve\">\n    <value>غير مكتوم</value>\n  </data>\n  <data name=\"Updates\" xml:space=\"preserve\">\n    <value>التحديثات</value>\n  </data>\n  <data name=\"VersionLabel\" xml:space=\"preserve\">\n    <value>الإصدار</value>\n  </data>\n  <data name=\"VibrationStrength\" xml:space=\"preserve\">\n    <value>قوة الاهتزاز</value>\n  </data>\n  <data name=\"VisualMode\" xml:space=\"preserve\">\n    <value>وضع العرض</value>\n  </data>\n  <data name=\"VisualModesHDR\" xml:space=\"preserve\">\n    <value>أوضاع العرض غير متاحة عندما يكون HDR نشطًا</value>\n  </data>\n  <data name=\"VisualModesScreen\" xml:space=\"preserve\">\n    <value>أوضاع العرض غير متاحة عندما تكون شاشة الحاسوب المحمول مطفأة</value>\n  </data>\n  <data name=\"VolumeDown\" xml:space=\"preserve\">\n    <value>خفض الصوت</value>\n  </data>\n  <data name=\"VolumeMute\" xml:space=\"preserve\">\n    <value>كتم الصوت</value>\n  </data>\n  <data name=\"VolumeUp\" xml:space=\"preserve\">\n    <value>رفع الصوت</value>\n  </data>\n  <data name=\"WindowTop\" xml:space=\"preserve\">\n    <value>إبقاء نافذة التطبيق دائمًا في المقدمة</value>\n  </data>\n  <data name=\"Zoom\" xml:space=\"preserve\">\n    <value>تكبير</value>\n  </data>\n  <data name=\"Donate\" xml:space=\"preserve\">\n    <value>تبرع</value>\n  </data>\n  <data name=\"Legend\" xml:space=\"preserve\">\n    <value>مفتاح الرموز</value>\n  </data>\n  <data name=\"LegendGray\" xml:space=\"preserve\">\n    <value>لا يمكن التحقق من الإصدار المحلي</value>\n    <comment>Can't check local version</comment>\n  </data>\n  <data name=\"LegendRed\" xml:space=\"preserve\">\n    <value>يتوفر تحديث</value>\n    <comment>Update Available</comment>\n  </data>\n  <data name=\"LegendGreen\" xml:space=\"preserve\">\n    <value>محدّث</value>\n    <comment>Updated</comment>\n  </data>\n  <data name=\"SlashBounce\" xml:space=\"preserve\">\n    <value>ارتداد</value>\n  </data>\n  <data name=\"SlashMode\" xml:space=\"preserve\">\n    <value>سلاش</value>\n  </data>\n  <data name=\"SlashLoading\" xml:space=\"preserve\">\n    <value>تحميل</value>\n  </data>\n  <data name=\"SlashBitStream\" xml:space=\"preserve\">\n    <value>تدفق</value>\n  </data>\n  <data name=\"SlashTransmission\" xml:space=\"preserve\">\n    <value>إرسال</value>\n  </data>\n  <data name=\"SlashFlow\" xml:space=\"preserve\">\n    <value>تدفق</value>\n  </data>\n  <data name=\"SlashFlux\" xml:space=\"preserve\">\n    <value>انسياب</value>\n  </data>\n  <data name=\"SlashPhantom\" xml:space=\"preserve\">\n    <value>شبح</value>\n  </data>\n  <data name=\"SlashSpectrum\" xml:space=\"preserve\">\n    <value>نطاق</value>\n  </data>\n  <data name=\"SlashHazard\" xml:space=\"preserve\">\n    <value>خطر</value>\n  </data>\n  <data name=\"SlashInterfacing\" xml:space=\"preserve\">\n    <value>توصيل</value>\n  </data>\n  <data name=\"SlashRamp\" xml:space=\"preserve\">\n    <value>منحدر</value>\n  </data>\n  <data name=\"SlashGameOver\" xml:space=\"preserve\">\n    <value>انتهت اللعبة</value>\n  </data>\n  <data name=\"SlashStart\" xml:space=\"preserve\">\n    <value>بدء</value>\n  </data>\n  <data name=\"SlashBuzzer\" xml:space=\"preserve\">\n    <value>إنذار</value>\n  </data>\n  <data name=\"SlashStatic\" xml:space=\"preserve\">\n    <value>ثابت</value>\n  </data>\n  <data name=\"SlashBatteryLevel\" xml:space=\"preserve\">\n    <value>مستوى البطارية</value>\n  </data>\n  <data name=\"IntervalOff\" xml:space=\"preserve\">\n    <value>إيقاف الفاصل الزمني</value>\n  </data>\n  <data name=\"IntervalSeconds\" xml:space=\"preserve\">\n    <value>الفاصل الزمني {0}ث</value>\n  </data>\n  <data name=\"DisableDynamicLighting\" xml:space=\"preserve\">\n    <value>الرجاء تعطيل ويندوز &gt; الإضاءة الديناميكية</value>\n  </data>\n  <data name=\"AmbientModeResources\" xml:space=\"preserve\">\n    <value>الوضع المحيط قد يزيد من استخدام الموارد</value>\n  </data>\n  <data name=\"MouseMotionSync\" xml:space=\"preserve\">\n    <value>Motion Sync</value>\n  </data>\n  <data name=\"MouseZoneMode\" xml:space=\"preserve\">\n    <value>Zone Mode</value>\n  </data>\n</root>"
  },
  {
    "path": "app/Properties/Strings.da.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" id=\"root\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\"/>\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"name\" type=\"xsd:string\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\"/>\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Acceleration\" xml:space=\"preserve\">\n    <value>Acceleration</value>\n  </data>\n  <data name=\"ACPIError\" xml:space=\"preserve\">\n    <value>Kan ikke oprette forbindelse til ASUS ACPI. Applikationen kan ikke fungere uden. Prøv at installere Asus System Control Interface</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestart\" xml:space=\"preserve\">\n    <value>Genstart din enhed for at anvende ændringerne</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestartTitle\" xml:space=\"preserve\">\n    <value>Genstart nu?</value>\n  </data>\n  <data name=\"AlertDGPU\" xml:space=\"preserve\">\n    <value>Ser ud til at GPU er i kraftig brug, vil du deaktivere den?</value>\n  </data>\n  <data name=\"AlertDGPUTitle\" xml:space=\"preserve\">\n    <value>Øko-tilstand</value>\n  </data>\n  <data name=\"AlertUltimateOff\" xml:space=\"preserve\">\n    <value>Slukning af Ultimativ tilstand kræver genstart</value>\n  </data>\n  <data name=\"AlertUltimateOn\" xml:space=\"preserve\">\n    <value>Ultimativ tilstand kræver genstart</value>\n  </data>\n  <data name=\"AlertUltimateTitle\" xml:space=\"preserve\">\n    <value>Genstart nu?</value>\n  </data>\n  <data name=\"AllyController\" xml:space=\"preserve\">\n    <value>Ally Controller</value>\n  </data>\n  <data name=\"AnimationSpeed\" xml:space=\"preserve\">\n    <value>Animationshastighed</value>\n  </data>\n  <data name=\"AnimeMatrix\" xml:space=\"preserve\">\n    <value>Anime Matrix</value>\n  </data>\n  <data name=\"AppAlreadyRunning\" xml:space=\"preserve\">\n    <value>App'en kører allerede</value>\n  </data>\n  <data name=\"AppAlreadyRunningText\" xml:space=\"preserve\">\n    <value>G-Helper kører allerede. Tjek systembakken for et ikon.</value>\n  </data>\n  <data name=\"Apply\" xml:space=\"preserve\">\n    <value>Anvend</value>\n  </data>\n  <data name=\"ApplyFanCurve\" xml:space=\"preserve\">\n    <value>Anvend blæserkurve</value>\n  </data>\n  <data name=\"ApplyPowerLimits\" xml:space=\"preserve\">\n    <value>Anvend strømgrænser</value>\n  </data>\n  <data name=\"ApplyWindowsPowerPlan\" xml:space=\"preserve\">\n    <value>Automatisk justering af Windows strømtilstande</value>\n  </data>\n  <data name=\"APUMemory\" xml:space=\"preserve\">\n    <value>Hukommelse tildelt til GPU</value>\n  </data>\n  <data name=\"AsusServicesRunning\" xml:space=\"preserve\">\n    <value>Kørende ASUS-tjenester</value>\n  </data>\n  <data name=\"AuraBatteryState\" xml:space=\"preserve\">\n    <value>Batteritilstand</value>\n  </data>\n  <data name=\"AuraBreathe\" xml:space=\"preserve\">\n    <value>Vejrtrækning</value>\n  </data>\n  <data name=\"AuraClockwise\" xml:space=\"preserve\">\n    <value>Med uret</value>\n  </data>\n  <data name=\"AuraColorCycle\" xml:space=\"preserve\">\n    <value>Farvecyklus</value>\n  </data>\n  <data name=\"AuraComet\" xml:space=\"preserve\">\n    <value>Komet</value>\n  </data>\n  <data name=\"AuraCounterClockwise\" xml:space=\"preserve\">\n    <value>Mod uret</value>\n  </data>\n  <data name=\"AuraFast\" xml:space=\"preserve\">\n    <value>Hurtig</value>\n  </data>\n  <data name=\"AuraLightingMode\" xml:space=\"preserve\">\n    <value>Lystilstand</value>\n  </data>\n  <data name=\"AuraNormal\" xml:space=\"preserve\">\n    <value>Normal</value>\n  </data>\n  <data name=\"AuraRainbow\" xml:space=\"preserve\">\n    <value>Regnbue</value>\n  </data>\n  <data name=\"AuraRandomColor\" xml:space=\"preserve\">\n    <value>Tilfældig</value>\n  </data>\n  <data name=\"AuraReact\" xml:space=\"preserve\">\n    <value>Reager</value>\n  </data>\n  <data name=\"AuraSlow\" xml:space=\"preserve\">\n    <value>Langsom</value>\n  </data>\n  <data name=\"AuraStatic\" xml:space=\"preserve\">\n    <value>Statisk</value>\n  </data>\n  <data name=\"AuraStrobe\" xml:space=\"preserve\">\n    <value>Strobelys</value>\n  </data>\n  <data name=\"AuraZoneAll\" xml:space=\"preserve\">\n    <value>Alle</value>\n  </data>\n  <data name=\"AuraZoneDock\" xml:space=\"preserve\">\n    <value>Dock</value>\n  </data>\n  <data name=\"AuraZoneLogo\" xml:space=\"preserve\">\n    <value>Logo</value>\n  </data>\n  <data name=\"AuraZoneScroll\" xml:space=\"preserve\">\n    <value>Scroll-hjul</value>\n  </data>\n  <data name=\"AuraZoneUnderglow\" xml:space=\"preserve\">\n    <value>Underglød</value>\n  </data>\n  <data name=\"AutoApply\" xml:space=\"preserve\">\n    <value>Anvend automatisk</value>\n  </data>\n  <data name=\"AutoMode\" xml:space=\"preserve\">\n    <value>Automatisk</value>\n  </data>\n  <data name=\"AutoRefreshTooltip\" xml:space=\"preserve\">\n    <value>Sætter 60 Hz for at spare på batteri, og tilbage når tilsluttet</value>\n  </data>\n  <data name=\"Awake\" xml:space=\"preserve\">\n    <value>Vågen</value>\n  </data>\n  <data name=\"BacklightLow\" xml:space=\"preserve\">\n    <value>Lav</value>\n  </data>\n  <data name=\"BacklightMax\" xml:space=\"preserve\">\n    <value>Maksimal</value>\n  </data>\n  <data name=\"BacklightMid\" xml:space=\"preserve\">\n    <value>Mellem</value>\n  </data>\n  <data name=\"BacklightOff\" xml:space=\"preserve\">\n    <value>Slukket</value>\n  </data>\n  <data name=\"BacklightTimeout\" xml:space=\"preserve\">\n    <value>Timeout tilsluttet / på batteri (0 - TIL)</value>\n  </data>\n  <data name=\"BacklightTimeoutBattery\" xml:space=\"preserve\">\n    <value>Baggrundslys timeout på batteri</value>\n  </data>\n  <data name=\"BacklightTimeoutPlugged\" xml:space=\"preserve\">\n    <value>Timeout for baggrundslys når tilsluttet</value>\n  </data>\n  <data name=\"Balanced\" xml:space=\"preserve\">\n    <value>Balanceret</value>\n  </data>\n  <data name=\"BatteryCharge\" xml:space=\"preserve\">\n    <value>Opladning</value>\n  </data>\n  <data name=\"BatteryChargeLimit\" xml:space=\"preserve\">\n    <value>Batteriopladningsgrænse</value>\n  </data>\n  <data name=\"BatteryHealth\" xml:space=\"preserve\">\n    <value>Batteritilstand</value>\n  </data>\n  <data name=\"BatteryLimitFull\" xml:space=\"preserve\">\n    <value>Engangsopladning til 100%</value>\n  </data>\n  <data name=\"Binding\" xml:space=\"preserve\">\n    <value>Binding</value>\n  </data>\n  <data name=\"BindingPrimary\" xml:space=\"preserve\">\n    <value>Primær</value>\n  </data>\n  <data name=\"BindingSecondary\" xml:space=\"preserve\">\n    <value>Sekundær</value>\n  </data>\n  <data name=\"BiosAndDriverUpdates\" xml:space=\"preserve\">\n    <value>BIOS og driveropdateringer</value>\n  </data>\n  <data name=\"Boot\" xml:space=\"preserve\">\n    <value>Boot</value>\n  </data>\n  <data name=\"BootSound\" xml:space=\"preserve\">\n    <value>Opstarts-lyd</value>\n  </data>\n  <data name=\"Brightness\" xml:space=\"preserve\">\n    <value>Lysstyrke</value>\n  </data>\n  <data name=\"BrightnessDown\" xml:space=\"preserve\">\n    <value>Lysstyrke ned</value>\n  </data>\n  <data name=\"BrightnessUp\" xml:space=\"preserve\">\n    <value>Lysstyrke op</value>\n  </data>\n  <data name=\"BWTrayIcon\" xml:space=\"preserve\">\n    <value>Sort/hvid bakkeikon</value>\n  </data>\n  <data name=\"Calibrate\" xml:space=\"preserve\">\n    <value>Kalibrer</value>\n  </data>\n  <data name=\"Charging\" xml:space=\"preserve\">\n    <value>Oplader</value>\n  </data>\n  <data name=\"Color\" xml:space=\"preserve\">\n    <value>Farve</value>\n  </data>\n  <data name=\"Contrast\" xml:space=\"preserve\">\n    <value>Kontrast</value>\n  </data>\n  <data name=\"Controller\" xml:space=\"preserve\">\n    <value>Controller</value>\n  </data>\n  <data name=\"CPUBoost\" xml:space=\"preserve\">\n    <value>CPU Boost</value>\n  </data>\n  <data name=\"Custom\" xml:space=\"preserve\">\n    <value>Brugerdefineret</value>\n  </data>\n  <data name=\"Deceleration\" xml:space=\"preserve\">\n    <value>Deceleration</value>\n  </data>\n  <data name=\"Default\" xml:space=\"preserve\">\n    <value>Standard</value>\n  </data>\n  <data name=\"DisableController\" xml:space=\"preserve\">\n    <value>Deaktiver Controller</value>\n  </data>\n  <data name=\"DisableOnLidClose\" xml:space=\"preserve\">\n    <value>Deaktiver ved lukning af låg</value>\n  </data>\n  <data name=\"DisableOverdrive\" xml:space=\"preserve\">\n    <value>Deaktiver Overdrive på skærmen</value>\n  </data>\n  <data name=\"Discharging\" xml:space=\"preserve\">\n    <value>Aflader</value>\n  </data>\n  <data name=\"DownloadColorProfiles\" xml:space=\"preserve\">\n    <value>Hent farveprofiler</value>\n  </data>\n  <data name=\"DownloadUpdate\" xml:space=\"preserve\">\n    <value>Hent</value>\n  </data>\n  <data name=\"DriverAndSoftware\" xml:space=\"preserve\">\n    <value>Drivere og software</value>\n  </data>\n  <data name=\"EcoGPUTooltip\" xml:space=\"preserve\">\n    <value>Deaktiverer dGPU for at spare på batteriet</value>\n  </data>\n  <data name=\"EcoMode\" xml:space=\"preserve\">\n    <value>Øko</value>\n  </data>\n  <data name=\"EnableGPUOnShutdown\" xml:space=\"preserve\">\n    <value>Aktiver GPU ved nedlukning (forhindrer problemer med Øko-tilstand)</value>\n  </data>\n  <data name=\"EnableOptimusText\" xml:space=\"preserve\">\n    <value>Deaktivering af dGPU ved at gå i Øko-tilstand, mens visningstilstand i NVIDIA Kontrolpanel ikke er indstillet til Optimus kan forårsage problemer med lysstyrkekontrol indtil efter næste genstart. \n\nVil du stadig fortsætte?</value>\n  </data>\n  <data name=\"EnableOptimusTitle\" xml:space=\"preserve\">\n    <value>NVIDIA Visningstilstand er ikke indstillet til Optimus</value>\n  </data>\n  <data name=\"EnergySettings\" xml:space=\"preserve\">\n    <value>Energiindstillinger</value>\n  </data>\n  <data name=\"Export\" xml:space=\"preserve\">\n    <value>Eksporter profil</value>\n  </data>\n  <data name=\"Extra\" xml:space=\"preserve\">\n    <value>Ekstra</value>\n  </data>\n  <data name=\"ExtraSettings\" xml:space=\"preserve\">\n    <value>Ekstra indstillinger</value>\n  </data>\n  <data name=\"FactoryDefaults\" xml:space=\"preserve\">\n    <value>Gendan standarder</value>\n  </data>\n  <data name=\"FanCurves\" xml:space=\"preserve\">\n    <value>Blæserkurver</value>\n  </data>\n  <data name=\"FanProfileCPU\" xml:space=\"preserve\">\n    <value>CPU blæserkurveprofil</value>\n  </data>\n  <data name=\"FanProfileGPU\" xml:space=\"preserve\">\n    <value>GPU blæserkurveprofil</value>\n  </data>\n  <data name=\"FanProfileMid\" xml:space=\"preserve\">\n    <value>Midt blæserprofil</value>\n  </data>\n  <data name=\"FanProfiles\" xml:space=\"preserve\">\n    <value>Blæserprofiler</value>\n  </data>\n  <data name=\"FansAndPower\" xml:space=\"preserve\">\n    <value>Blæsere og strøm</value>\n  </data>\n  <data name=\"FanSpeed\" xml:space=\"preserve\">\n    <value>Blæser</value>\n  </data>\n  <data name=\"FansPower\" xml:space=\"preserve\">\n    <value>Blæser + Strøm</value>\n  </data>\n  <data name=\"FlickerFreeDimming\" xml:space=\"preserve\">\n    <value>Flimmerfri dæmpning</value>\n  </data>\n  <data name=\"FnLock\" xml:space=\"preserve\">\n    <value>Aktiver Fn + F genvejstaster uden Fn</value>\n  </data>\n  <data name=\"FnLockOff\" xml:space=\"preserve\">\n    <value>Fn-lås fra</value>\n  </data>\n  <data name=\"FnLockOn\" xml:space=\"preserve\">\n    <value>Fn-lås til</value>\n  </data>\n  <data name=\"GPUBoost\" xml:space=\"preserve\">\n    <value>Dynamisk boost</value>\n  </data>\n  <data name=\"GPUChanging\" xml:space=\"preserve\">\n    <value>Skifter</value>\n  </data>\n  <data name=\"GPUCoreClockOffset\" xml:space=\"preserve\">\n    <value>Core Clock offset</value>\n  </data>\n  <data name=\"GPUMemoryClockOffset\" xml:space=\"preserve\">\n    <value>Memory Clock offset</value>\n  </data>\n  <data name=\"GPUMode\" xml:space=\"preserve\">\n    <value>GPU-tilstand</value>\n  </data>\n  <data name=\"GPUModeEco\" xml:space=\"preserve\">\n    <value>Kun iGPU</value>\n  </data>\n  <data name=\"GPUModeStandard\" xml:space=\"preserve\">\n    <value>iGPU + dGPU</value>\n  </data>\n  <data name=\"GPUModeUltimate\" xml:space=\"preserve\">\n    <value>dGPU eksklusivt</value>\n  </data>\n  <data name=\"GPUPower\" xml:space=\"preserve\">\n    <value>GPU-strøm</value>\n  </data>\n  <data name=\"GPUSettings\" xml:space=\"preserve\">\n    <value>GPU-indstillinger</value>\n  </data>\n  <data name=\"GPUTempTarget\" xml:space=\"preserve\">\n    <value>Temperaturmål</value>\n  </data>\n  <data name=\"HibernateAfter\" xml:space=\"preserve\">\n    <value>Minutter til dvale i standby på batteriet (0 - OFF)</value>\n  </data>\n  <data name=\"High\" xml:space=\"preserve\">\n    <value>Høj</value>\n  </data>\n  <data name=\"ImageRotation\" xml:space=\"preserve\">\n    <value>Billedrotation</value>\n  </data>\n  <data name=\"Import\" xml:space=\"preserve\">\n    <value>Importer profil</value>\n  </data>\n  <data name=\"KeyBindings\" xml:space=\"preserve\">\n    <value>Tastebindinger</value>\n  </data>\n  <data name=\"Keyboard\" xml:space=\"preserve\">\n    <value>Tastatur</value>\n  </data>\n  <data name=\"KillGpuApps\" xml:space=\"preserve\">\n    <value>Stop alle apps der bruger GPU når du skifter til Øko</value>\n  </data>\n  <data name=\"LaptopBacklight\" xml:space=\"preserve\">\n    <value>Laptop baggrundsbelysning</value>\n  </data>\n  <data name=\"LaptopKeyboard\" xml:space=\"preserve\">\n    <value>Laptop-tastatur</value>\n  </data>\n  <data name=\"LaptopScreen\" xml:space=\"preserve\">\n    <value>Laptop-skærm</value>\n  </data>\n  <data name=\"LEDStatusIndicators\" xml:space=\"preserve\">\n    <value>LED statusindikatorer</value>\n  </data>\n  <data name=\"Lid\" xml:space=\"preserve\">\n    <value>Låg</value>\n  </data>\n  <data name=\"Lightbar\" xml:space=\"preserve\">\n    <value>Lightbar</value>\n  </data>\n  <data name=\"Lighting\" xml:space=\"preserve\">\n    <value>Belysning</value>\n  </data>\n  <data name=\"LockScreen\" xml:space=\"preserve\">\n    <value>Låseskærm</value>\n  </data>\n  <data name=\"Logo\" xml:space=\"preserve\">\n    <value>Logo</value>\n  </data>\n  <data name=\"Low\" xml:space=\"preserve\">\n    <value>Lav</value>\n  </data>\n  <data name=\"LSDeadzones\" xml:space=\"preserve\">\n    <value>Venstre stick dødzoner</value>\n  </data>\n  <data name=\"LTDeadzones\" xml:space=\"preserve\">\n    <value>Venstre udløser dødzoner</value>\n  </data>\n  <data name=\"MatrixAudio\" xml:space=\"preserve\">\n    <value>Lydvisualisering</value>\n  </data>\n  <data name=\"MatrixBanner\" xml:space=\"preserve\">\n    <value>Binær banner</value>\n  </data>\n  <data name=\"MatrixBright\" xml:space=\"preserve\">\n    <value>Kraftigt</value>\n  </data>\n  <data name=\"MatrixClock\" xml:space=\"preserve\">\n    <value>Ur</value>\n  </data>\n  <data name=\"MatrixDim\" xml:space=\"preserve\">\n    <value>Dæmpet</value>\n  </data>\n  <data name=\"MatrixLogo\" xml:space=\"preserve\">\n    <value>ROG logo</value>\n  </data>\n  <data name=\"MatrixMedium\" xml:space=\"preserve\">\n    <value>Middel</value>\n  </data>\n  <data name=\"MatrixOff\" xml:space=\"preserve\">\n    <value>Slukket</value>\n  </data>\n  <data name=\"MatrixPicture\" xml:space=\"preserve\">\n    <value>Billede</value>\n  </data>\n  <data name=\"MaxRefreshTooltip\" xml:space=\"preserve\">\n    <value>Maks. opdateringshastighed for lavere latenstid</value>\n  </data>\n  <data name=\"MinRefreshTooltip\" xml:space=\"preserve\">\n    <value>60Hz opdateringshastighed for at spare på batteriet</value>\n  </data>\n  <data name=\"Minute\" xml:space=\"preserve\">\n    <value>minut</value>\n  </data>\n  <data name=\"Minutes\" xml:space=\"preserve\">\n    <value>minutter</value>\n  </data>\n  <data name=\"MouseAngleSnapping\" xml:space=\"preserve\">\n    <value>Angle Snapping / Tuning</value>\n  </data>\n  <data name=\"MouseAutoPowerOff\" xml:space=\"preserve\">\n    <value>Automatisk slukning efter</value>\n  </data>\n  <data name=\"MouseButtonResponse\" xml:space=\"preserve\">\n    <value>Knaprespons</value>\n  </data>\n  <data name=\"MouseImportFailed\" xml:space=\"preserve\">\n    <value>Import mislykkedes. Den valgte fil er ikke en gyldig museprofil eller den er korrupteret.</value>\n  </data>\n  <data name=\"MouseLiftOffDistance\" xml:space=\"preserve\">\n    <value>Løfteafstand</value>\n  </data>\n  <data name=\"MouseLowBatteryWarning\" xml:space=\"preserve\">\n    <value>Lav batteriadvarsel ved</value>\n  </data>\n  <data name=\"MousePerformance\" xml:space=\"preserve\">\n    <value>Ydelse</value>\n  </data>\n  <data name=\"MouseSynchronize\" xml:space=\"preserve\">\n    <value>Synkroniser med mus</value>\n  </data>\n  <data name=\"Multizone\" xml:space=\"preserve\">\n    <value>Multizone</value>\n  </data>\n  <data name=\"MultizoneStrong\" xml:space=\"preserve\">\n    <value>Multizone stærk</value>\n  </data>\n  <data name=\"Muted\" xml:space=\"preserve\">\n    <value>Lydløs</value>\n  </data>\n  <data name=\"MuteMic\" xml:space=\"preserve\">\n    <value>Lydløs mikrofon</value>\n  </data>\n  <data name=\"Never\" xml:space=\"preserve\">\n    <value>Aldrig</value>\n  </data>\n  <data name=\"NewUpdates\" xml:space=\"preserve\">\n    <value>Nye opdateringer</value>\n  </data>\n  <data name=\"NoNewUpdates\" xml:space=\"preserve\">\n    <value>Ingen nye opdateringer</value>\n  </data>\n  <data name=\"NotConnected\" xml:space=\"preserve\">\n    <value>Ikke tilsluttet</value>\n  </data>\n  <data name=\"Off\" xml:space=\"preserve\">\n    <value>Fra</value>\n  </data>\n  <data name=\"On\" xml:space=\"preserve\">\n    <value>Til</value>\n  </data>\n  <data name=\"OneZone\" xml:space=\"preserve\">\n    <value>En zone</value>\n  </data>\n  <data name=\"OpenGHelper\" xml:space=\"preserve\">\n    <value>Åbn G-Helper vindue</value>\n  </data>\n  <data name=\"Optimized\" xml:space=\"preserve\">\n    <value>Optimeret</value>\n  </data>\n  <data name=\"OptimizedGPUTooltip\" xml:space=\"preserve\">\n    <value>Skift til Øko på batteri og til Standard, når tilsluttet strøm</value>\n  </data>\n  <data name=\"OptimizedUSBC\" xml:space=\"preserve\">\n    <value>Hold GPU deaktiveret på USB-C oplader i optimeret tilstand</value>\n  </data>\n  <data name=\"Other\" xml:space=\"preserve\">\n    <value>Andet</value>\n  </data>\n  <data name=\"Overdrive\" xml:space=\"preserve\">\n    <value>Overdrive</value>\n  </data>\n  <data name=\"PerformanceMode\" xml:space=\"preserve\">\n    <value>Tilstand</value>\n  </data>\n  <data name=\"Peripherals\" xml:space=\"preserve\">\n    <value>Tilbehør</value>\n  </data>\n  <data name=\"PictureGif\" xml:space=\"preserve\">\n    <value>Billede / Gif</value>\n  </data>\n  <data name=\"PlayPause\" xml:space=\"preserve\">\n    <value>Afspil / Pause</value>\n  </data>\n  <data name=\"PollingRate\" xml:space=\"preserve\">\n    <value>Polling Rate</value>\n  </data>\n  <data name=\"PowerLimits\" xml:space=\"preserve\">\n    <value>Strømgrænser</value>\n  </data>\n  <data name=\"PPTExperimental\" xml:space=\"preserve\">\n    <value>Strømgrænser er en eksperimentel funktion. Brug omhyggeligt og på egen risiko!</value>\n  </data>\n  <data name=\"PrintScreen\" xml:space=\"preserve\">\n    <value>PrintScreen</value>\n  </data>\n  <data name=\"Profile\" xml:space=\"preserve\">\n    <value>Profil</value>\n  </data>\n  <data name=\"Quit\" xml:space=\"preserve\">\n    <value>Afslut</value>\n  </data>\n  <data name=\"Reset\" xml:space=\"preserve\">\n    <value>Nulstil</value>\n  </data>\n  <data name=\"RestartGPU\" xml:space=\"preserve\">\n    <value>Noget bruger dGPU og forhindrer Øko-tilstand. Lad G-Helper forsøge at genstarte dGPU i enhedshåndtering? (fortsæt på egen risiko)</value>\n  </data>\n  <data name=\"RPM\" xml:space=\"preserve\">\n    <value>RPM</value>\n  </data>\n  <data name=\"RSDeadzones\" xml:space=\"preserve\">\n    <value>Højre stick dødzoner</value>\n  </data>\n  <data name=\"RTDeadzones\" xml:space=\"preserve\">\n    <value>Højre udløser dødzoner</value>\n  </data>\n  <data name=\"RunOnStartup\" xml:space=\"preserve\">\n    <value>Kør ved opstart</value>\n  </data>\n  <data name=\"ScalingQuality\" xml:space=\"preserve\">\n    <value>Skaleringskvalitet</value>\n  </data>\n  <data name=\"ScreenPadDown\" xml:space=\"preserve\">\n    <value>Screenpad lysstyrke ned</value>\n  </data>\n  <data name=\"ScreenPadUp\" xml:space=\"preserve\">\n    <value>Skærmtastatur lysstyrke op</value>\n  </data>\n  <data name=\"Shutdown\" xml:space=\"preserve\">\n    <value>Luk ned</value>\n  </data>\n  <data name=\"Silent\" xml:space=\"preserve\">\n    <value>Lydløs</value>\n  </data>\n  <data name=\"Sleep\" xml:space=\"preserve\">\n    <value>Standby</value>\n  </data>\n  <data name=\"StandardGPUTooltip\" xml:space=\"preserve\">\n    <value>Aktiverer dGPU til standardbrug</value>\n  </data>\n  <data name=\"StandardMode\" xml:space=\"preserve\">\n    <value>Standard</value>\n  </data>\n  <data name=\"Start\" xml:space=\"preserve\">\n    <value>Start</value>\n  </data>\n  <data name=\"StartingServices\" xml:space=\"preserve\">\n    <value>Starter tjenester</value>\n  </data>\n  <data name=\"StartupError\" xml:space=\"preserve\">\n    <value>Startfejl</value>\n  </data>\n  <data name=\"Stop\" xml:space=\"preserve\">\n    <value>Stop</value>\n  </data>\n  <data name=\"StopGPUApps\" xml:space=\"preserve\">\n    <value>Stop GPU-programmer</value>\n  </data>\n  <data name=\"StoppingServices\" xml:space=\"preserve\">\n    <value>Stopper tjenester</value>\n  </data>\n  <data name=\"ToggleAura\" xml:space=\"preserve\">\n    <value>Slå Aura til/fra</value>\n  </data>\n  <data name=\"ToggleClamshellMode\" xml:space=\"preserve\">\n    <value>Slå automatisk Clamshell-tilstand til/fra</value>\n  </data>\n  <data name=\"ToggleFnLock\" xml:space=\"preserve\">\n    <value>Slå Fn-lås til/fra</value>\n  </data>\n  <data name=\"ToggleMiniled\" xml:space=\"preserve\">\n    <value>Slå MiniLED til/fra (hvis understøttet)</value>\n  </data>\n  <data name=\"ToggleScreen\" xml:space=\"preserve\">\n    <value>Slå skærmen til/fra</value>\n  </data>\n  <data name=\"ToggleTouchscreen\" xml:space=\"preserve\">\n    <value>Toggle Touchscreen</value>\n  </data>\n  <data name=\"Touchscreen\" xml:space=\"preserve\">\n    <value>Touchscreen</value>\n  </data>\n  <data name=\"Turbo\" xml:space=\"preserve\">\n    <value>Turbo</value>\n  </data>\n  <data name=\"TurnedOff\" xml:space=\"preserve\">\n    <value>Slukket</value>\n  </data>\n  <data name=\"TurnOffOnBattery\" xml:space=\"preserve\">\n    <value>Deaktiver på batteri</value>\n  </data>\n  <data name=\"UltimateGPUTooltip\" xml:space=\"preserve\">\n    <value>Kobler laptop-skærmen direkte til dGPU, hvilket maksimerer FPS</value>\n  </data>\n  <data name=\"UltimateMode\" xml:space=\"preserve\">\n    <value>Ultimativ</value>\n  </data>\n  <data name=\"UndervoltingRisky\" xml:space=\"preserve\">\n    <value>Undervolting er en eksperimentel og risikabel funktion. Hvis de anvendte værdier er for lave for din hardware, kan det blive ustabilt, lukke ned eller forårsage datakorruption. Hvis du ønsker at prøve - start fra små værdier først, klik på Anvend og test hvad der virker for dig.</value>\n  </data>\n  <data name=\"Unmuted\" xml:space=\"preserve\">\n    <value>Ikke lydløs</value>\n  </data>\n  <data name=\"Updates\" xml:space=\"preserve\">\n    <value>Opdateringer</value>\n  </data>\n  <data name=\"VersionLabel\" xml:space=\"preserve\">\n    <value>Version</value>\n  </data>\n  <data name=\"VibrationStrength\" xml:space=\"preserve\">\n    <value>Vibrationsstyrke</value>\n  </data>\n  <data name=\"VisualMode\" xml:space=\"preserve\">\n    <value>Visuel tilstand</value>\n  </data>\n  <data name=\"VisualModesHDR\" xml:space=\"preserve\">\n    <value>Visuelle tilstande er ikke tilgængelige, når HDR er aktiv</value>\n  </data>\n  <data name=\"VisualModesScreen\" xml:space=\"preserve\">\n    <value>Visuelle tilstande er ikke tilgængelige, når laptopskærmen er slukket</value>\n  </data>\n  <data name=\"VolumeDown\" xml:space=\"preserve\">\n    <value>Lydstyrke ned</value>\n  </data>\n  <data name=\"VolumeMute\" xml:space=\"preserve\">\n    <value>Lydløs</value>\n  </data>\n  <data name=\"VolumeUp\" xml:space=\"preserve\">\n    <value>Lydstyrke op</value>\n  </data>\n  <data name=\"WindowTop\" xml:space=\"preserve\">\n    <value>Hold altid appvinduet øverst</value>\n  </data>\n  <data name=\"Zoom\" xml:space=\"preserve\">\n    <value>Zoom</value>\n  </data>\n  <data name=\"Donate\" xml:space=\"preserve\">\n    <value>Donate</value>\n  </data>\n  <data name=\"Legend\" xml:space=\"preserve\">\n    <value>Legend</value>\n  </data>\n  <data name=\"LegendGray\" xml:space=\"preserve\">\n    <value>Can't check local version</value>\n    <comment>Can't check local version</comment>\n  </data>\n  <data name=\"LegendRed\" xml:space=\"preserve\">\n    <value>Update Available</value>\n    <comment>Update Available</comment>\n  </data>\n  <data name=\"LegendGreen\" xml:space=\"preserve\">\n    <value>Updated</value>\n    <comment>Updated</comment>\n  </data>\n  <data name=\"SlashBounce\" xml:space=\"preserve\">\n    <value>Bounce</value>\n  </data>\n  <data name=\"SlashMode\" xml:space=\"preserve\">\n    <value>Slash</value>\n  </data>\n  <data name=\"SlashLoading\" xml:space=\"preserve\">\n    <value>Loading</value>\n  </data>\n  <data name=\"SlashBitStream\" xml:space=\"preserve\">\n    <value>Bit Stream</value>\n  </data>\n  <data name=\"SlashTransmission\" xml:space=\"preserve\">\n    <value>Transmission</value>\n  </data>\n  <data name=\"SlashFlow\" xml:space=\"preserve\">\n    <value>Flow</value>\n  </data>\n  <data name=\"SlashFlux\" xml:space=\"preserve\">\n    <value>Flux</value>\n  </data>\n  <data name=\"SlashPhantom\" xml:space=\"preserve\">\n    <value>Phantom</value>\n  </data>\n  <data name=\"SlashSpectrum\" xml:space=\"preserve\">\n    <value>Spectrum</value>\n  </data>\n  <data name=\"SlashHazard\" xml:space=\"preserve\">\n    <value>Hazard</value>\n  </data>\n  <data name=\"SlashInterfacing\" xml:space=\"preserve\">\n    <value>Interfacing</value>\n  </data>\n  <data name=\"SlashRamp\" xml:space=\"preserve\">\n    <value>Ramp</value>\n  </data>\n  <data name=\"SlashGameOver\" xml:space=\"preserve\">\n    <value>Game Over</value>\n  </data>\n  <data name=\"SlashStart\" xml:space=\"preserve\">\n    <value>Start</value>\n  </data>\n  <data name=\"SlashBuzzer\" xml:space=\"preserve\">\n    <value>Buzzer</value>\n  </data>\n  <data name=\"SlashStatic\" xml:space=\"preserve\">\n    <value>Static</value>\n  </data>\n  <data name=\"SlashBatteryLevel\" xml:space=\"preserve\">\n    <value>Battery Level</value>\n  </data>\n  <data name=\"IntervalOff\" xml:space=\"preserve\">\n    <value>Interval Off</value>\n  </data>\n  <data name=\"IntervalSeconds\" xml:space=\"preserve\">\n    <value>Interval {0}s</value>\n  </data>\n  <data name=\"DisableDynamicLighting\" xml:space=\"preserve\">\n    <value>Please disable Windows &gt; Dynamic Lighting</value>\n  </data>\n  <data name=\"AmbientModeResources\" xml:space=\"preserve\">\n    <value>Ambient mode may increase resource usage</value>\n  </data>\n  <data name=\"MouseMotionSync\" xml:space=\"preserve\">\n    <value>Motion Sync</value>\n  </data>\n  <data name=\"MouseZoneMode\" xml:space=\"preserve\">\n    <value>Zone Mode</value>\n  </data>\n</root>"
  },
  {
    "path": "app/Properties/Strings.de.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" id=\"root\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\"/>\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"name\" type=\"xsd:string\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\"/>\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Acceleration\" xml:space=\"preserve\">\n    <value>Beschleunigung</value>\n  </data>\n  <data name=\"ACPIError\" xml:space=\"preserve\">\n    <value>Verbindung zu ASUS ACPI fehlgeschlagen. G-Helper kann nicht ausgeführt werden. Bitte installiere ASUS System Control Interface.</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestart\" xml:space=\"preserve\">\n    <value>Gerät neu starten, um Änderungen anzuwenden?</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestartTitle\" xml:space=\"preserve\">\n    <value>Jetzt neu starten?</value>\n  </data>\n  <data name=\"AlertDGPU\" xml:space=\"preserve\">\n    <value>Die GPU wird gerade verwendet. Trotzdem deaktivieren?</value>\n  </data>\n  <data name=\"AlertDGPUTitle\" xml:space=\"preserve\">\n    <value>Eco Modus</value>\n  </data>\n  <data name=\"AlertUltimateOff\" xml:space=\"preserve\">\n    <value>Deaktivieren des Ultimate Modus benötigt einen Neustart.</value>\n  </data>\n  <data name=\"AlertUltimateOn\" xml:space=\"preserve\">\n    <value>Aktivieren des Ultimate Modus benötigt einen Neustart.</value>\n  </data>\n  <data name=\"AlertUltimateTitle\" xml:space=\"preserve\">\n    <value>Jetzt neu starten?</value>\n  </data>\n  <data name=\"AllyController\" xml:space=\"preserve\">\n    <value>Ally Controller</value>\n  </data>\n  <data name=\"AnimationSpeed\" xml:space=\"preserve\">\n    <value>Animationsgeschwindigkeit</value>\n  </data>\n  <data name=\"AnimeMatrix\" xml:space=\"preserve\">\n    <value>AniMe Matrix</value>\n  </data>\n  <data name=\"AppAlreadyRunning\" xml:space=\"preserve\">\n    <value>Die Anwendung läuft bereits</value>\n  </data>\n  <data name=\"AppAlreadyRunningText\" xml:space=\"preserve\">\n    <value>G-Helper läuft bereits. Bitte prüfe den Systemtray.</value>\n  </data>\n  <data name=\"Apply\" xml:space=\"preserve\">\n    <value>Anwenden</value>\n  </data>\n  <data name=\"ApplyFanCurve\" xml:space=\"preserve\">\n    <value>Lüfterkurve anwenden</value>\n  </data>\n  <data name=\"ApplyPowerLimits\" xml:space=\"preserve\">\n    <value>Leistungsgrenzen anwenden</value>\n  </data>\n  <data name=\"ApplyWindowsPowerPlan\" xml:space=\"preserve\">\n    <value>Windows Leistungsmodus automatisch anpassen</value>\n  </data>\n  <data name=\"APUMemory\" xml:space=\"preserve\">\n    <value>GPU zugewiesener Speicher</value>\n  </data>\n  <data name=\"AsusServicesRunning\" xml:space=\"preserve\">\n    <value>ASUS Dienste laufen</value>\n  </data>\n  <data name=\"AuraBatteryState\" xml:space=\"preserve\">\n    <value>Batteriezustand</value>\n  </data>\n  <data name=\"AuraBreathe\" xml:space=\"preserve\">\n    <value>Atmen</value>\n  </data>\n  <data name=\"AuraClockwise\" xml:space=\"preserve\">\n    <value>Im Uhrzeigersinn</value>\n  </data>\n  <data name=\"AuraColorCycle\" xml:space=\"preserve\">\n    <value>Farbwechsel</value>\n  </data>\n  <data name=\"AuraComet\" xml:space=\"preserve\">\n    <value>Komet</value>\n  </data>\n  <data name=\"AuraCounterClockwise\" xml:space=\"preserve\">\n    <value>Gegen den Uhrzeigersinn</value>\n  </data>\n  <data name=\"AuraFast\" xml:space=\"preserve\">\n    <value>Schnell</value>\n  </data>\n  <data name=\"AuraLightingMode\" xml:space=\"preserve\">\n    <value>Beleuchtungsmodus</value>\n  </data>\n  <data name=\"AuraNormal\" xml:space=\"preserve\">\n    <value>Normal</value>\n  </data>\n  <data name=\"AuraRainbow\" xml:space=\"preserve\">\n    <value>Regenbogen</value>\n  </data>\n  <data name=\"AuraRandomColor\" xml:space=\"preserve\">\n    <value>Zufällig</value>\n  </data>\n  <data name=\"AuraReact\" xml:space=\"preserve\">\n    <value>Reagierend</value>\n  </data>\n  <data name=\"AuraSlow\" xml:space=\"preserve\">\n    <value>Langsam</value>\n  </data>\n  <data name=\"AuraStatic\" xml:space=\"preserve\">\n    <value>Statisch</value>\n  </data>\n  <data name=\"AuraStrobe\" xml:space=\"preserve\">\n    <value>Stroboskop</value>\n  </data>\n  <data name=\"AuraZoneAll\" xml:space=\"preserve\">\n    <value>Alle</value>\n  </data>\n  <data name=\"AuraZoneDock\" xml:space=\"preserve\">\n    <value>Dock</value>\n  </data>\n  <data name=\"AuraZoneLogo\" xml:space=\"preserve\">\n    <value>Logo</value>\n  </data>\n  <data name=\"AuraZoneScroll\" xml:space=\"preserve\">\n    <value>Scrollrad</value>\n  </data>\n  <data name=\"AuraZoneUnderglow\" xml:space=\"preserve\">\n    <value>Front</value>\n  </data>\n  <data name=\"AutoApply\" xml:space=\"preserve\">\n    <value>Automatisch anwenden</value>\n  </data>\n  <data name=\"AutoMode\" xml:space=\"preserve\">\n    <value>Auto</value>\n  </data>\n  <data name=\"AutoRefreshTooltip\" xml:space=\"preserve\">\n    <value>60Hz im Batteriebetrieb. Maximal, wenn eingesteckt.</value>\n  </data>\n  <data name=\"Awake\" xml:space=\"preserve\">\n    <value>Im Betrieb</value>\n  </data>\n  <data name=\"BacklightLow\" xml:space=\"preserve\">\n    <value>Niedrig</value>\n  </data>\n  <data name=\"BacklightMax\" xml:space=\"preserve\">\n    <value>Max</value>\n  </data>\n  <data name=\"BacklightMid\" xml:space=\"preserve\">\n    <value>Mittel</value>\n  </data>\n  <data name=\"BacklightOff\" xml:space=\"preserve\">\n    <value>Aus</value>\n  </data>\n  <data name=\"BacklightTimeout\" xml:space=\"preserve\">\n    <value>Timeout angeschlossen / bei Akku (0 = An)</value>\n  </data>\n  <data name=\"BacklightTimeoutBattery\" xml:space=\"preserve\">\n    <value>Backlight Timeout when on battery</value>\n  </data>\n  <data name=\"BacklightTimeoutPlugged\" xml:space=\"preserve\">\n    <value>Backlight Timeout when plugged</value>\n  </data>\n  <data name=\"Balanced\" xml:space=\"preserve\">\n    <value>Ausbalanciert</value>\n  </data>\n  <data name=\"BatteryCharge\" xml:space=\"preserve\">\n    <value>Akkustand</value>\n  </data>\n  <data name=\"BatteryChargeLimit\" xml:space=\"preserve\">\n    <value>Ladebegrenzung</value>\n  </data>\n  <data name=\"BatteryHealth\" xml:space=\"preserve\">\n    <value>Batteriezustand</value>\n  </data>\n  <data name=\"BatteryLimitFull\" xml:space=\"preserve\">\n    <value>Einmalig auf 100% aufladen</value>\n  </data>\n  <data name=\"Binding\" xml:space=\"preserve\">\n    <value>Binding</value>\n  </data>\n  <data name=\"BindingPrimary\" xml:space=\"preserve\">\n    <value>Primär</value>\n  </data>\n  <data name=\"BindingSecondary\" xml:space=\"preserve\">\n    <value>Sekundär</value>\n  </data>\n  <data name=\"BiosAndDriverUpdates\" xml:space=\"preserve\">\n    <value>BIOS und Treiber Updates</value>\n  </data>\n  <data name=\"Boot\" xml:space=\"preserve\">\n    <value>Hochfahren</value>\n  </data>\n  <data name=\"BootSound\" xml:space=\"preserve\">\n    <value>Boot-Sound</value>\n  </data>\n  <data name=\"Brightness\" xml:space=\"preserve\">\n    <value>Helligkeit</value>\n  </data>\n  <data name=\"BrightnessDown\" xml:space=\"preserve\">\n    <value>Helligkeit verringern</value>\n  </data>\n  <data name=\"BrightnessUp\" xml:space=\"preserve\">\n    <value>Helligkeit erhöhen</value>\n  </data>\n  <data name=\"BWTrayIcon\" xml:space=\"preserve\">\n    <value>Taskleistensymbol in Schwarzweiß</value>\n  </data>\n  <data name=\"Calibrate\" xml:space=\"preserve\">\n    <value>Kalibrieren</value>\n  </data>\n  <data name=\"Charging\" xml:space=\"preserve\">\n    <value>Lädt</value>\n  </data>\n  <data name=\"Color\" xml:space=\"preserve\">\n    <value>Farbe</value>\n  </data>\n  <data name=\"Contrast\" xml:space=\"preserve\">\n    <value>Kontrast</value>\n  </data>\n  <data name=\"Controller\" xml:space=\"preserve\">\n    <value>Controller</value>\n  </data>\n  <data name=\"CPUBoost\" xml:space=\"preserve\">\n    <value>CPU-Boost</value>\n  </data>\n  <data name=\"Custom\" xml:space=\"preserve\">\n    <value>Benutzerdefiniert</value>\n  </data>\n  <data name=\"Deceleration\" xml:space=\"preserve\">\n    <value>Verlangsamung</value>\n  </data>\n  <data name=\"Default\" xml:space=\"preserve\">\n    <value>Standard</value>\n  </data>\n  <data name=\"DisableController\" xml:space=\"preserve\">\n    <value>Controller deaktivieren</value>\n  </data>\n  <data name=\"DisableOnLidClose\" xml:space=\"preserve\">\n    <value>Beim Schließen des Deckels deaktivieren</value>\n  </data>\n  <data name=\"DisableOverdrive\" xml:space=\"preserve\">\n    <value>Bildschirm: Overdrive abschalten</value>\n  </data>\n  <data name=\"Discharging\" xml:space=\"preserve\">\n    <value>Entlädt</value>\n  </data>\n  <data name=\"DownloadColorProfiles\" xml:space=\"preserve\">\n    <value>Farbprofile herunterladen</value>\n  </data>\n  <data name=\"DownloadUpdate\" xml:space=\"preserve\">\n    <value>Download</value>\n  </data>\n  <data name=\"DriverAndSoftware\" xml:space=\"preserve\">\n    <value>Treiber und Software</value>\n  </data>\n  <data name=\"EcoGPUTooltip\" xml:space=\"preserve\">\n    <value>dGPU zum Stromsparen abschalten</value>\n  </data>\n  <data name=\"EcoMode\" xml:space=\"preserve\">\n    <value>Eco</value>\n  </data>\n  <data name=\"EnableGPUOnShutdown\" xml:space=\"preserve\">\n    <value>Aktiviere GPU beim Herunterfahren (verhindert Problem im Eco-Modus)</value>\n  </data>\n  <data name=\"EnableOptimusText\" xml:space=\"preserve\">\n    <value>Die dGPU zu deaktivieren, indem Sie in den Eco-Modus wechseln während der Anzeigemodus nicht auf Optimus eingestellt ist, kann zu Problemen mit der Helligkeitseinstellung führen.\n\nTrotzdem fortfahren?</value>\n  </data>\n  <data name=\"EnableOptimusTitle\" xml:space=\"preserve\">\n    <value>Nvidia Anzeigemodus ist nicht auf Optimus eingestellt</value>\n  </data>\n  <data name=\"EnergySettings\" xml:space=\"preserve\">\n    <value>Energieeinstellungen</value>\n  </data>\n  <data name=\"Export\" xml:space=\"preserve\">\n    <value>Profil exportieren</value>\n  </data>\n  <data name=\"Extra\" xml:space=\"preserve\">\n    <value>Extra</value>\n  </data>\n  <data name=\"ExtraSettings\" xml:space=\"preserve\">\n    <value>Extra-Einstellungen</value>\n  </data>\n  <data name=\"FactoryDefaults\" xml:space=\"preserve\">\n    <value>Werkseinstellungen</value>\n  </data>\n  <data name=\"FanCurves\" xml:space=\"preserve\">\n    <value>Lüfterkurven</value>\n  </data>\n  <data name=\"FanProfileCPU\" xml:space=\"preserve\">\n    <value>CPU Lüfterprofil</value>\n  </data>\n  <data name=\"FanProfileGPU\" xml:space=\"preserve\">\n    <value>GPU Lüfterprofil</value>\n  </data>\n  <data name=\"FanProfileMid\" xml:space=\"preserve\">\n    <value>Mittleres Lüfterprofil</value>\n  </data>\n  <data name=\"FanProfiles\" xml:space=\"preserve\">\n    <value>Lüfterprofile</value>\n  </data>\n  <data name=\"FansAndPower\" xml:space=\"preserve\">\n    <value>Lüfter und Leistung</value>\n  </data>\n  <data name=\"FanSpeed\" xml:space=\"preserve\">\n    <value>Lüfter</value>\n  </data>\n  <data name=\"FansPower\" xml:space=\"preserve\">\n    <value>Lüfter + Leistung</value>\n  </data>\n  <data name=\"FlickerFreeDimming\" xml:space=\"preserve\">\n    <value>Flackerfreies Dimmen</value>\n  </data>\n  <data name=\"FnLock\" xml:space=\"preserve\">\n    <value>Fn+F Funktionen ohne Fn Taste nutzen</value>\n  </data>\n  <data name=\"FnLockOff\" xml:space=\"preserve\">\n    <value>Fn-Sperre aus</value>\n  </data>\n  <data name=\"FnLockOn\" xml:space=\"preserve\">\n    <value>Fn-Sperre an</value>\n  </data>\n  <data name=\"GPUBoost\" xml:space=\"preserve\">\n    <value>Dynamic Boost</value>\n  </data>\n  <data name=\"GPUChanging\" xml:space=\"preserve\">\n    <value>Wechseln</value>\n  </data>\n  <data name=\"GPUCoreClockOffset\" xml:space=\"preserve\">\n    <value>Kernfrequenz Anpassung</value>\n  </data>\n  <data name=\"GPUMemoryClockOffset\" xml:space=\"preserve\">\n    <value>Speicherfrequenz Anpassung</value>\n  </data>\n  <data name=\"GPUMode\" xml:space=\"preserve\">\n    <value>GPU Modus</value>\n  </data>\n  <data name=\"GPUModeEco\" xml:space=\"preserve\">\n    <value>Nur iGPU</value>\n  </data>\n  <data name=\"GPUModeStandard\" xml:space=\"preserve\">\n    <value>iGPU + dGPU</value>\n  </data>\n  <data name=\"GPUModeUltimate\" xml:space=\"preserve\">\n    <value>Nur dGPU</value>\n  </data>\n  <data name=\"GPUPower\" xml:space=\"preserve\">\n    <value>GPU-Leistung</value>\n  </data>\n  <data name=\"GPUSettings\" xml:space=\"preserve\">\n    <value>GPU Einstellungen</value>\n  </data>\n  <data name=\"GPUTempTarget\" xml:space=\"preserve\">\n    <value>Maximale GPU Temperatur</value>\n  </data>\n  <data name=\"HibernateAfter\" xml:space=\"preserve\">\n    <value>Minuten bis zum Ruhezustand im Standby (0 = Aus)</value>\n  </data>\n  <data name=\"High\" xml:space=\"preserve\">\n    <value>Hoch</value>\n  </data>\n  <data name=\"ImageRotation\" xml:space=\"preserve\">\n    <value>Bilddrehung</value>\n  </data>\n  <data name=\"Import\" xml:space=\"preserve\">\n    <value>Profil importieren</value>\n  </data>\n  <data name=\"KeyBindings\" xml:space=\"preserve\">\n    <value>Tastenbelegung</value>\n  </data>\n  <data name=\"Keyboard\" xml:space=\"preserve\">\n    <value>Tastatur</value>\n  </data>\n  <data name=\"KillGpuApps\" xml:space=\"preserve\">\n    <value>Alle Anwendungen auf der dGPU beim Wechsel in den Eco Modus beenden.</value>\n  </data>\n  <data name=\"LaptopBacklight\" xml:space=\"preserve\">\n    <value>Laptopbeleuchtung</value>\n  </data>\n  <data name=\"LaptopKeyboard\" xml:space=\"preserve\">\n    <value>Laptoptastatur</value>\n  </data>\n  <data name=\"LaptopScreen\" xml:space=\"preserve\">\n    <value>Laptopbildschirm</value>\n  </data>\n  <data name=\"LEDStatusIndicators\" xml:space=\"preserve\">\n    <value>LED-Statusanzeige</value>\n  </data>\n  <data name=\"Lid\" xml:space=\"preserve\">\n    <value>Deckel</value>\n  </data>\n  <data name=\"Lightbar\" xml:space=\"preserve\">\n    <value>Leuchtstreifen</value>\n  </data>\n  <data name=\"Lighting\" xml:space=\"preserve\">\n    <value>Beleuchtung</value>\n  </data>\n  <data name=\"LockScreen\" xml:space=\"preserve\">\n    <value>Bildschirm sperren</value>\n  </data>\n  <data name=\"Logo\" xml:space=\"preserve\">\n    <value>Logo</value>\n  </data>\n  <data name=\"Low\" xml:space=\"preserve\">\n    <value>Niedrig</value>\n  </data>\n  <data name=\"LSDeadzones\" xml:space=\"preserve\">\n    <value>Left Stick Deadzones</value>\n  </data>\n  <data name=\"LTDeadzones\" xml:space=\"preserve\">\n    <value>Left Trigger Deadzones</value>\n  </data>\n  <data name=\"MatrixAudio\" xml:space=\"preserve\">\n    <value>Audio Visualisierung</value>\n  </data>\n  <data name=\"MatrixBanner\" xml:space=\"preserve\">\n    <value>Binäres Banner</value>\n  </data>\n  <data name=\"MatrixBright\" xml:space=\"preserve\">\n    <value>Hell</value>\n  </data>\n  <data name=\"MatrixClock\" xml:space=\"preserve\">\n    <value>Uhr</value>\n  </data>\n  <data name=\"MatrixDim\" xml:space=\"preserve\">\n    <value>Dunkel</value>\n  </data>\n  <data name=\"MatrixLogo\" xml:space=\"preserve\">\n    <value>ROG Logo</value>\n  </data>\n  <data name=\"MatrixMedium\" xml:space=\"preserve\">\n    <value>Mittel</value>\n  </data>\n  <data name=\"MatrixOff\" xml:space=\"preserve\">\n    <value>Aus</value>\n  </data>\n  <data name=\"MatrixPicture\" xml:space=\"preserve\">\n    <value>Bild</value>\n  </data>\n  <data name=\"MaxRefreshTooltip\" xml:space=\"preserve\">\n    <value>Maximale Wiederholrate für niedrigste Latenz</value>\n  </data>\n  <data name=\"MinRefreshTooltip\" xml:space=\"preserve\">\n    <value>60Hz um Strom zu sparen</value>\n  </data>\n  <data name=\"Minute\" xml:space=\"preserve\">\n    <value>Minute</value>\n  </data>\n  <data name=\"Minutes\" xml:space=\"preserve\">\n    <value>Minuten</value>\n  </data>\n  <data name=\"MouseAngleSnapping\" xml:space=\"preserve\">\n    <value>Angle Snapping / Tuning</value>\n  </data>\n  <data name=\"MouseAutoPowerOff\" xml:space=\"preserve\">\n    <value>Automatisch abschalten nach</value>\n  </data>\n  <data name=\"MouseButtonResponse\" xml:space=\"preserve\">\n    <value>Tastenreaktionsgeschwindigkeit</value>\n  </data>\n  <data name=\"MouseImportFailed\" xml:space=\"preserve\">\n    <value>Import fehlgeschlagen. Die ausgewählte Datei ist kein gültiges Mausprofil oder beschädigt.</value>\n  </data>\n  <data name=\"MouseLiftOffDistance\" xml:space=\"preserve\">\n    <value>Lift Off Distance</value>\n  </data>\n  <data name=\"MouseLowBatteryWarning\" xml:space=\"preserve\">\n    <value>Batteriewarnung bei</value>\n  </data>\n  <data name=\"MousePerformance\" xml:space=\"preserve\">\n    <value>Leistung</value>\n  </data>\n  <data name=\"MouseSynchronize\" xml:space=\"preserve\">\n    <value>Maus synchronisieren</value>\n  </data>\n  <data name=\"Multizone\" xml:space=\"preserve\">\n    <value>Multi Zone</value>\n  </data>\n  <data name=\"MultizoneStrong\" xml:space=\"preserve\">\n    <value>Multi Zone Strong</value>\n  </data>\n  <data name=\"Muted\" xml:space=\"preserve\">\n    <value>Stumm</value>\n  </data>\n  <data name=\"MuteMic\" xml:space=\"preserve\">\n    <value>Mikrofon stummschalten</value>\n  </data>\n  <data name=\"Never\" xml:space=\"preserve\">\n    <value>Niemals</value>\n  </data>\n  <data name=\"NewUpdates\" xml:space=\"preserve\">\n    <value>Neue Updates:</value>\n  </data>\n  <data name=\"NoNewUpdates\" xml:space=\"preserve\">\n    <value>Keine Updates</value>\n  </data>\n  <data name=\"NotConnected\" xml:space=\"preserve\">\n    <value>Nicht verbunden</value>\n  </data>\n  <data name=\"Off\" xml:space=\"preserve\">\n    <value>Aus</value>\n  </data>\n  <data name=\"On\" xml:space=\"preserve\">\n    <value>An</value>\n  </data>\n  <data name=\"OneZone\" xml:space=\"preserve\">\n    <value>One Zone</value>\n  </data>\n  <data name=\"OpenGHelper\" xml:space=\"preserve\">\n    <value>G-Helper Fenster öffnen</value>\n  </data>\n  <data name=\"Optimized\" xml:space=\"preserve\">\n    <value>Optimiert</value>\n  </data>\n  <data name=\"OptimizedGPUTooltip\" xml:space=\"preserve\">\n    <value>Eco-Modus im Batteriebetrieb. Standard, wenn eingesteckt.</value>\n  </data>\n  <data name=\"OptimizedUSBC\" xml:space=\"preserve\">\n    <value>dGPU beim USB-C Laden im Optimierten Modus deaktiviert lassen</value>\n  </data>\n  <data name=\"Other\" xml:space=\"preserve\">\n    <value>Sonstiges</value>\n  </data>\n  <data name=\"Overdrive\" xml:space=\"preserve\">\n    <value>Overdrive</value>\n  </data>\n  <data name=\"PerformanceMode\" xml:space=\"preserve\">\n    <value>Leistungsmodus</value>\n  </data>\n  <data name=\"Peripherals\" xml:space=\"preserve\">\n    <value>Zubehör</value>\n  </data>\n  <data name=\"PictureGif\" xml:space=\"preserve\">\n    <value>Bild / GIF</value>\n  </data>\n  <data name=\"PlayPause\" xml:space=\"preserve\">\n    <value>Wiedergabe / Pause</value>\n  </data>\n  <data name=\"PollingRate\" xml:space=\"preserve\">\n    <value>Abfragerate</value>\n  </data>\n  <data name=\"PowerLimits\" xml:space=\"preserve\">\n    <value>Leistungsbegrenzung</value>\n  </data>\n  <data name=\"PPTExperimental\" xml:space=\"preserve\">\n    <value>Leistungsbegrenzung ist experimentell. Nutzung erfolgt auf eigene Gefahr!</value>\n  </data>\n  <data name=\"PrintScreen\" xml:space=\"preserve\">\n    <value>Druck</value>\n  </data>\n  <data name=\"Profile\" xml:space=\"preserve\">\n    <value>Profil</value>\n  </data>\n  <data name=\"Quit\" xml:space=\"preserve\">\n    <value>Schließen</value>\n  </data>\n  <data name=\"Reset\" xml:space=\"preserve\">\n    <value>Zurücksetzen</value>\n  </data>\n  <data name=\"RestartGPU\" xml:space=\"preserve\">\n    <value>Ein Prozess verhindert den Wechsel in den Eco-Modus. dGPU neu starten? Fortfahren auf eigene Gefahr.</value>\n  </data>\n  <data name=\"RPM\" xml:space=\"preserve\">\n    <value>U/Min</value>\n  </data>\n  <data name=\"RSDeadzones\" xml:space=\"preserve\">\n    <value>Right Stick Deadzones</value>\n  </data>\n  <data name=\"RTDeadzones\" xml:space=\"preserve\">\n    <value>Right Trigger Deadzones</value>\n  </data>\n  <data name=\"RunOnStartup\" xml:space=\"preserve\">\n    <value>Beim Start ausführen</value>\n  </data>\n  <data name=\"ScalingQuality\" xml:space=\"preserve\">\n    <value>Skalierungsqualität</value>\n  </data>\n  <data name=\"ScreenPadDown\" xml:space=\"preserve\">\n    <value>Screenpad Helligkeit verringern</value>\n  </data>\n  <data name=\"ScreenPadUp\" xml:space=\"preserve\">\n    <value>Screenpad-Helligkeit erhöhen</value>\n  </data>\n  <data name=\"Shutdown\" xml:space=\"preserve\">\n    <value>Herunterfahren</value>\n  </data>\n  <data name=\"Silent\" xml:space=\"preserve\">\n    <value>Leise</value>\n  </data>\n  <data name=\"Sleep\" xml:space=\"preserve\">\n    <value>Standby</value>\n  </data>\n  <data name=\"StandardGPUTooltip\" xml:space=\"preserve\">\n    <value>dGPU aktivieren</value>\n  </data>\n  <data name=\"StandardMode\" xml:space=\"preserve\">\n    <value>Standard</value>\n  </data>\n  <data name=\"Start\" xml:space=\"preserve\">\n    <value>Starten</value>\n  </data>\n  <data name=\"StartingServices\" xml:space=\"preserve\">\n    <value>Starte Dienste</value>\n  </data>\n  <data name=\"StartupError\" xml:space=\"preserve\">\n    <value>Startfehler</value>\n  </data>\n  <data name=\"Stop\" xml:space=\"preserve\">\n    <value>Beenden</value>\n  </data>\n  <data name=\"StopGPUApps\" xml:space=\"preserve\">\n    <value>GPU Anwendungen beenden</value>\n  </data>\n  <data name=\"StoppingServices\" xml:space=\"preserve\">\n    <value>Beende Dienste</value>\n  </data>\n  <data name=\"ToggleAura\" xml:space=\"preserve\">\n    <value>Aura umschalten</value>\n  </data>\n  <data name=\"ToggleClamshellMode\" xml:space=\"preserve\">\n    <value>Clamshell Modus automatisch aktivieren</value>\n  </data>\n  <data name=\"ToggleFnLock\" xml:space=\"preserve\">\n    <value>FN Sperre umschalten</value>\n  </data>\n  <data name=\"ToggleMiniled\" xml:space=\"preserve\">\n    <value>MiniLED umschalten</value>\n  </data>\n  <data name=\"ToggleScreen\" xml:space=\"preserve\">\n    <value>Bildschirm umschalten</value>\n  </data>\n  <data name=\"ToggleTouchscreen\" xml:space=\"preserve\">\n    <value>Touchscreen umschalten</value>\n  </data>\n  <data name=\"Touchscreen\" xml:space=\"preserve\">\n    <value>Touchscreen</value>\n  </data>\n  <data name=\"Turbo\" xml:space=\"preserve\">\n    <value>Turbo</value>\n  </data>\n  <data name=\"TurnedOff\" xml:space=\"preserve\">\n    <value>Ausgeschaltet</value>\n  </data>\n  <data name=\"TurnOffOnBattery\" xml:space=\"preserve\">\n    <value>Im Batteriebetrieb abschalten</value>\n  </data>\n  <data name=\"UltimateGPUTooltip\" xml:space=\"preserve\">\n    <value>Verbindet den Bildschirm mit der dGPU für maximale Leistung.</value>\n  </data>\n  <data name=\"UltimateMode\" xml:space=\"preserve\">\n    <value>Ultimativ</value>\n  </data>\n  <data name=\"UndervoltingRisky\" xml:space=\"preserve\">\n    <value>Die Spannungsabsenkung (Undervolting) ist experimentell und birgt Risiken. Wenn die Spannung zu weit abgesenkt wird, wird der Computer instabil und kann abstürzen, was zu Datenverlust führen kann. Es empfiehlt sich mit kleinen Werten anzufangen und ausgiebig zu testen, um den idealen Wert zu finden.</value>\n  </data>\n  <data name=\"Unmuted\" xml:space=\"preserve\">\n    <value>Laut</value>\n  </data>\n  <data name=\"Updates\" xml:space=\"preserve\">\n    <value>Aktualisierungen</value>\n  </data>\n  <data name=\"VersionLabel\" xml:space=\"preserve\">\n    <value>Version</value>\n  </data>\n  <data name=\"VibrationStrength\" xml:space=\"preserve\">\n    <value>Vibrationsstärke</value>\n  </data>\n  <data name=\"VisualMode\" xml:space=\"preserve\">\n    <value>Darstellungsmodus</value>\n  </data>\n  <data name=\"VisualModesHDR\" xml:space=\"preserve\">\n    <value>Darstellungsmodi sind nicht verfügbar, wenn HDR aktiv ist.</value>\n  </data>\n  <data name=\"VisualModesScreen\" xml:space=\"preserve\">\n    <value>Modi nicht verfügbar, wenn Laptop-Bildschirm aus ist.</value>\n  </data>\n  <data name=\"VolumeDown\" xml:space=\"preserve\">\n    <value>Lautstärke verringern</value>\n  </data>\n  <data name=\"VolumeMute\" xml:space=\"preserve\">\n    <value>Stummschalten</value>\n  </data>\n  <data name=\"VolumeUp\" xml:space=\"preserve\">\n    <value>Lautstärke erhöhen</value>\n  </data>\n  <data name=\"WindowTop\" xml:space=\"preserve\">\n    <value>Fenster immer über allen anderen</value>\n  </data>\n  <data name=\"Zoom\" xml:space=\"preserve\">\n    <value>Zoom</value>\n  </data>\n  <data name=\"Donate\" xml:space=\"preserve\">\n    <value>Spenden</value>\n  </data>\n  <data name=\"Legend\" xml:space=\"preserve\">\n    <value>Legende</value>\n  </data>\n  <data name=\"LegendGray\" xml:space=\"preserve\">\n    <value>Kann lokale Version nicht überprüfen</value>\n    <comment>Can't check local version</comment>\n  </data>\n  <data name=\"LegendRed\" xml:space=\"preserve\">\n    <value>Update verfügbar</value>\n    <comment>Update Available</comment>\n  </data>\n  <data name=\"LegendGreen\" xml:space=\"preserve\">\n    <value>Aktuell</value>\n    <comment>Updated</comment>\n  </data>\n  <data name=\"SlashBounce\" xml:space=\"preserve\">\n    <value>Bounce</value>\n  </data>\n  <data name=\"SlashMode\" xml:space=\"preserve\">\n    <value>Slash</value>\n  </data>\n  <data name=\"SlashLoading\" xml:space=\"preserve\">\n    <value>Loading</value>\n  </data>\n  <data name=\"SlashBitStream\" xml:space=\"preserve\">\n    <value>Bit Stream</value>\n  </data>\n  <data name=\"SlashTransmission\" xml:space=\"preserve\">\n    <value>Transmission</value>\n  </data>\n  <data name=\"SlashFlow\" xml:space=\"preserve\">\n    <value>Flow</value>\n  </data>\n  <data name=\"SlashFlux\" xml:space=\"preserve\">\n    <value>Flux</value>\n  </data>\n  <data name=\"SlashPhantom\" xml:space=\"preserve\">\n    <value>Phantom</value>\n  </data>\n  <data name=\"SlashSpectrum\" xml:space=\"preserve\">\n    <value>Spectrum</value>\n  </data>\n  <data name=\"SlashHazard\" xml:space=\"preserve\">\n    <value>Hazard</value>\n  </data>\n  <data name=\"SlashInterfacing\" xml:space=\"preserve\">\n    <value>Interfacing</value>\n  </data>\n  <data name=\"SlashRamp\" xml:space=\"preserve\">\n    <value>Ramp</value>\n  </data>\n  <data name=\"SlashGameOver\" xml:space=\"preserve\">\n    <value>Game Over</value>\n  </data>\n  <data name=\"SlashStart\" xml:space=\"preserve\">\n    <value>Start</value>\n  </data>\n  <data name=\"SlashBuzzer\" xml:space=\"preserve\">\n    <value>Buzzer</value>\n  </data>\n  <data name=\"SlashStatic\" xml:space=\"preserve\">\n    <value>Static</value>\n  </data>\n  <data name=\"SlashBatteryLevel\" xml:space=\"preserve\">\n    <value>Battery Level</value>\n  </data>\n  <data name=\"IntervalOff\" xml:space=\"preserve\">\n    <value>Interval Off</value>\n  </data>\n  <data name=\"IntervalSeconds\" xml:space=\"preserve\">\n    <value>Interval {0}s</value>\n  </data>\n  <data name=\"DisableDynamicLighting\" xml:space=\"preserve\">\n    <value>Bitte deaktivieren Sie Windows Dynamische Beleuchtung</value>\n  </data>\n  <data name=\"AmbientModeResources\" xml:space=\"preserve\">\n    <value>Ambient-Modus kann die Ressourcennutzung erhöhen</value>\n  </data>\n  <data name=\"MouseMotionSync\" xml:space=\"preserve\">\n    <value>Motion Sync</value>\n  </data>\n  <data name=\"MouseZoneMode\" xml:space=\"preserve\">\n    <value>Zone Mode</value>\n  </data>\n</root>"
  },
  {
    "path": "app/Properties/Strings.es.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" id=\"root\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\"/>\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"name\" type=\"xsd:string\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\"/>\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Acceleration\" xml:space=\"preserve\">\n    <value>Aceleración</value>\n  </data>\n  <data name=\"ACPIError\" xml:space=\"preserve\">\n    <value>No se pudo conectar con ASUS ACPI. La aplicación no puede funcionar sin el recurso. Instale Asus System Control Interface</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestart\" xml:space=\"preserve\">\n    <value>Reinicia el dispositivo para aplicar los cambios</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestartTitle\" xml:space=\"preserve\">\n    <value>¿Reiniciar ahora?</value>\n  </data>\n  <data name=\"AlertDGPU\" xml:space=\"preserve\">\n    <value>Detectado uso intensivo de la GPU, ¿deshabilitarla?</value>\n  </data>\n  <data name=\"AlertDGPUTitle\" xml:space=\"preserve\">\n    <value>Modo Eco</value>\n  </data>\n  <data name=\"AlertUltimateOff\" xml:space=\"preserve\">\n    <value>Desactivar el Modo Ultimate requiere reiniciar</value>\n  </data>\n  <data name=\"AlertUltimateOn\" xml:space=\"preserve\">\n    <value>Activar el Modo Ultimate requiere reiniciar</value>\n  </data>\n  <data name=\"AlertUltimateTitle\" xml:space=\"preserve\">\n    <value>¿Reiniciar ahora?</value>\n  </data>\n  <data name=\"AllyController\" xml:space=\"preserve\">\n    <value>Mando Ally</value>\n  </data>\n  <data name=\"AnimationSpeed\" xml:space=\"preserve\">\n    <value>Velocidad</value>\n  </data>\n  <data name=\"AnimeMatrix\" xml:space=\"preserve\">\n    <value>AniMe Matrix</value>\n  </data>\n  <data name=\"AppAlreadyRunning\" xml:space=\"preserve\">\n    <value>La apliación ya está ejecutándose</value>\n  </data>\n  <data name=\"AppAlreadyRunningText\" xml:space=\"preserve\">\n    <value>G-Helper ya está ejecutándose. Compruebe la bandeja del sistema.</value>\n  </data>\n  <data name=\"Apply\" xml:space=\"preserve\">\n    <value>Aplicar</value>\n  </data>\n  <data name=\"ApplyFanCurve\" xml:space=\"preserve\">\n    <value>Aplicar curva personalizada</value>\n  </data>\n  <data name=\"ApplyPowerLimits\" xml:space=\"preserve\">\n    <value>Aplicar límites de energía</value>\n  </data>\n  <data name=\"ApplyWindowsPowerPlan\" xml:space=\"preserve\">\n    <value>Autoajustar plan de energía Windows</value>\n  </data>\n  <data name=\"APUMemory\" xml:space=\"preserve\">\n    <value>Memoria asignada a GPU</value>\n  </data>\n  <data name=\"AsusServicesRunning\" xml:space=\"preserve\">\n    <value>Servicios de Asus en ejecución</value>\n  </data>\n  <data name=\"AuraBatteryState\" xml:space=\"preserve\">\n    <value>Estado de la batería</value>\n  </data>\n  <data name=\"AuraBreathe\" xml:space=\"preserve\">\n    <value>Respiración</value>\n  </data>\n  <data name=\"AuraClockwise\" xml:space=\"preserve\">\n    <value>Sentido horario</value>\n  </data>\n  <data name=\"AuraColorCycle\" xml:space=\"preserve\">\n    <value>Ciclo de color</value>\n  </data>\n  <data name=\"AuraComet\" xml:space=\"preserve\">\n    <value>Cometa</value>\n  </data>\n  <data name=\"AuraCounterClockwise\" xml:space=\"preserve\">\n    <value>Sentido anti-horario</value>\n  </data>\n  <data name=\"AuraFast\" xml:space=\"preserve\">\n    <value>Rápido</value>\n  </data>\n  <data name=\"AuraLightingMode\" xml:space=\"preserve\">\n    <value>Modo de iluminación</value>\n  </data>\n  <data name=\"AuraNormal\" xml:space=\"preserve\">\n    <value>Normal</value>\n  </data>\n  <data name=\"AuraRainbow\" xml:space=\"preserve\">\n    <value>Arcoíris</value>\n  </data>\n  <data name=\"AuraRandomColor\" xml:space=\"preserve\">\n    <value>Aleatorio</value>\n  </data>\n  <data name=\"AuraReact\" xml:space=\"preserve\">\n    <value>Sensible</value>\n  </data>\n  <data name=\"AuraSlow\" xml:space=\"preserve\">\n    <value>Lento</value>\n  </data>\n  <data name=\"AuraStatic\" xml:space=\"preserve\">\n    <value>Estático</value>\n  </data>\n  <data name=\"AuraStrobe\" xml:space=\"preserve\">\n    <value>Estroboscópico</value>\n  </data>\n  <data name=\"AuraZoneAll\" xml:space=\"preserve\">\n    <value>Todo</value>\n  </data>\n  <data name=\"AuraZoneDock\" xml:space=\"preserve\">\n    <value>Dock</value>\n  </data>\n  <data name=\"AuraZoneLogo\" xml:space=\"preserve\">\n    <value>Logo</value>\n  </data>\n  <data name=\"AuraZoneScroll\" xml:space=\"preserve\">\n    <value>Rueda de desplazamiento</value>\n  </data>\n  <data name=\"AuraZoneUnderglow\" xml:space=\"preserve\">\n    <value>Underglow</value>\n  </data>\n  <data name=\"AutoApply\" xml:space=\"preserve\">\n    <value>Autoaplicar</value>\n  </data>\n  <data name=\"AutoMode\" xml:space=\"preserve\">\n    <value>Automático</value>\n  </data>\n  <data name=\"AutoRefreshTooltip\" xml:space=\"preserve\">\n    <value>Establece 60Hz con batería y revierte cuando está enchufado</value>\n  </data>\n  <data name=\"Awake\" xml:space=\"preserve\">\n    <value>Encendida</value>\n  </data>\n  <data name=\"BacklightLow\" xml:space=\"preserve\">\n    <value>Bajo</value>\n  </data>\n  <data name=\"BacklightMax\" xml:space=\"preserve\">\n    <value>Máximo</value>\n  </data>\n  <data name=\"BacklightMid\" xml:space=\"preserve\">\n    <value>Medio</value>\n  </data>\n  <data name=\"BacklightOff\" xml:space=\"preserve\">\n    <value>Apagado</value>\n  </data>\n  <data name=\"BacklightTimeout\" xml:space=\"preserve\">\n    <value>Tiempo de espera conectado / con batería (0 - ON)</value>\n  </data>\n  <data name=\"BacklightTimeoutBattery\" xml:space=\"preserve\">\n    <value>Tiempo de retroiluminación con batería</value>\n  </data>\n  <data name=\"BacklightTimeoutPlugged\" xml:space=\"preserve\">\n    <value>Tiempo de retroiluminación conectado</value>\n  </data>\n  <data name=\"Balanced\" xml:space=\"preserve\">\n    <value>Equilibrado</value>\n  </data>\n  <data name=\"BatteryCharge\" xml:space=\"preserve\">\n    <value>Carga</value>\n  </data>\n  <data name=\"BatteryChargeLimit\" xml:space=\"preserve\">\n    <value>Límite de carga</value>\n  </data>\n  <data name=\"BatteryHealth\" xml:space=\"preserve\">\n    <value>Salud de la batería</value>\n  </data>\n  <data name=\"BatteryLimitFull\" xml:space=\"preserve\">\n    <value>Cargar una vez al 100%</value>\n  </data>\n  <data name=\"Binding\" xml:space=\"preserve\">\n    <value>Emparejado</value>\n  </data>\n  <data name=\"BindingPrimary\" xml:space=\"preserve\">\n    <value>Primario</value>\n  </data>\n  <data name=\"BindingSecondary\" xml:space=\"preserve\">\n    <value>Secundario</value>\n  </data>\n  <data name=\"BiosAndDriverUpdates\" xml:space=\"preserve\">\n    <value>Actualizaciones de BIOS y Drivers</value>\n  </data>\n  <data name=\"Boot\" xml:space=\"preserve\">\n    <value>Al arrancar</value>\n  </data>\n  <data name=\"BootSound\" xml:space=\"preserve\">\n    <value>Sonido al arranque</value>\n  </data>\n  <data name=\"Brightness\" xml:space=\"preserve\">\n    <value>Brillo</value>\n  </data>\n  <data name=\"BrightnessDown\" xml:space=\"preserve\">\n    <value>Bajar brillo</value>\n  </data>\n  <data name=\"BrightnessUp\" xml:space=\"preserve\">\n    <value>Subir brillo</value>\n  </data>\n  <data name=\"BWTrayIcon\" xml:space=\"preserve\">\n    <value>Icono de bandeja blanco y negro</value>\n  </data>\n  <data name=\"Calibrate\" xml:space=\"preserve\">\n    <value>Calibrar</value>\n  </data>\n  <data name=\"Charging\" xml:space=\"preserve\">\n    <value>Cargando</value>\n  </data>\n  <data name=\"Color\" xml:space=\"preserve\">\n    <value>Color</value>\n  </data>\n  <data name=\"Contrast\" xml:space=\"preserve\">\n    <value>Contraste</value>\n  </data>\n  <data name=\"Controller\" xml:space=\"preserve\">\n    <value>Mando</value>\n  </data>\n  <data name=\"CPUBoost\" xml:space=\"preserve\">\n    <value>CPU Boost</value>\n  </data>\n  <data name=\"Custom\" xml:space=\"preserve\">\n    <value>Personalizado</value>\n  </data>\n  <data name=\"Deceleration\" xml:space=\"preserve\">\n    <value>Desaceleración</value>\n  </data>\n  <data name=\"Default\" xml:space=\"preserve\">\n    <value>Por defecto</value>\n  </data>\n  <data name=\"DisableController\" xml:space=\"preserve\">\n    <value>Deshabilitar mando</value>\n  </data>\n  <data name=\"DisableOnLidClose\" xml:space=\"preserve\">\n    <value>Desactivar al cerrar la tapa</value>\n  </data>\n  <data name=\"DisableOverdrive\" xml:space=\"preserve\">\n    <value>Desactivar Overdrive</value>\n  </data>\n  <data name=\"Discharging\" xml:space=\"preserve\">\n    <value>Descargando</value>\n  </data>\n  <data name=\"DownloadColorProfiles\" xml:space=\"preserve\">\n    <value>Descargar perfiles de color</value>\n  </data>\n  <data name=\"DownloadUpdate\" xml:space=\"preserve\">\n    <value>Descargar</value>\n  </data>\n  <data name=\"DriverAndSoftware\" xml:space=\"preserve\">\n    <value>Drivers y Software</value>\n  </data>\n  <data name=\"EcoGPUTooltip\" xml:space=\"preserve\">\n    <value>Deshabilita la dGPU para ahorrar batería</value>\n  </data>\n  <data name=\"EcoMode\" xml:space=\"preserve\">\n    <value>Eco</value>\n  </data>\n  <data name=\"EnableGPUOnShutdown\" xml:space=\"preserve\">\n    <value>Habilitar GPU al apagar (evita problemas con el modo Eco)</value>\n  </data>\n  <data name=\"EnableOptimusText\" xml:space=\"preserve\">\n    <value>Deshabilitar la dGPU cambiando a modo Eco mientras el Modo de Pantalla en el Panel de Control de NVIDIA no está configurado en Optimus puede causar problemas con el control del brillo hasta después del próximo reinicio.\n\n¿Seguro que desea continuar?</value>\n  </data>\n  <data name=\"EnableOptimusTitle\" xml:space=\"preserve\">\n    <value>Modo de Pantalla NVIDIA no está configurado en Optimus</value>\n  </data>\n  <data name=\"EnergySettings\" xml:space=\"preserve\">\n    <value>Ajustes de energía</value>\n  </data>\n  <data name=\"Export\" xml:space=\"preserve\">\n    <value>Exportar perfil</value>\n  </data>\n  <data name=\"Extra\" xml:space=\"preserve\">\n    <value>Adicional</value>\n  </data>\n  <data name=\"ExtraSettings\" xml:space=\"preserve\">\n    <value>Opciones adicionales</value>\n  </data>\n  <data name=\"FactoryDefaults\" xml:space=\"preserve\">\n    <value>Valores de fábrica</value>\n  </data>\n  <data name=\"FanCurves\" xml:space=\"preserve\">\n    <value>Curvas de ventiladores</value>\n  </data>\n  <data name=\"FanProfileCPU\" xml:space=\"preserve\">\n    <value>Perfil ventilador CPU</value>\n  </data>\n  <data name=\"FanProfileGPU\" xml:space=\"preserve\">\n    <value>Perfil ventilador GPU</value>\n  </data>\n  <data name=\"FanProfileMid\" xml:space=\"preserve\">\n    <value>Perfil ventilador central</value>\n  </data>\n  <data name=\"FanProfiles\" xml:space=\"preserve\">\n    <value>Ventiladores</value>\n  </data>\n  <data name=\"FansAndPower\" xml:space=\"preserve\">\n    <value>Ventiladores y energía</value>\n  </data>\n  <data name=\"FanSpeed\" xml:space=\"preserve\">\n    <value>Fan</value>\n  </data>\n  <data name=\"FansPower\" xml:space=\"preserve\">\n    <value>Ventiladores + Energía</value>\n  </data>\n  <data name=\"FlickerFreeDimming\" xml:space=\"preserve\">\n    <value>Atenuación sin parpadeo</value>\n  </data>\n  <data name=\"FnLock\" xml:space=\"preserve\">\n    <value>Usar teclas de acceso rápido (Fn+F) sin pulsar Fn</value>\n  </data>\n  <data name=\"FnLockOff\" xml:space=\"preserve\">\n    <value>Tecla Fn normal</value>\n  </data>\n  <data name=\"FnLockOn\" xml:space=\"preserve\">\n    <value>Tecla Fn bloqueada</value>\n  </data>\n  <data name=\"GPUBoost\" xml:space=\"preserve\">\n    <value>Dynamic Boost</value>\n  </data>\n  <data name=\"GPUChanging\" xml:space=\"preserve\">\n    <value>Cargando</value>\n  </data>\n  <data name=\"GPUCoreClockOffset\" xml:space=\"preserve\">\n    <value>Core Clock Offset</value>\n  </data>\n  <data name=\"GPUMemoryClockOffset\" xml:space=\"preserve\">\n    <value>Memory Clock Offset</value>\n  </data>\n  <data name=\"GPUMode\" xml:space=\"preserve\">\n    <value>Modo de GPU</value>\n  </data>\n  <data name=\"GPUModeEco\" xml:space=\"preserve\">\n    <value>Sólo iGPU</value>\n  </data>\n  <data name=\"GPUModeStandard\" xml:space=\"preserve\">\n    <value>iGPU + dGPU</value>\n  </data>\n  <data name=\"GPUModeUltimate\" xml:space=\"preserve\">\n    <value>Exclusivo dGPU</value>\n  </data>\n  <data name=\"GPUPower\" xml:space=\"preserve\">\n    <value>Energía de GPU</value>\n  </data>\n  <data name=\"GPUSettings\" xml:space=\"preserve\">\n    <value>Ajustes de GPU</value>\n  </data>\n  <data name=\"GPUTempTarget\" xml:space=\"preserve\">\n    <value>Temperatura objetivo</value>\n  </data>\n  <data name=\"HibernateAfter\" xml:space=\"preserve\">\n    <value>Minutos hasta hibernación en suspensión con batería (0 - OFF)</value>\n  </data>\n  <data name=\"High\" xml:space=\"preserve\">\n    <value>Alto</value>\n  </data>\n  <data name=\"ImageRotation\" xml:space=\"preserve\">\n    <value>Rotación de imagen</value>\n  </data>\n  <data name=\"Import\" xml:space=\"preserve\">\n    <value>Importar perfil</value>\n  </data>\n  <data name=\"KeyBindings\" xml:space=\"preserve\">\n    <value>Teclas de acceso rápido</value>\n  </data>\n  <data name=\"Keyboard\" xml:space=\"preserve\">\n    <value>Teclado</value>\n  </data>\n  <data name=\"KillGpuApps\" xml:space=\"preserve\">\n    <value>Detener todas las aplicaciones que usan la dGPU cuando se cambia a Eco</value>\n  </data>\n  <data name=\"LaptopBacklight\" xml:space=\"preserve\">\n    <value>Retroiluminación</value>\n  </data>\n  <data name=\"LaptopKeyboard\" xml:space=\"preserve\">\n    <value>Teclado del portátil</value>\n  </data>\n  <data name=\"LaptopScreen\" xml:space=\"preserve\">\n    <value>Pantalla del portátil</value>\n  </data>\n  <data name=\"LEDStatusIndicators\" xml:space=\"preserve\">\n    <value>Indicadores de estado LED</value>\n  </data>\n  <data name=\"Lid\" xml:space=\"preserve\">\n    <value>Tapa</value>\n  </data>\n  <data name=\"Lightbar\" xml:space=\"preserve\">\n    <value>Barra de luz</value>\n  </data>\n  <data name=\"Lighting\" xml:space=\"preserve\">\n    <value>Iluminación</value>\n  </data>\n  <data name=\"LockScreen\" xml:space=\"preserve\">\n    <value>Pantalla de bloqueo</value>\n  </data>\n  <data name=\"Logo\" xml:space=\"preserve\">\n    <value>Logo</value>\n  </data>\n  <data name=\"Low\" xml:space=\"preserve\">\n    <value>Bajo</value>\n  </data>\n  <data name=\"LSDeadzones\" xml:space=\"preserve\">\n    <value>Punto muerto stick izquierdo</value>\n  </data>\n  <data name=\"LTDeadzones\" xml:space=\"preserve\">\n    <value>Punto muerto gatillo izquierdo</value>\n  </data>\n  <data name=\"MatrixAudio\" xml:space=\"preserve\">\n    <value>Visualizador de audio</value>\n  </data>\n  <data name=\"MatrixBanner\" xml:space=\"preserve\">\n    <value>Banner binario</value>\n  </data>\n  <data name=\"MatrixBright\" xml:space=\"preserve\">\n    <value>Brillante</value>\n  </data>\n  <data name=\"MatrixClock\" xml:space=\"preserve\">\n    <value>Reloj</value>\n  </data>\n  <data name=\"MatrixDim\" xml:space=\"preserve\">\n    <value>Tenue</value>\n  </data>\n  <data name=\"MatrixLogo\" xml:space=\"preserve\">\n    <value>Logo ROG</value>\n  </data>\n  <data name=\"MatrixMedium\" xml:space=\"preserve\">\n    <value>Medio</value>\n  </data>\n  <data name=\"MatrixOff\" xml:space=\"preserve\">\n    <value>Apagado</value>\n  </data>\n  <data name=\"MatrixPicture\" xml:space=\"preserve\">\n    <value>Imagen</value>\n  </data>\n  <data name=\"MaxRefreshTooltip\" xml:space=\"preserve\">\n    <value>Frecuencia de actualización máxima para una latencia más baja</value>\n  </data>\n  <data name=\"MinRefreshTooltip\" xml:space=\"preserve\">\n    <value>Frecuencia de actualización de 60Hz para ahorrar batería</value>\n  </data>\n  <data name=\"Minute\" xml:space=\"preserve\">\n    <value>Minuto</value>\n  </data>\n  <data name=\"Minutes\" xml:space=\"preserve\">\n    <value>Minutos</value>\n  </data>\n  <data name=\"MouseAngleSnapping\" xml:space=\"preserve\">\n    <value>Corrección de Ángulo / Ajuste</value>\n  </data>\n  <data name=\"MouseAutoPowerOff\" xml:space=\"preserve\">\n    <value>Auto-apagar tras</value>\n  </data>\n  <data name=\"MouseButtonResponse\" xml:space=\"preserve\">\n    <value>Respuesta del botón</value>\n  </data>\n  <data name=\"MouseImportFailed\" xml:space=\"preserve\">\n    <value>Importación fallida. El archivo seleccionado no es un perfil válido o está corrupto.</value>\n  </data>\n  <data name=\"MouseLiftOffDistance\" xml:space=\"preserve\">\n    <value>Distancia de despegue (LOD)</value>\n  </data>\n  <data name=\"MouseLowBatteryWarning\" xml:space=\"preserve\">\n    <value>Aviso de batería baja al</value>\n  </data>\n  <data name=\"MousePerformance\" xml:space=\"preserve\">\n    <value>Rendimiento</value>\n  </data>\n  <data name=\"MouseSynchronize\" xml:space=\"preserve\">\n    <value>Sincronizar con el ratón</value>\n  </data>\n  <data name=\"Multizone\" xml:space=\"preserve\">\n    <value>Multizona</value>\n  </data>\n  <data name=\"MultizoneStrong\" xml:space=\"preserve\">\n    <value>Multizona fuerte</value>\n  </data>\n  <data name=\"Muted\" xml:space=\"preserve\">\n    <value>Silenciado</value>\n  </data>\n  <data name=\"MuteMic\" xml:space=\"preserve\">\n    <value>Silenciar micrófono</value>\n  </data>\n  <data name=\"Never\" xml:space=\"preserve\">\n    <value>Nunca</value>\n  </data>\n  <data name=\"NewUpdates\" xml:space=\"preserve\">\n    <value>Nuevas actualizaciones</value>\n  </data>\n  <data name=\"NoNewUpdates\" xml:space=\"preserve\">\n    <value>No hay actualizaciones</value>\n  </data>\n  <data name=\"NotConnected\" xml:space=\"preserve\">\n    <value>No conectado</value>\n  </data>\n  <data name=\"Off\" xml:space=\"preserve\">\n    <value>Apagado</value>\n  </data>\n  <data name=\"On\" xml:space=\"preserve\">\n    <value>Encendido</value>\n  </data>\n  <data name=\"OneZone\" xml:space=\"preserve\">\n    <value>Una zona</value>\n  </data>\n  <data name=\"OpenGHelper\" xml:space=\"preserve\">\n    <value>Abrir ventana G-Helper</value>\n  </data>\n  <data name=\"Optimized\" xml:space=\"preserve\">\n    <value>Optimizado</value>\n  </data>\n  <data name=\"OptimizedGPUTooltip\" xml:space=\"preserve\">\n    <value>Cambiar a Eco con batería y a Estándar cuando está enchufado</value>\n  </data>\n  <data name=\"OptimizedUSBC\" xml:space=\"preserve\">\n    <value>Deshabilitar dGPU con cargador USB-C en modo Optimizado</value>\n  </data>\n  <data name=\"Other\" xml:space=\"preserve\">\n    <value>Otro</value>\n  </data>\n  <data name=\"Overdrive\" xml:space=\"preserve\">\n    <value>Overdrive</value>\n  </data>\n  <data name=\"PerformanceMode\" xml:space=\"preserve\">\n    <value>Modo</value>\n  </data>\n  <data name=\"Peripherals\" xml:space=\"preserve\">\n    <value>Periféricos</value>\n  </data>\n  <data name=\"PictureGif\" xml:space=\"preserve\">\n    <value>Imagen / Gif</value>\n  </data>\n  <data name=\"PlayPause\" xml:space=\"preserve\">\n    <value>Reproducir / Pausar</value>\n  </data>\n  <data name=\"PollingRate\" xml:space=\"preserve\">\n    <value>Velocidad de respuesta</value>\n  </data>\n  <data name=\"PowerLimits\" xml:space=\"preserve\">\n    <value>Límites de energía</value>\n  </data>\n  <data name=\"PPTExperimental\" xml:space=\"preserve\">\n    <value>Los límites de energía son una característica experimental. ¡Úselo con cuidado y bajo su propio riesgo!</value>\n  </data>\n  <data name=\"PrintScreen\" xml:space=\"preserve\">\n    <value>Capturar pantalla</value>\n  </data>\n  <data name=\"Profile\" xml:space=\"preserve\">\n    <value>Perfil</value>\n  </data>\n  <data name=\"Quit\" xml:space=\"preserve\">\n    <value>Quitar</value>\n  </data>\n  <data name=\"Reset\" xml:space=\"preserve\">\n    <value>Reiniciar</value>\n  </data>\n  <data name=\"RestartGPU\" xml:space=\"preserve\">\n    <value>Algo está usando la dGPU e impide el modo Eco. ¿Reiniciar dGPU en el administrador de dispositivos? (Proceda bajo su propio riesgo)</value>\n  </data>\n  <data name=\"RPM\" xml:space=\"preserve\">\n    <value>RPM</value>\n  </data>\n  <data name=\"RSDeadzones\" xml:space=\"preserve\">\n    <value>Punto muerto stick derecho</value>\n  </data>\n  <data name=\"RTDeadzones\" xml:space=\"preserve\">\n    <value>Punto muerto gatillo derecho</value>\n  </data>\n  <data name=\"RunOnStartup\" xml:space=\"preserve\">\n    <value>Ejecutar al inicio</value>\n  </data>\n  <data name=\"ScalingQuality\" xml:space=\"preserve\">\n    <value>Calidad del escalado</value>\n  </data>\n  <data name=\"ScreenPadDown\" xml:space=\"preserve\">\n    <value>Bajar brillo ScreenPad</value>\n  </data>\n  <data name=\"ScreenPadUp\" xml:space=\"preserve\">\n    <value>Subir brillo ScreenPad</value>\n  </data>\n  <data name=\"Shutdown\" xml:space=\"preserve\">\n    <value>Al apagar</value>\n  </data>\n  <data name=\"Silent\" xml:space=\"preserve\">\n    <value>Silencio</value>\n  </data>\n  <data name=\"Sleep\" xml:space=\"preserve\">\n    <value>En suspensión</value>\n  </data>\n  <data name=\"StandardGPUTooltip\" xml:space=\"preserve\">\n    <value>Habilita la dGPU para uso estándar</value>\n  </data>\n  <data name=\"StandardMode\" xml:space=\"preserve\">\n    <value>Estándar</value>\n  </data>\n  <data name=\"Start\" xml:space=\"preserve\">\n    <value>Iniciar</value>\n  </data>\n  <data name=\"StartingServices\" xml:space=\"preserve\">\n    <value>Iniciando servicios</value>\n  </data>\n  <data name=\"StartupError\" xml:space=\"preserve\">\n    <value>Error al iniciar</value>\n  </data>\n  <data name=\"Stop\" xml:space=\"preserve\">\n    <value>Detener</value>\n  </data>\n  <data name=\"StopGPUApps\" xml:space=\"preserve\">\n    <value>Detener aplicaciones dGPU</value>\n  </data>\n  <data name=\"StoppingServices\" xml:space=\"preserve\">\n    <value>Deteniendo servicios</value>\n  </data>\n  <data name=\"ToggleAura\" xml:space=\"preserve\">\n    <value>Alternar Aura</value>\n  </data>\n  <data name=\"ToggleClamshellMode\" xml:space=\"preserve\">\n    <value>Cambiar automáticamente a modo Clamshell</value>\n  </data>\n  <data name=\"ToggleFnLock\" xml:space=\"preserve\">\n    <value>Alternar bloqueo Fn</value>\n  </data>\n  <data name=\"ToggleMiniled\" xml:space=\"preserve\">\n    <value>Alternar Miniled (si compatible)</value>\n  </data>\n  <data name=\"ToggleScreen\" xml:space=\"preserve\">\n    <value>Alternar pantalla</value>\n  </data>\n  <data name=\"ToggleTouchscreen\" xml:space=\"preserve\">\n    <value>Alternar pantalla táctil</value>\n  </data>\n  <data name=\"Touchscreen\" xml:space=\"preserve\">\n    <value>Pantalla táctil</value>\n  </data>\n  <data name=\"Turbo\" xml:space=\"preserve\">\n    <value>Turbo</value>\n  </data>\n  <data name=\"TurnedOff\" xml:space=\"preserve\">\n    <value>Apagado</value>\n  </data>\n  <data name=\"TurnOffOnBattery\" xml:space=\"preserve\">\n    <value>Apagar con batería</value>\n  </data>\n  <data name=\"UltimateGPUTooltip\" xml:space=\"preserve\">\n    <value>Enruta la pantalla del portátil a la dGPU, maximizando FPS</value>\n  </data>\n  <data name=\"UltimateMode\" xml:space=\"preserve\">\n    <value>Ultimate</value>\n  </data>\n  <data name=\"UndervoltingRisky\" xml:space=\"preserve\">\n    <value>Undervolting es una característica experimental. Aplicar valores demasiado bajos puede causar inestabilidad en el hardware o corrupción de datos. Si desea probar, empiece con valores pequeños, haga click en Aplicar y pruebe.</value>\n  </data>\n  <data name=\"Unmuted\" xml:space=\"preserve\">\n    <value>No silenciado</value>\n  </data>\n  <data name=\"Updates\" xml:space=\"preserve\">\n    <value>Actualización</value>\n  </data>\n  <data name=\"VersionLabel\" xml:space=\"preserve\">\n    <value>Versión</value>\n  </data>\n  <data name=\"VibrationStrength\" xml:space=\"preserve\">\n    <value>Intensidad de vibración</value>\n  </data>\n  <data name=\"VisualMode\" xml:space=\"preserve\">\n    <value>Modo visual</value>\n  </data>\n  <data name=\"VisualModesHDR\" xml:space=\"preserve\">\n    <value>Los modos visuales no están disponibles cuando el HDR está activo</value>\n  </data>\n  <data name=\"VisualModesScreen\" xml:space=\"preserve\">\n    <value>Los modos visuales no están disponibles cuando la pantalla portátil está apagada</value>\n  </data>\n  <data name=\"VolumeDown\" xml:space=\"preserve\">\n    <value>Bajar volumen</value>\n  </data>\n  <data name=\"VolumeMute\" xml:space=\"preserve\">\n    <value>Silenciar volumen</value>\n  </data>\n  <data name=\"VolumeUp\" xml:space=\"preserve\">\n    <value>Subir volumen</value>\n  </data>\n  <data name=\"WindowTop\" xml:space=\"preserve\">\n    <value>Mantener aplicación siempre visible</value>\n  </data>\n  <data name=\"Zoom\" xml:space=\"preserve\">\n    <value>Zoom</value>\n  </data>\n  <data name=\"Donate\" xml:space=\"preserve\">\n    <value>Donar</value>\n  </data>\n  <data name=\"Legend\" xml:space=\"preserve\">\n    <value>Leyenda</value>\n  </data>\n  <data name=\"LegendGray\" xml:space=\"preserve\">\n    <value>No se puede comprobar la versión local</value>\n    <comment>Can't check local version</comment>\n  </data>\n  <data name=\"LegendRed\" xml:space=\"preserve\">\n    <value>Actualización disponible</value>\n    <comment>Update Available</comment>\n  </data>\n  <data name=\"LegendGreen\" xml:space=\"preserve\">\n    <value>Actualizado</value>\n    <comment>Updated</comment>\n  </data>\n  <data name=\"SlashBounce\" xml:space=\"preserve\">\n    <value>Bote</value>\n  </data>\n  <data name=\"SlashMode\" xml:space=\"preserve\">\n    <value>Barra inclinada</value>\n  </data>\n  <data name=\"SlashLoading\" xml:space=\"preserve\">\n    <value>Cargando</value>\n  </data>\n  <data name=\"SlashBitStream\" xml:space=\"preserve\">\n    <value>Flujo de bits</value>\n  </data>\n  <data name=\"SlashTransmission\" xml:space=\"preserve\">\n    <value>Transmisión</value>\n  </data>\n  <data name=\"SlashFlow\" xml:space=\"preserve\">\n    <value>Fluir</value>\n  </data>\n  <data name=\"SlashFlux\" xml:space=\"preserve\">\n    <value>Flujo</value>\n  </data>\n  <data name=\"SlashPhantom\" xml:space=\"preserve\">\n    <value>Fantasma</value>\n  </data>\n  <data name=\"SlashSpectrum\" xml:space=\"preserve\">\n    <value>Espectro</value>\n  </data>\n  <data name=\"SlashHazard\" xml:space=\"preserve\">\n    <value>Peligro</value>\n  </data>\n  <data name=\"SlashInterfacing\" xml:space=\"preserve\">\n    <value>Interfaces</value>\n  </data>\n  <data name=\"SlashRamp\" xml:space=\"preserve\">\n    <value>Rampa</value>\n  </data>\n  <data name=\"SlashGameOver\" xml:space=\"preserve\">\n    <value>Fin de la partida</value>\n  </data>\n  <data name=\"SlashStart\" xml:space=\"preserve\">\n    <value>Comenzar</value>\n  </data>\n  <data name=\"SlashBuzzer\" xml:space=\"preserve\">\n    <value>Zumbador</value>\n  </data>\n  <data name=\"SlashStatic\" xml:space=\"preserve\">\n    <value>Estático</value>\n  </data>\n  <data name=\"SlashBatteryLevel\" xml:space=\"preserve\">\n    <value>Nivel de Batería</value>\n  </data>\n  <data name=\"IntervalOff\" xml:space=\"preserve\">\n    <value>Intervalo Apagado</value>\n  </data>\n  <data name=\"IntervalSeconds\" xml:space=\"preserve\">\n    <value>Intervalo {0}s</value>\n  </data>\n  <data name=\"DisableDynamicLighting\" xml:space=\"preserve\">\n    <value>Por favor, desactive Windows &gt; Iluminación dinámica</value>\n  </data>\n  <data name=\"AmbientModeResources\" xml:space=\"preserve\">\n    <value>El modo ambiente puede aumentar el uso de recursos</value>\n  </data>\n  <data name=\"MouseMotionSync\" xml:space=\"preserve\">\n    <value>Sincronización de movimiento</value>\n  </data>\n  <data name=\"MouseZoneMode\" xml:space=\"preserve\">\n    <value>Modo zona</value>\n  </data>\n</root>"
  },
  {
    "path": "app/Properties/Strings.fr.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" id=\"root\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\"/>\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"name\" type=\"xsd:string\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\"/>\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Acceleration\" xml:space=\"preserve\">\n    <value>Accélération</value>\n  </data>\n  <data name=\"ACPIError\" xml:space=\"preserve\">\n    <value>Connexion impossible avec ASUS ACPI. L'application ne peut fonctionner sans. Veuillez installer Asus System Control Interface</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestart\" xml:space=\"preserve\">\n    <value>Redémarrez votre appareil pour appliquer les modifications</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestartTitle\" xml:space=\"preserve\">\n    <value>Redémarrer maintenant ?</value>\n  </data>\n  <data name=\"AlertDGPU\" xml:space=\"preserve\">\n    <value>Le GPU semble être surchargé, voulez-vous le désactiver ?</value>\n  </data>\n  <data name=\"AlertDGPUTitle\" xml:space=\"preserve\">\n    <value>Mode Éco</value>\n  </data>\n  <data name=\"AlertUltimateOff\" xml:space=\"preserve\">\n    <value>Désactiver le Mode Ultime requiert un redémarrage</value>\n  </data>\n  <data name=\"AlertUltimateOn\" xml:space=\"preserve\">\n    <value>Activer le Mode Ultime requiert un redémarrage</value>\n  </data>\n  <data name=\"AlertUltimateTitle\" xml:space=\"preserve\">\n    <value>Redémarrer maintenant ?</value>\n  </data>\n  <data name=\"AllyController\" xml:space=\"preserve\">\n    <value>Contrôleur Ally </value>\n  </data>\n  <data name=\"AnimationSpeed\" xml:space=\"preserve\">\n    <value>Vitesse de l'animation</value>\n  </data>\n  <data name=\"AnimeMatrix\" xml:space=\"preserve\">\n    <value>Anime Matrix</value>\n  </data>\n  <data name=\"AppAlreadyRunning\" xml:space=\"preserve\">\n    <value>L'application est déjà en cours d'exécution</value>\n  </data>\n  <data name=\"AppAlreadyRunningText\" xml:space=\"preserve\">\n    <value>G-Helper est déjà en cours d'exécution. Vérifiez la barre d'état système.</value>\n  </data>\n  <data name=\"Apply\" xml:space=\"preserve\">\n    <value>Appliquer</value>\n  </data>\n  <data name=\"ApplyFanCurve\" xml:space=\"preserve\">\n    <value>Appliquer la courbe</value>\n  </data>\n  <data name=\"ApplyPowerLimits\" xml:space=\"preserve\">\n    <value>Appliquer les limites</value>\n  </data>\n  <data name=\"ApplyWindowsPowerPlan\" xml:space=\"preserve\">\n    <value>Ajustement auto des modes de gestion alim. Windows</value>\n  </data>\n  <data name=\"APUMemory\" xml:space=\"preserve\">\n    <value>Mémoire attribuée au GPU</value>\n  </data>\n  <data name=\"AsusServicesRunning\" xml:space=\"preserve\">\n    <value>Services Asus actifs </value>\n  </data>\n  <data name=\"AuraBatteryState\" xml:space=\"preserve\">\n    <value>État de la batterie</value>\n  </data>\n  <data name=\"AuraBreathe\" xml:space=\"preserve\">\n    <value>Pulsation</value>\n  </data>\n  <data name=\"AuraClockwise\" xml:space=\"preserve\">\n    <value>Sens horaire</value>\n  </data>\n  <data name=\"AuraColorCycle\" xml:space=\"preserve\">\n    <value>Cycle de couleur</value>\n  </data>\n  <data name=\"AuraComet\" xml:space=\"preserve\">\n    <value>Comète</value>\n  </data>\n  <data name=\"AuraCounterClockwise\" xml:space=\"preserve\">\n    <value>Sens antihoraire</value>\n  </data>\n  <data name=\"AuraFast\" xml:space=\"preserve\">\n    <value>Rapide</value>\n  </data>\n  <data name=\"AuraLightingMode\" xml:space=\"preserve\">\n    <value>Effets d'éclairage</value>\n  </data>\n  <data name=\"AuraNormal\" xml:space=\"preserve\">\n    <value>Normal</value>\n  </data>\n  <data name=\"AuraRainbow\" xml:space=\"preserve\">\n    <value>Arc-en-ciel</value>\n  </data>\n  <data name=\"AuraRandomColor\" xml:space=\"preserve\">\n    <value>Aléatoire</value>\n  </data>\n  <data name=\"AuraReact\" xml:space=\"preserve\">\n    <value>Réagir</value>\n  </data>\n  <data name=\"AuraSlow\" xml:space=\"preserve\">\n    <value>Lent</value>\n  </data>\n  <data name=\"AuraStatic\" xml:space=\"preserve\">\n    <value>Statique</value>\n  </data>\n  <data name=\"AuraStrobe\" xml:space=\"preserve\">\n    <value>Stroboscopique</value>\n  </data>\n  <data name=\"AuraZoneAll\" xml:space=\"preserve\">\n    <value>Tout</value>\n  </data>\n  <data name=\"AuraZoneDock\" xml:space=\"preserve\">\n    <value>Station d'accueil</value>\n  </data>\n  <data name=\"AuraZoneLogo\" xml:space=\"preserve\">\n    <value>Logo</value>\n  </data>\n  <data name=\"AuraZoneScroll\" xml:space=\"preserve\">\n    <value>Molette</value>\n  </data>\n  <data name=\"AuraZoneUnderglow\" xml:space=\"preserve\">\n    <value>Led ROG</value>\n  </data>\n  <data name=\"AutoApply\" xml:space=\"preserve\">\n    <value>Appliquer automatiquement</value>\n  </data>\n  <data name=\"AutoMode\" xml:space=\"preserve\">\n    <value>Automatique</value>\n  </data>\n  <data name=\"AutoRefreshTooltip\" xml:space=\"preserve\">\n    <value>Limite à 60 Hz pour éco. batterie, valeur normale sur secteur</value>\n  </data>\n  <data name=\"Awake\" xml:space=\"preserve\">\n    <value>Allumé</value>\n  </data>\n  <data name=\"BacklightLow\" xml:space=\"preserve\">\n    <value>Faible</value>\n  </data>\n  <data name=\"BacklightMax\" xml:space=\"preserve\">\n    <value>Maximum</value>\n  </data>\n  <data name=\"BacklightMid\" xml:space=\"preserve\">\n    <value>Moyen</value>\n  </data>\n  <data name=\"BacklightOff\" xml:space=\"preserve\">\n    <value>Désactivé</value>\n  </data>\n  <data name=\"BacklightTimeout\" xml:space=\"preserve\">\n    <value>Délai branché / sur batterie (0 - ON)</value>\n  </data>\n  <data name=\"BacklightTimeoutBattery\" xml:space=\"preserve\">\n    <value>Délai de rétro-éclairage sur batterie</value>\n  </data>\n  <data name=\"BacklightTimeoutPlugged\" xml:space=\"preserve\">\n    <value>Délai de rétro-éclairage sur secteur</value>\n  </data>\n  <data name=\"Balanced\" xml:space=\"preserve\">\n    <value>Équilibré</value>\n  </data>\n  <data name=\"BatteryCharge\" xml:space=\"preserve\">\n    <value>Charge de la batterie </value>\n  </data>\n  <data name=\"BatteryChargeLimit\" xml:space=\"preserve\">\n    <value>Limite de charge </value>\n  </data>\n  <data name=\"BatteryHealth\" xml:space=\"preserve\">\n    <value>Santé de la batterie </value>\n  </data>\n  <data name=\"BatteryLimitFull\" xml:space=\"preserve\">\n    <value>Charge unique à 100%</value>\n  </data>\n  <data name=\"Binding\" xml:space=\"preserve\">\n    <value>Liaison</value>\n  </data>\n  <data name=\"BindingPrimary\" xml:space=\"preserve\">\n    <value>Primaire</value>\n  </data>\n  <data name=\"BindingSecondary\" xml:space=\"preserve\">\n    <value>Secondaire</value>\n  </data>\n  <data name=\"BiosAndDriverUpdates\" xml:space=\"preserve\">\n    <value>Mises à jour BIOS et pilotes </value>\n  </data>\n  <data name=\"Boot\" xml:space=\"preserve\">\n    <value>Au démarrage</value>\n  </data>\n  <data name=\"BootSound\" xml:space=\"preserve\">\n    <value>Son au démarrage</value>\n  </data>\n  <data name=\"Brightness\" xml:space=\"preserve\">\n    <value>Luminosité</value>\n  </data>\n  <data name=\"BrightnessDown\" xml:space=\"preserve\">\n    <value>Baisser la luminosité</value>\n  </data>\n  <data name=\"BrightnessUp\" xml:space=\"preserve\">\n    <value>Augmenter la luminosité</value>\n  </data>\n  <data name=\"BWTrayIcon\" xml:space=\"preserve\">\n    <value>Icône de la zone de notification en noir et blanc</value>\n  </data>\n  <data name=\"Calibrate\" xml:space=\"preserve\">\n    <value>Calibrer</value>\n  </data>\n  <data name=\"Charging\" xml:space=\"preserve\">\n    <value>Taux de charge </value>\n  </data>\n  <data name=\"Color\" xml:space=\"preserve\">\n    <value>Couleur</value>\n  </data>\n  <data name=\"Contrast\" xml:space=\"preserve\">\n    <value>Contraste</value>\n  </data>\n  <data name=\"Controller\" xml:space=\"preserve\">\n    <value>Contrôleur</value>\n  </data>\n  <data name=\"CPUBoost\" xml:space=\"preserve\">\n    <value>CPU Boost</value>\n  </data>\n  <data name=\"Custom\" xml:space=\"preserve\">\n    <value>Personnalisé</value>\n  </data>\n  <data name=\"Deceleration\" xml:space=\"preserve\">\n    <value>Décélération</value>\n  </data>\n  <data name=\"Default\" xml:space=\"preserve\">\n    <value>Par défaut</value>\n  </data>\n  <data name=\"DisableController\" xml:space=\"preserve\">\n    <value>Désactiver le contrôleur</value>\n  </data>\n  <data name=\"DisableOnLidClose\" xml:space=\"preserve\">\n    <value>Désactiver à la fermeture du capot</value>\n  </data>\n  <data name=\"DisableOverdrive\" xml:space=\"preserve\">\n    <value>Désactiver l'overdrive de l'écran</value>\n  </data>\n  <data name=\"Discharging\" xml:space=\"preserve\">\n    <value>Taux de décharge </value>\n  </data>\n  <data name=\"DownloadColorProfiles\" xml:space=\"preserve\">\n    <value>Télécharger les profils de couleurs</value>\n  </data>\n  <data name=\"DownloadUpdate\" xml:space=\"preserve\">\n    <value>Télécharger</value>\n  </data>\n  <data name=\"DriverAndSoftware\" xml:space=\"preserve\">\n    <value>Pilotes et logiciels</value>\n  </data>\n  <data name=\"EcoGPUTooltip\" xml:space=\"preserve\">\n    <value>Désactive le dGPU pour préserver la batterie</value>\n  </data>\n  <data name=\"EcoMode\" xml:space=\"preserve\">\n    <value>Éco</value>\n  </data>\n  <data name=\"EnableGPUOnShutdown\" xml:space=\"preserve\">\n    <value>Activer le GPU lors de l'arrêt (empêche les problèmes avec le mode Éco)</value>\n  </data>\n  <data name=\"EnableOptimusText\" xml:space=\"preserve\">\n    <value>Désactiver le dGPU en passant au mode Eco pendant que le mode d'affichage dans le panneau de configuration NVIDIA n'est pas réglé sur Optimus peut causer des problèmes avec les commandes de luminosité jusqu'au prochain redémarrage.\n\nVoulez-vous continuer ?</value>\n  </data>\n  <data name=\"EnableOptimusTitle\" xml:space=\"preserve\">\n    <value>Le mode d'affichage NVIDIA n'est pas réglé sur Optimus</value>\n  </data>\n  <data name=\"EnergySettings\" xml:space=\"preserve\">\n    <value>Paramètres d'énergie</value>\n  </data>\n  <data name=\"Export\" xml:space=\"preserve\">\n    <value>Exporter profil</value>\n  </data>\n  <data name=\"Extra\" xml:space=\"preserve\">\n    <value>+ d'options</value>\n  </data>\n  <data name=\"ExtraSettings\" xml:space=\"preserve\">\n    <value>Paramètres supplémentaires</value>\n  </data>\n  <data name=\"FactoryDefaults\" xml:space=\"preserve\">\n    <value>Paramètres d'usine</value>\n  </data>\n  <data name=\"FanCurves\" xml:space=\"preserve\">\n    <value>Courbes des ventilateurs</value>\n  </data>\n  <data name=\"FanProfileCPU\" xml:space=\"preserve\">\n    <value>Profil du ventilateur CPU</value>\n  </data>\n  <data name=\"FanProfileGPU\" xml:space=\"preserve\">\n    <value>Profil du ventilateur GPU</value>\n  </data>\n  <data name=\"FanProfileMid\" xml:space=\"preserve\">\n    <value>Profil du ventilateur central</value>\n  </data>\n  <data name=\"FanProfiles\" xml:space=\"preserve\">\n    <value>Profil des ventilateurs</value>\n  </data>\n  <data name=\"FansAndPower\" xml:space=\"preserve\">\n    <value>Ventilateurs + Puissance</value>\n  </data>\n  <data name=\"FanSpeed\" xml:space=\"preserve\">\n    <value>Ventilateur</value>\n  </data>\n  <data name=\"FansPower\" xml:space=\"preserve\">\n    <value>Ventilateurs + Puissance</value>\n  </data>\n  <data name=\"FlickerFreeDimming\" xml:space=\"preserve\">\n    <value>Gradation OLED sans scintillement</value>\n  </data>\n  <data name=\"FnLock\" xml:space=\"preserve\">\n    <value>Traiter les raccourcis clavier Fn+F sans Fn</value>\n  </data>\n  <data name=\"FnLockOff\" xml:space=\"preserve\">\n    <value>Verrouillage Fn désactivé</value>\n  </data>\n  <data name=\"FnLockOn\" xml:space=\"preserve\">\n    <value>Verrouillage Fn activé</value>\n  </data>\n  <data name=\"GPUBoost\" xml:space=\"preserve\">\n    <value>Dynamic Boost</value>\n  </data>\n  <data name=\"GPUChanging\" xml:space=\"preserve\">\n    <value>Changement</value>\n  </data>\n  <data name=\"GPUCoreClockOffset\" xml:space=\"preserve\">\n    <value>Ajustement fréq. de base</value>\n  </data>\n  <data name=\"GPUMemoryClockOffset\" xml:space=\"preserve\">\n    <value>Ajustement fréq. mémoire</value>\n  </data>\n  <data name=\"GPUMode\" xml:space=\"preserve\">\n    <value>Mode GPU </value>\n  </data>\n  <data name=\"GPUModeEco\" xml:space=\"preserve\">\n    <value>iGPU uniquement</value>\n  </data>\n  <data name=\"GPUModeStandard\" xml:space=\"preserve\">\n    <value>iGPU + dGPU</value>\n  </data>\n  <data name=\"GPUModeUltimate\" xml:space=\"preserve\">\n    <value>dGPU exclusif</value>\n  </data>\n  <data name=\"GPUPower\" xml:space=\"preserve\">\n    <value>Puissance du GPU</value>\n  </data>\n  <data name=\"GPUSettings\" xml:space=\"preserve\">\n    <value>Paramètres du GPU</value>\n  </data>\n  <data name=\"GPUTempTarget\" xml:space=\"preserve\">\n    <value>Température cible</value>\n  </data>\n  <data name=\"HibernateAfter\" xml:space=\"preserve\">\n    <value>Minutes avant mise en veille prolongée sur batterie (0 - OFF)</value>\n  </data>\n  <data name=\"High\" xml:space=\"preserve\">\n    <value>Élevé</value>\n  </data>\n  <data name=\"ImageRotation\" xml:space=\"preserve\">\n    <value>Rotation de l'image</value>\n  </data>\n  <data name=\"Import\" xml:space=\"preserve\">\n    <value>Importer profil</value>\n  </data>\n  <data name=\"KeyBindings\" xml:space=\"preserve\">\n    <value>Raccourcis clavier</value>\n  </data>\n  <data name=\"Keyboard\" xml:space=\"preserve\">\n    <value>Clavier</value>\n  </data>\n  <data name=\"KillGpuApps\" xml:space=\"preserve\">\n    <value>Arrêter toutes les applications utilisant la dGPU lors du passage au mode Eco</value>\n  </data>\n  <data name=\"LaptopBacklight\" xml:space=\"preserve\">\n    <value>Rétroéclairage du clavier</value>\n  </data>\n  <data name=\"LaptopKeyboard\" xml:space=\"preserve\">\n    <value>Clavier</value>\n  </data>\n  <data name=\"LaptopScreen\" xml:space=\"preserve\">\n    <value>Écran</value>\n  </data>\n  <data name=\"LEDStatusIndicators\" xml:space=\"preserve\">\n    <value>Indicateurs d'état LED</value>\n  </data>\n  <data name=\"Lid\" xml:space=\"preserve\">\n    <value>Capot</value>\n  </data>\n  <data name=\"Lightbar\" xml:space=\"preserve\">\n    <value>Barre lumineuse</value>\n  </data>\n  <data name=\"Lighting\" xml:space=\"preserve\">\n    <value>Éclairage</value>\n  </data>\n  <data name=\"LockScreen\" xml:space=\"preserve\">\n    <value>Écran de verrouillage</value>\n  </data>\n  <data name=\"Logo\" xml:space=\"preserve\">\n    <value>Logo</value>\n  </data>\n  <data name=\"Low\" xml:space=\"preserve\">\n    <value>Faible</value>\n  </data>\n  <data name=\"LSDeadzones\" xml:space=\"preserve\">\n    <value>Stick gauche des zones mortes</value>\n  </data>\n  <data name=\"LTDeadzones\" xml:space=\"preserve\">\n    <value>Gâchette gauche des zones mortes</value>\n  </data>\n  <data name=\"MatrixAudio\" xml:space=\"preserve\">\n    <value>Visualiseur Audio</value>\n  </data>\n  <data name=\"MatrixBanner\" xml:space=\"preserve\">\n    <value>Bannière binaire</value>\n  </data>\n  <data name=\"MatrixBright\" xml:space=\"preserve\">\n    <value>Lumineux</value>\n  </data>\n  <data name=\"MatrixClock\" xml:space=\"preserve\">\n    <value>Horloge</value>\n  </data>\n  <data name=\"MatrixDim\" xml:space=\"preserve\">\n    <value>Faible</value>\n  </data>\n  <data name=\"MatrixLogo\" xml:space=\"preserve\">\n    <value>Logo ROG</value>\n  </data>\n  <data name=\"MatrixMedium\" xml:space=\"preserve\">\n    <value>Moyen</value>\n  </data>\n  <data name=\"MatrixOff\" xml:space=\"preserve\">\n    <value>Éteint</value>\n  </data>\n  <data name=\"MatrixPicture\" xml:space=\"preserve\">\n    <value>Images</value>\n  </data>\n  <data name=\"MaxRefreshTooltip\" xml:space=\"preserve\">\n    <value>Rafraîchissement maximum, faible latence</value>\n  </data>\n  <data name=\"MinRefreshTooltip\" xml:space=\"preserve\">\n    <value>Rafraichîssement 60 Hz pour économiser de la batterie</value>\n  </data>\n  <data name=\"Minute\" xml:space=\"preserve\">\n    <value>Minute</value>\n  </data>\n  <data name=\"Minutes\" xml:space=\"preserve\">\n    <value>Minutes</value>\n  </data>\n  <data name=\"MouseAngleSnapping\" xml:space=\"preserve\">\n    <value>Angle Snapping / Tuning</value>\n  </data>\n  <data name=\"MouseAutoPowerOff\" xml:space=\"preserve\">\n    <value>Arrêt automatique après</value>\n  </data>\n  <data name=\"MouseButtonResponse\" xml:space=\"preserve\">\n    <value>Réponse du bouton</value>\n  </data>\n  <data name=\"MouseImportFailed\" xml:space=\"preserve\">\n    <value>Échec de l'importation. Le fichier sélectionné n'est pas un profil de souris valide ou corrompu.</value>\n  </data>\n  <data name=\"MouseLiftOffDistance\" xml:space=\"preserve\">\n    <value>Hauteur de détection</value>\n  </data>\n  <data name=\"MouseLowBatteryWarning\" xml:space=\"preserve\">\n    <value>Avertissement de batterie faible à</value>\n  </data>\n  <data name=\"MousePerformance\" xml:space=\"preserve\">\n    <value>Performance</value>\n  </data>\n  <data name=\"MouseSynchronize\" xml:space=\"preserve\">\n    <value>Synchroniser avec le pointeur</value>\n  </data>\n  <data name=\"Multizone\" xml:space=\"preserve\">\n    <value>Multi-zones</value>\n  </data>\n  <data name=\"MultizoneStrong\" xml:space=\"preserve\">\n    <value>Forte zone multiple</value>\n  </data>\n  <data name=\"Muted\" xml:space=\"preserve\">\n    <value>Son désactivé</value>\n  </data>\n  <data name=\"MuteMic\" xml:space=\"preserve\">\n    <value>Désactiver le micro</value>\n  </data>\n  <data name=\"Never\" xml:space=\"preserve\">\n    <value>Jamais</value>\n  </data>\n  <data name=\"NewUpdates\" xml:space=\"preserve\">\n    <value>Nouvelles mises à jour</value>\n  </data>\n  <data name=\"NoNewUpdates\" xml:space=\"preserve\">\n    <value>Aucune mise à jour disponible</value>\n  </data>\n  <data name=\"NotConnected\" xml:space=\"preserve\">\n    <value>Non connecté</value>\n  </data>\n  <data name=\"Off\" xml:space=\"preserve\">\n    <value>Désactivé</value>\n  </data>\n  <data name=\"On\" xml:space=\"preserve\">\n    <value>Activé</value>\n  </data>\n  <data name=\"OneZone\" xml:space=\"preserve\">\n    <value>Une zone</value>\n  </data>\n  <data name=\"OpenGHelper\" xml:space=\"preserve\">\n    <value>Ouvrir G-Helper</value>\n  </data>\n  <data name=\"Optimized\" xml:space=\"preserve\">\n    <value>Optimisé</value>\n  </data>\n  <data name=\"OptimizedGPUTooltip\" xml:space=\"preserve\">\n    <value>Éco sur batterie, bascule vers Standard sur secteur</value>\n  </data>\n  <data name=\"OptimizedUSBC\" xml:space=\"preserve\">\n    <value>Garder le GPU désactivé lorsque branché via USB-C en mode Optimisé</value>\n  </data>\n  <data name=\"Other\" xml:space=\"preserve\">\n    <value>Autres</value>\n  </data>\n  <data name=\"Overdrive\" xml:space=\"preserve\">\n    <value>Overdrive</value>\n  </data>\n  <data name=\"PerformanceMode\" xml:space=\"preserve\">\n    <value>Mode </value>\n  </data>\n  <data name=\"Peripherals\" xml:space=\"preserve\">\n    <value>Périphériques</value>\n  </data>\n  <data name=\"PictureGif\" xml:space=\"preserve\">\n    <value>Image / Gif</value>\n  </data>\n  <data name=\"PlayPause\" xml:space=\"preserve\">\n    <value>Lecture / Pause</value>\n  </data>\n  <data name=\"PollingRate\" xml:space=\"preserve\">\n    <value>Fréquence d'interrogation</value>\n  </data>\n  <data name=\"PowerLimits\" xml:space=\"preserve\">\n    <value>Limites de puissance</value>\n  </data>\n  <data name=\"PPTExperimental\" xml:space=\"preserve\">\n    <value>Limites de puissance est une fonctionnalité expérimentale. Faire attention, à utiliser à vos risques !</value>\n  </data>\n  <data name=\"PrintScreen\" xml:space=\"preserve\">\n    <value>Capture d'écran</value>\n  </data>\n  <data name=\"Profile\" xml:space=\"preserve\">\n    <value>Profil</value>\n  </data>\n  <data name=\"Quit\" xml:space=\"preserve\">\n    <value>Quitter</value>\n  </data>\n  <data name=\"Reset\" xml:space=\"preserve\">\n    <value>Réinitialiser</value>\n  </data>\n  <data name=\"RestartGPU\" xml:space=\"preserve\">\n    <value>Un programme utilise le dGPU et empêche le passage en mode Éco. Laissez G-Helper tenter un redémarrage du dGPU dans le gestionnaire de tâches ? (Procéder à vos propres risques)</value>\n  </data>\n  <data name=\"RPM\" xml:space=\"preserve\">\n    <value> RPM</value>\n  </data>\n  <data name=\"RSDeadzones\" xml:space=\"preserve\">\n    <value>Stick droit des zones mortes</value>\n  </data>\n  <data name=\"RTDeadzones\" xml:space=\"preserve\">\n    <value>Gâchette droite des zones mortes</value>\n  </data>\n  <data name=\"RunOnStartup\" xml:space=\"preserve\">\n    <value>Exécuter au démarrage</value>\n  </data>\n  <data name=\"ScalingQuality\" xml:space=\"preserve\">\n    <value>Qualité de Mise à l'échelle (Scaling)</value>\n  </data>\n  <data name=\"ScreenPadDown\" xml:space=\"preserve\">\n    <value>Baisser la luminosité du Screenpad</value>\n  </data>\n  <data name=\"ScreenPadUp\" xml:space=\"preserve\">\n    <value>Augmenter la luminosité du Screenpad</value>\n  </data>\n  <data name=\"Shutdown\" xml:space=\"preserve\">\n    <value>Arrêter</value>\n  </data>\n  <data name=\"Silent\" xml:space=\"preserve\">\n    <value>Silencieux</value>\n  </data>\n  <data name=\"Sleep\" xml:space=\"preserve\">\n    <value>Veille</value>\n  </data>\n  <data name=\"StandardGPUTooltip\" xml:space=\"preserve\">\n    <value>Active le dGPU pour une utilisation standard</value>\n  </data>\n  <data name=\"StandardMode\" xml:space=\"preserve\">\n    <value>Standard</value>\n  </data>\n  <data name=\"Start\" xml:space=\"preserve\">\n    <value>Démarrer</value>\n  </data>\n  <data name=\"StartingServices\" xml:space=\"preserve\">\n    <value>Démarrage des services</value>\n  </data>\n  <data name=\"StartupError\" xml:space=\"preserve\">\n    <value>Erreur au lancement</value>\n  </data>\n  <data name=\"Stop\" xml:space=\"preserve\">\n    <value>Stop</value>\n  </data>\n  <data name=\"StopGPUApps\" xml:space=\"preserve\">\n    <value>Arrêt des applications dGPU</value>\n  </data>\n  <data name=\"StoppingServices\" xml:space=\"preserve\">\n    <value>Arrêt des services</value>\n  </data>\n  <data name=\"ToggleAura\" xml:space=\"preserve\">\n    <value>Activer Aura</value>\n  </data>\n  <data name=\"ToggleClamshellMode\" xml:space=\"preserve\">\n    <value>Basculer automatiquement en mode Clamshell</value>\n  </data>\n  <data name=\"ToggleFnLock\" xml:space=\"preserve\">\n    <value>Activer/désactiver Fn-Lock</value>\n  </data>\n  <data name=\"ToggleMiniled\" xml:space=\"preserve\">\n    <value>Activer Miniled (si supporté)</value>\n  </data>\n  <data name=\"ToggleScreen\" xml:space=\"preserve\">\n    <value>Allumer l'écran</value>\n  </data>\n  <data name=\"ToggleTouchscreen\" xml:space=\"preserve\">\n    <value>Activer/désactiver l'écran tactile</value>\n  </data>\n  <data name=\"Touchscreen\" xml:space=\"preserve\">\n    <value>Écran tactile</value>\n  </data>\n  <data name=\"Turbo\" xml:space=\"preserve\">\n    <value>Turbo</value>\n  </data>\n  <data name=\"TurnedOff\" xml:space=\"preserve\">\n    <value>Éteint</value>\n  </data>\n  <data name=\"TurnOffOnBattery\" xml:space=\"preserve\">\n    <value>Éteindre sur batterie</value>\n  </data>\n  <data name=\"UltimateGPUTooltip\" xml:space=\"preserve\">\n    <value>Redirige l'écran du portable vers le dGPU, maximisation taux FPS </value>\n  </data>\n  <data name=\"UltimateMode\" xml:space=\"preserve\">\n    <value>Ultime</value>\n  </data>\n  <data name=\"UndervoltingRisky\" xml:space=\"preserve\">\n    <value>L'undervolting est une fonctionnalité expérimentale et risquée. Si les valeurs appliquées sont trop faibles, elles peuvent causer de l'instabilité, éteindre l'ordinateur ou causer une corruption de données. Si vous voulez essayer - commencer avec des petites valeurs, cliquez sur Appliquer et testez ce qui fonctionne pour vous.</value>\n  </data>\n  <data name=\"Unmuted\" xml:space=\"preserve\">\n    <value>Son activé</value>\n  </data>\n  <data name=\"Updates\" xml:space=\"preserve\">\n    <value>Mises à jour</value>\n  </data>\n  <data name=\"VersionLabel\" xml:space=\"preserve\">\n    <value>Version </value>\n  </data>\n  <data name=\"VibrationStrength\" xml:space=\"preserve\">\n    <value>Intensité de la vibration</value>\n  </data>\n  <data name=\"VisualMode\" xml:space=\"preserve\">\n    <value>Mode d'affichage</value>\n  </data>\n  <data name=\"VisualModesHDR\" xml:space=\"preserve\">\n    <value>Les modes visuels ne sont pas disponibles lorsque le HDR est actif</value>\n  </data>\n  <data name=\"VisualModesScreen\" xml:space=\"preserve\">\n    <value>Les modes visuels ne sont pas disponibles lorsque l'écran de l'ordinateur portable est éteint</value>\n  </data>\n  <data name=\"VolumeDown\" xml:space=\"preserve\">\n    <value>Vol-</value>\n  </data>\n  <data name=\"VolumeMute\" xml:space=\"preserve\">\n    <value>Mettre en sourdine</value>\n  </data>\n  <data name=\"VolumeUp\" xml:space=\"preserve\">\n    <value>Vol+</value>\n  </data>\n  <data name=\"WindowTop\" xml:space=\"preserve\">\n    <value>Maintenir la fenêtre au premier plan</value>\n  </data>\n  <data name=\"Zoom\" xml:space=\"preserve\">\n    <value>Zoom</value>\n  </data>\n  <data name=\"Donate\" xml:space=\"preserve\">\n    <value>Faire un don</value>\n  </data>\n  <data name=\"Legend\" xml:space=\"preserve\">\n    <value>Légende</value>\n  </data>\n  <data name=\"LegendGray\" xml:space=\"preserve\">\n    <value>Impossible de vérifier la version actuelle</value>\n    <comment>Can't check local version</comment>\n  </data>\n  <data name=\"LegendRed\" xml:space=\"preserve\">\n    <value>Mise à jour disponible</value>\n    <comment>Update Available</comment>\n  </data>\n  <data name=\"LegendGreen\" xml:space=\"preserve\">\n    <value>Mis à jour</value>\n    <comment>Updated</comment>\n  </data>\n  <data name=\"SlashBounce\" xml:space=\"preserve\">\n    <value>Bounce</value>\n  </data>\n  <data name=\"SlashMode\" xml:space=\"preserve\">\n    <value>Slash</value>\n  </data>\n  <data name=\"SlashLoading\" xml:space=\"preserve\">\n    <value>Сhargement</value>\n  </data>\n  <data name=\"SlashBitStream\" xml:space=\"preserve\">\n    <value>Flux de bits</value>\n  </data>\n  <data name=\"SlashTransmission\" xml:space=\"preserve\">\n    <value>Transmission</value>\n  </data>\n  <data name=\"SlashFlow\" xml:space=\"preserve\">\n    <value>Flow</value>\n  </data>\n  <data name=\"SlashFlux\" xml:space=\"preserve\">\n    <value>Flux</value>\n  </data>\n  <data name=\"SlashPhantom\" xml:space=\"preserve\">\n    <value>Phantom</value>\n  </data>\n  <data name=\"SlashSpectrum\" xml:space=\"preserve\">\n    <value>Spectrum</value>\n  </data>\n  <data name=\"SlashHazard\" xml:space=\"preserve\">\n    <value>Hazard</value>\n  </data>\n  <data name=\"SlashInterfacing\" xml:space=\"preserve\">\n    <value>Interfacing</value>\n  </data>\n  <data name=\"SlashRamp\" xml:space=\"preserve\">\n    <value>Rampe</value>\n  </data>\n  <data name=\"SlashGameOver\" xml:space=\"preserve\">\n    <value>Game Over</value>\n  </data>\n  <data name=\"SlashStart\" xml:space=\"preserve\">\n    <value>Début</value>\n  </data>\n  <data name=\"SlashBuzzer\" xml:space=\"preserve\">\n    <value>Buzzer</value>\n  </data>\n  <data name=\"SlashStatic\" xml:space=\"preserve\">\n    <value>Statique</value>\n  </data>\n  <data name=\"SlashBatteryLevel\" xml:space=\"preserve\">\n    <value>Niveau de la batterie</value>\n  </data>\n  <data name=\"IntervalOff\" xml:space=\"preserve\">\n    <value>Intervalle désactivé</value>\n  </data>\n  <data name=\"IntervalSeconds\" xml:space=\"preserve\">\n    <value>Intervalle {0}s</value>\n  </data>\n  <data name=\"DisableDynamicLighting\" xml:space=\"preserve\">\n    <value>Veuillez désactiver l'Éclairage dynamique Windows &gt;</value>\n  </data>\n  <data name=\"AmbientModeResources\" xml:space=\"preserve\">\n    <value>Le mode Ambiant peut augmenter l'utilisation des ressources</value>\n  </data>\n  <data name=\"MouseMotionSync\" xml:space=\"preserve\">\n    <value>Motion Sync</value>\n  </data>\n  <data name=\"MouseZoneMode\" xml:space=\"preserve\">\n    <value>Zone Mode</value>\n  </data>\n</root>"
  },
  {
    "path": "app/Properties/Strings.hu.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" id=\"root\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\"/>\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"name\" type=\"xsd:string\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\"/>\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Acceleration\" xml:space=\"preserve\">\n    <value>Gyorsítás</value>\n  </data>\n  <data name=\"ACPIError\" xml:space=\"preserve\">\n    <value>Nem sikerült csatlakozni az ASUS ACPI-hez, az alkalmazás nem működik enélkül. Próbáld meg telepíteni az ASUS rendszervezérlő interfész-t</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestart\" xml:space=\"preserve\">\n    <value>Indítsd újra az eszközödet a változtatások érvényesítéséhez</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestartTitle\" xml:space=\"preserve\">\n    <value>Újraindítás most?</value>\n  </data>\n  <data name=\"AlertDGPU\" xml:space=\"preserve\">\n    <value>Úgy tűnik használatban van a GPU. Biztosan letiltod?</value>\n  </data>\n  <data name=\"AlertDGPUTitle\" xml:space=\"preserve\">\n    <value>Eco mód</value>\n  </data>\n  <data name=\"AlertUltimateOff\" xml:space=\"preserve\">\n    <value>Az Ultimate mód kikapcsolása után újraindítás szükséges</value>\n  </data>\n  <data name=\"AlertUltimateOn\" xml:space=\"preserve\">\n    <value>Az Ultimate mód használatához újraindítás szükséges</value>\n  </data>\n  <data name=\"AlertUltimateTitle\" xml:space=\"preserve\">\n    <value>Újraindítja most?</value>\n  </data>\n  <data name=\"AllyController\" xml:space=\"preserve\">\n    <value>Ally vezérlő</value>\n  </data>\n  <data name=\"AnimationSpeed\" xml:space=\"preserve\">\n    <value>Animáció sebessége</value>\n  </data>\n  <data name=\"AnimeMatrix\" xml:space=\"preserve\">\n    <value>Anime Matrix</value>\n  </data>\n  <data name=\"AppAlreadyRunning\" xml:space=\"preserve\">\n    <value>Az alkalmazás már el lett inítva</value>\n  </data>\n  <data name=\"AppAlreadyRunningText\" xml:space=\"preserve\">\n    <value>A G-Helper már fut. A rendszertárcán megtalálod az alkalmazás ikonját.</value>\n  </data>\n  <data name=\"Apply\" xml:space=\"preserve\">\n    <value>Alkalmaz</value>\n  </data>\n  <data name=\"ApplyFanCurve\" xml:space=\"preserve\">\n    <value>Egyedi ventigörbe használata</value>\n  </data>\n  <data name=\"ApplyPowerLimits\" xml:space=\"preserve\">\n    <value>Teljesítménykorlátok alkalmazása</value>\n  </data>\n  <data name=\"ApplyWindowsPowerPlan\" xml:space=\"preserve\">\n    <value>A Windows energiagazdálkodási módok automatikus beállítása</value>\n  </data>\n  <data name=\"APUMemory\" xml:space=\"preserve\">\n    <value>A GPU-nak kiosztott memória</value>\n  </data>\n  <data name=\"AsusServicesRunning\" xml:space=\"preserve\">\n    <value>Asus szolgáltatások futnak</value>\n  </data>\n  <data name=\"AuraBatteryState\" xml:space=\"preserve\">\n    <value>Akkuállapot</value>\n  </data>\n  <data name=\"AuraBreathe\" xml:space=\"preserve\">\n    <value>Lélegző</value>\n  </data>\n  <data name=\"AuraClockwise\" xml:space=\"preserve\">\n    <value>Jobbra forog</value>\n  </data>\n  <data name=\"AuraColorCycle\" xml:space=\"preserve\">\n    <value>Színváltás</value>\n  </data>\n  <data name=\"AuraComet\" xml:space=\"preserve\">\n    <value>Üstökös</value>\n  </data>\n  <data name=\"AuraCounterClockwise\" xml:space=\"preserve\">\n    <value>Balra forog</value>\n  </data>\n  <data name=\"AuraFast\" xml:space=\"preserve\">\n    <value>Gyors</value>\n  </data>\n  <data name=\"AuraLightingMode\" xml:space=\"preserve\">\n    <value>Világítás típusa</value>\n  </data>\n  <data name=\"AuraNormal\" xml:space=\"preserve\">\n    <value>Normál</value>\n  </data>\n  <data name=\"AuraRainbow\" xml:space=\"preserve\">\n    <value>Szivárvány</value>\n  </data>\n  <data name=\"AuraRandomColor\" xml:space=\"preserve\">\n    <value>Véletlen</value>\n  </data>\n  <data name=\"AuraReact\" xml:space=\"preserve\">\n    <value>Reagál</value>\n  </data>\n  <data name=\"AuraSlow\" xml:space=\"preserve\">\n    <value>Lassú</value>\n  </data>\n  <data name=\"AuraStatic\" xml:space=\"preserve\">\n    <value>Állandó</value>\n  </data>\n  <data name=\"AuraStrobe\" xml:space=\"preserve\">\n    <value>Stroboszkóp</value>\n  </data>\n  <data name=\"AuraZoneAll\" xml:space=\"preserve\">\n    <value>Mindegyik</value>\n  </data>\n  <data name=\"AuraZoneDock\" xml:space=\"preserve\">\n    <value>Dokk</value>\n  </data>\n  <data name=\"AuraZoneLogo\" xml:space=\"preserve\">\n    <value>Logó</value>\n  </data>\n  <data name=\"AuraZoneScroll\" xml:space=\"preserve\">\n    <value>Görgetés</value>\n  </data>\n  <data name=\"AuraZoneUnderglow\" xml:space=\"preserve\">\n    <value>Alsó világítás</value>\n  </data>\n  <data name=\"AutoApply\" xml:space=\"preserve\">\n    <value>Automatikus alkalmazás</value>\n  </data>\n  <data name=\"AutoMode\" xml:space=\"preserve\">\n    <value>Automata</value>\n  </data>\n  <data name=\"AutoRefreshTooltip\" xml:space=\"preserve\">\n    <value>Átállítja 60Hz-re, hogy spóroljon az akku-val, majd töltőn vissza</value>\n  </data>\n  <data name=\"Awake\" xml:space=\"preserve\">\n    <value>Ébren</value>\n  </data>\n  <data name=\"BacklightLow\" xml:space=\"preserve\">\n    <value>Alacsony</value>\n  </data>\n  <data name=\"BacklightMax\" xml:space=\"preserve\">\n    <value>Maximum</value>\n  </data>\n  <data name=\"BacklightMid\" xml:space=\"preserve\">\n    <value>Közepes</value>\n  </data>\n  <data name=\"BacklightOff\" xml:space=\"preserve\">\n    <value>Ki</value>\n  </data>\n  <data name=\"BacklightTimeout\" xml:space=\"preserve\">\n    <value>Késleltetés töltés / akku módban (0 - BE)</value>\n  </data>\n  <data name=\"BacklightTimeoutBattery\" xml:space=\"preserve\">\n    <value>Háttérvilágítás időkorlátja akkumulátoros üzemmódban</value>\n  </data>\n  <data name=\"BacklightTimeoutPlugged\" xml:space=\"preserve\">\n    <value>Háttérvilágítás időkorlátja hálózati áramról való üzemeléskor</value>\n  </data>\n  <data name=\"Balanced\" xml:space=\"preserve\">\n    <value>Teljesítmény</value>\n  </data>\n  <data name=\"BatteryCharge\" xml:space=\"preserve\">\n    <value>Töltés</value>\n  </data>\n  <data name=\"BatteryChargeLimit\" xml:space=\"preserve\">\n    <value>Töltési korlát</value>\n  </data>\n  <data name=\"BatteryHealth\" xml:space=\"preserve\">\n    <value>Akku állapot</value>\n  </data>\n  <data name=\"BatteryLimitFull\" xml:space=\"preserve\">\n    <value>Egyszeri 100%-os feltöltés</value>\n  </data>\n  <data name=\"Binding\" xml:space=\"preserve\">\n    <value>Hozzárendelés</value>\n  </data>\n  <data name=\"BindingPrimary\" xml:space=\"preserve\">\n    <value>Elsődleges</value>\n  </data>\n  <data name=\"BindingSecondary\" xml:space=\"preserve\">\n    <value>Másodlagos</value>\n  </data>\n  <data name=\"BiosAndDriverUpdates\" xml:space=\"preserve\">\n    <value>BIOS és illesztőprogram frissítések</value>\n  </data>\n  <data name=\"Boot\" xml:space=\"preserve\">\n    <value>Rendszerbetöltés</value>\n  </data>\n  <data name=\"BootSound\" xml:space=\"preserve\">\n    <value>Rendszerindítási hang</value>\n  </data>\n  <data name=\"Brightness\" xml:space=\"preserve\">\n    <value>Fényerő</value>\n  </data>\n  <data name=\"BrightnessDown\" xml:space=\"preserve\">\n    <value>Fényerő csökkentése</value>\n  </data>\n  <data name=\"BrightnessUp\" xml:space=\"preserve\">\n    <value>Fényerő növelése</value>\n  </data>\n  <data name=\"BWTrayIcon\" xml:space=\"preserve\">\n    <value>Fekete-fehér tálca ikon</value>\n  </data>\n  <data name=\"Calibrate\" xml:space=\"preserve\">\n    <value>Kalibrálás</value>\n  </data>\n  <data name=\"Charging\" xml:space=\"preserve\">\n    <value>Töltés</value>\n  </data>\n  <data name=\"Color\" xml:space=\"preserve\">\n    <value>Szín</value>\n  </data>\n  <data name=\"Contrast\" xml:space=\"preserve\">\n    <value>Kontraszt</value>\n  </data>\n  <data name=\"Controller\" xml:space=\"preserve\">\n    <value>Kontroller</value>\n  </data>\n  <data name=\"CPUBoost\" xml:space=\"preserve\">\n    <value>CPU gyorsítás</value>\n  </data>\n  <data name=\"Custom\" xml:space=\"preserve\">\n    <value>Egyéni</value>\n  </data>\n  <data name=\"Deceleration\" xml:space=\"preserve\">\n    <value>Lassítás</value>\n  </data>\n  <data name=\"Default\" xml:space=\"preserve\">\n    <value>Alapért.</value>\n  </data>\n  <data name=\"DisableController\" xml:space=\"preserve\">\n    <value>Kontoller letiltása</value>\n  </data>\n  <data name=\"DisableOnLidClose\" xml:space=\"preserve\">\n    <value>Letiltása képernyő lehajtásakor</value>\n  </data>\n  <data name=\"DisableOverdrive\" xml:space=\"preserve\">\n    <value>Képernyőtúlhajtás letiltása</value>\n  </data>\n  <data name=\"Discharging\" xml:space=\"preserve\">\n    <value>Merülés</value>\n  </data>\n  <data name=\"DownloadColorProfiles\" xml:space=\"preserve\">\n    <value>Színprofilok letöltése</value>\n  </data>\n  <data name=\"DownloadUpdate\" xml:space=\"preserve\">\n    <value>Letöltés</value>\n  </data>\n  <data name=\"DriverAndSoftware\" xml:space=\"preserve\">\n    <value>Illesztőprogramok és alkalmazások</value>\n  </data>\n  <data name=\"EcoGPUTooltip\" xml:space=\"preserve\">\n    <value>Letiltja a dGPU-t, hogy spóroljon az akkuval</value>\n  </data>\n  <data name=\"EcoMode\" xml:space=\"preserve\">\n    <value>Eco</value>\n  </data>\n  <data name=\"EnableGPUOnShutdown\" xml:space=\"preserve\">\n    <value>GPU engedélyezése kikapcsoláskor (megakadályozza az Eco mód problémát)</value>\n  </data>\n  <data name=\"EnableOptimusText\" xml:space=\"preserve\">\n    <value>A dGPU letiltása Eco módba kapcsolással, miközben az NVIDIA Vezérlőpultban a Kijelző mód nincs Optimus-ra állítva, problémákat okozhat a fényerővezérlésben, amíg a következő újraindítás meg nem történik.\n\nFolytatni szeretnéd?</value>\n  </data>\n  <data name=\"EnableOptimusTitle\" xml:space=\"preserve\">\n    <value>NVIDIA kijelzőmód nincs Optimus-ra állítva</value>\n  </data>\n  <data name=\"EnergySettings\" xml:space=\"preserve\">\n    <value>Energia beállítások</value>\n  </data>\n  <data name=\"Export\" xml:space=\"preserve\">\n    <value>Profil exportálása</value>\n  </data>\n  <data name=\"Extra\" xml:space=\"preserve\">\n    <value>Extra</value>\n  </data>\n  <data name=\"ExtraSettings\" xml:space=\"preserve\">\n    <value>Extra beállítások</value>\n  </data>\n  <data name=\"FactoryDefaults\" xml:space=\"preserve\">\n    <value>Gyári alapértékek</value>\n  </data>\n  <data name=\"FanCurves\" xml:space=\"preserve\">\n    <value>Ventilátorgörbe</value>\n  </data>\n  <data name=\"FanProfileCPU\" xml:space=\"preserve\">\n    <value>CPU ventilátor profil</value>\n  </data>\n  <data name=\"FanProfileGPU\" xml:space=\"preserve\">\n    <value>GPU ventilátor profil</value>\n  </data>\n  <data name=\"FanProfileMid\" xml:space=\"preserve\">\n    <value>Középső ventilátor profil</value>\n  </data>\n  <data name=\"FanProfiles\" xml:space=\"preserve\">\n    <value>Ventilátor profilok</value>\n  </data>\n  <data name=\"FansAndPower\" xml:space=\"preserve\">\n    <value>Ventilátor és energia</value>\n  </data>\n  <data name=\"FanSpeed\" xml:space=\"preserve\">\n    <value>Ventilátor</value>\n  </data>\n  <data name=\"FansPower\" xml:space=\"preserve\">\n    <value>Venti + energia</value>\n  </data>\n  <data name=\"FlickerFreeDimming\" xml:space=\"preserve\">\n    <value>Villogásmentes halványítás</value>\n  </data>\n  <data name=\"FnLock\" xml:space=\"preserve\">\n    <value>Fn + F gyorsgombok feldolgozása Fn nélkül</value>\n  </data>\n  <data name=\"FnLockOff\" xml:space=\"preserve\">\n    <value>Fn-Lock Ki</value>\n  </data>\n  <data name=\"FnLockOn\" xml:space=\"preserve\">\n    <value>Fn-Lock Be</value>\n  </data>\n  <data name=\"GPUBoost\" xml:space=\"preserve\">\n    <value>Dinamikus gyorsítás</value>\n  </data>\n  <data name=\"GPUChanging\" xml:space=\"preserve\">\n    <value>Váltás...</value>\n  </data>\n  <data name=\"GPUCoreClockOffset\" xml:space=\"preserve\">\n    <value>Magórajel eltolás</value>\n  </data>\n  <data name=\"GPUMemoryClockOffset\" xml:space=\"preserve\">\n    <value>Memória órajel eltolás</value>\n  </data>\n  <data name=\"GPUMode\" xml:space=\"preserve\">\n    <value>GPU mód</value>\n  </data>\n  <data name=\"GPUModeEco\" xml:space=\"preserve\">\n    <value>Csak iGPU</value>\n  </data>\n  <data name=\"GPUModeStandard\" xml:space=\"preserve\">\n    <value>iGPU + dGPU</value>\n  </data>\n  <data name=\"GPUModeUltimate\" xml:space=\"preserve\">\n    <value>kizárólag dGPU</value>\n  </data>\n  <data name=\"GPUPower\" xml:space=\"preserve\">\n    <value>GPU erő</value>\n  </data>\n  <data name=\"GPUSettings\" xml:space=\"preserve\">\n    <value>GPU beállítások</value>\n  </data>\n  <data name=\"GPUTempTarget\" xml:space=\"preserve\">\n    <value>Célhőmérséklet</value>\n  </data>\n  <data name=\"HibernateAfter\" xml:space=\"preserve\">\n    <value>Akku módban az alvó módból Hibernálásig eltelt idő (0 - KI)</value>\n  </data>\n  <data name=\"High\" xml:space=\"preserve\">\n    <value>Magas</value>\n  </data>\n  <data name=\"ImageRotation\" xml:space=\"preserve\">\n    <value>Kép elforgatás</value>\n  </data>\n  <data name=\"Import\" xml:space=\"preserve\">\n    <value>Profil importálása</value>\n  </data>\n  <data name=\"KeyBindings\" xml:space=\"preserve\">\n    <value>Gyorsbillentyűk</value>\n  </data>\n  <data name=\"Keyboard\" xml:space=\"preserve\">\n    <value>Billentyűzet</value>\n  </data>\n  <data name=\"KillGpuApps\" xml:space=\"preserve\">\n    <value>Eco módba lépéskor minden alkalmazást leállít, ami a GPU-t használja</value>\n  </data>\n  <data name=\"LaptopBacklight\" xml:space=\"preserve\">\n    <value>Laptop háttérvilágítás</value>\n  </data>\n  <data name=\"LaptopKeyboard\" xml:space=\"preserve\">\n    <value>Laptop billentyűzet</value>\n  </data>\n  <data name=\"LaptopScreen\" xml:space=\"preserve\">\n    <value>Laptop kijelző</value>\n  </data>\n  <data name=\"LEDStatusIndicators\" xml:space=\"preserve\">\n    <value>LED Állapotjelzők</value>\n  </data>\n  <data name=\"Lid\" xml:space=\"preserve\">\n    <value>Fedél</value>\n  </data>\n  <data name=\"Lightbar\" xml:space=\"preserve\">\n    <value>Fénysáv</value>\n  </data>\n  <data name=\"Lighting\" xml:space=\"preserve\">\n    <value>Világítás</value>\n  </data>\n  <data name=\"LockScreen\" xml:space=\"preserve\">\n    <value>Képernyő zarolása</value>\n  </data>\n  <data name=\"Logo\" xml:space=\"preserve\">\n    <value>Logó</value>\n  </data>\n  <data name=\"Low\" xml:space=\"preserve\">\n    <value>Alacsony</value>\n  </data>\n  <data name=\"LSDeadzones\" xml:space=\"preserve\">\n    <value>Bal kar irányító holtjátékai</value>\n  </data>\n  <data name=\"LTDeadzones\" xml:space=\"preserve\">\n    <value>Bal ravasz holtjátékai</value>\n  </data>\n  <data name=\"MatrixAudio\" xml:space=\"preserve\">\n    <value>Hang vizualizáció</value>\n  </data>\n  <data name=\"MatrixBanner\" xml:space=\"preserve\">\n    <value>Bináris logó</value>\n  </data>\n  <data name=\"MatrixBright\" xml:space=\"preserve\">\n    <value>Fényes</value>\n  </data>\n  <data name=\"MatrixClock\" xml:space=\"preserve\">\n    <value>Óra</value>\n  </data>\n  <data name=\"MatrixDim\" xml:space=\"preserve\">\n    <value>Halvány</value>\n  </data>\n  <data name=\"MatrixLogo\" xml:space=\"preserve\">\n    <value>Rog logó</value>\n  </data>\n  <data name=\"MatrixMedium\" xml:space=\"preserve\">\n    <value>Közepes</value>\n  </data>\n  <data name=\"MatrixOff\" xml:space=\"preserve\">\n    <value>Ki</value>\n  </data>\n  <data name=\"MatrixPicture\" xml:space=\"preserve\">\n    <value>Kép</value>\n  </data>\n  <data name=\"MaxRefreshTooltip\" xml:space=\"preserve\">\n    <value>Max frissítési gyakoriság kevés késleltetéshez</value>\n  </data>\n  <data name=\"MinRefreshTooltip\" xml:space=\"preserve\">\n    <value>60Hz-s frissítési gyakoriság, hogy spóroljon az akkuval</value>\n  </data>\n  <data name=\"Minute\" xml:space=\"preserve\">\n    <value>perc</value>\n  </data>\n  <data name=\"Minutes\" xml:space=\"preserve\">\n    <value>perc</value>\n  </data>\n  <data name=\"MouseAngleSnapping\" xml:space=\"preserve\">\n    <value>Angle Snapping / Tuning</value>\n  </data>\n  <data name=\"MouseAutoPowerOff\" xml:space=\"preserve\">\n    <value>Automatikus kikapcsolás idő múlva</value>\n  </data>\n  <data name=\"MouseButtonResponse\" xml:space=\"preserve\">\n    <value>Gomb funkciója</value>\n  </data>\n  <data name=\"MouseImportFailed\" xml:space=\"preserve\">\n    <value>Importálás nem sikerült. A kiválasztott fájl nem érvényes egérprofil, vagy sérült.</value>\n  </data>\n  <data name=\"MouseLiftOffDistance\" xml:space=\"preserve\">\n    <value>Emelési távolság</value>\n  </data>\n  <data name=\"MouseLowBatteryWarning\" xml:space=\"preserve\">\n    <value>Alacsony akkumulátor figyelmeztetés ekkor</value>\n  </data>\n  <data name=\"MousePerformance\" xml:space=\"preserve\">\n    <value>Teljesítmény</value>\n  </data>\n  <data name=\"MouseSynchronize\" xml:space=\"preserve\">\n    <value>Szinkronizálás egérrel</value>\n  </data>\n  <data name=\"Multizone\" xml:space=\"preserve\">\n    <value>Multi Zóna</value>\n  </data>\n  <data name=\"MultizoneStrong\" xml:space=\"preserve\">\n    <value>Erős Multi Zóna</value>\n  </data>\n  <data name=\"Muted\" xml:space=\"preserve\">\n    <value>Mikrofon Ki</value>\n  </data>\n  <data name=\"MuteMic\" xml:space=\"preserve\">\n    <value>Mikrofon némítása</value>\n  </data>\n  <data name=\"Never\" xml:space=\"preserve\">\n    <value>Soha</value>\n  </data>\n  <data name=\"NewUpdates\" xml:space=\"preserve\">\n    <value>Új frissítés</value>\n  </data>\n  <data name=\"NoNewUpdates\" xml:space=\"preserve\">\n    <value>Nincs új frissítés</value>\n  </data>\n  <data name=\"NotConnected\" xml:space=\"preserve\">\n    <value>Nincs csatlakoztatva</value>\n  </data>\n  <data name=\"Off\" xml:space=\"preserve\">\n    <value>Ki</value>\n  </data>\n  <data name=\"On\" xml:space=\"preserve\">\n    <value>Be</value>\n  </data>\n  <data name=\"OneZone\" xml:space=\"preserve\">\n    <value>Egy Zóna</value>\n  </data>\n  <data name=\"OpenGHelper\" xml:space=\"preserve\">\n    <value>G-Helper ablak megnyitása</value>\n  </data>\n  <data name=\"Optimized\" xml:space=\"preserve\">\n    <value>Optimalizált</value>\n  </data>\n  <data name=\"OptimizedGPUTooltip\" xml:space=\"preserve\">\n    <value>Akkus módban váltson Eco módra, töltéskor pedig Standard-ra</value>\n  </data>\n  <data name=\"OptimizedUSBC\" xml:space=\"preserve\">\n    <value>Optimalizált módban USB-C-s töltés közben tartsa letiltva a GPU-t</value>\n  </data>\n  <data name=\"Other\" xml:space=\"preserve\">\n    <value>Egyéb</value>\n  </data>\n  <data name=\"Overdrive\" xml:space=\"preserve\">\n    <value>Túlhajtás</value>\n  </data>\n  <data name=\"PerformanceMode\" xml:space=\"preserve\">\n    <value>Üzemmód</value>\n  </data>\n  <data name=\"Peripherals\" xml:space=\"preserve\">\n    <value>Perifériák</value>\n  </data>\n  <data name=\"PictureGif\" xml:space=\"preserve\">\n    <value>Kép / Gif</value>\n  </data>\n  <data name=\"PlayPause\" xml:space=\"preserve\">\n    <value>Indít / Megállít</value>\n  </data>\n  <data name=\"PollingRate\" xml:space=\"preserve\">\n    <value>Polling Rate</value>\n  </data>\n  <data name=\"PowerLimits\" xml:space=\"preserve\">\n    <value>Teljesítménykorlátok</value>\n  </data>\n  <data name=\"PPTExperimental\" xml:space=\"preserve\">\n    <value>A Teljesítménykorlát egy kísérleti funkció. Használja körültekintően és saját felelősségére!</value>\n  </data>\n  <data name=\"PrintScreen\" xml:space=\"preserve\">\n    <value>PrintScreen</value>\n  </data>\n  <data name=\"Profile\" xml:space=\"preserve\">\n    <value>Profil</value>\n  </data>\n  <data name=\"Quit\" xml:space=\"preserve\">\n    <value>Bezárás</value>\n  </data>\n  <data name=\"Reset\" xml:space=\"preserve\">\n    <value>Visszaállítás</value>\n  </data>\n  <data name=\"RestartGPU\" xml:space=\"preserve\">\n    <value>Valami használja még a dGPU-t, ezzel megakadályozva az Eco móda lépést. Próbálja meg a G-Helper újraindítani a dGPU-t az eszközkezelőben? (Kérjük, saját felelősségére folytassa)</value>\n  </data>\n  <data name=\"RPM\" xml:space=\"preserve\">\n    <value>Fordulatszám</value>\n  </data>\n  <data name=\"RSDeadzones\" xml:space=\"preserve\">\n    <value>Jobb kar irányító holtjátékai</value>\n  </data>\n  <data name=\"RTDeadzones\" xml:space=\"preserve\">\n    <value>Right Trigger Deadzones</value>\n  </data>\n  <data name=\"RunOnStartup\" xml:space=\"preserve\">\n    <value>Indítás a rendszerrel</value>\n  </data>\n  <data name=\"ScalingQuality\" xml:space=\"preserve\">\n    <value>Scaling Quality</value>\n  </data>\n  <data name=\"ScreenPadDown\" xml:space=\"preserve\">\n    <value>Screenpad fényerő csökkentése</value>\n  </data>\n  <data name=\"ScreenPadUp\" xml:space=\"preserve\">\n    <value>Screenpad fényerő növelése</value>\n  </data>\n  <data name=\"Shutdown\" xml:space=\"preserve\">\n    <value>Leállítás</value>\n  </data>\n  <data name=\"Silent\" xml:space=\"preserve\">\n    <value>Csendes</value>\n  </data>\n  <data name=\"Sleep\" xml:space=\"preserve\">\n    <value>Alvás</value>\n  </data>\n  <data name=\"StandardGPUTooltip\" xml:space=\"preserve\">\n    <value>Általános használathoz engedélyezi a dGPU-t</value>\n  </data>\n  <data name=\"StandardMode\" xml:space=\"preserve\">\n    <value>Standard</value>\n  </data>\n  <data name=\"Start\" xml:space=\"preserve\">\n    <value>Indítás</value>\n  </data>\n  <data name=\"StartingServices\" xml:space=\"preserve\">\n    <value>Szolgáltatások elindítása</value>\n  </data>\n  <data name=\"StartupError\" xml:space=\"preserve\">\n    <value>Indítási hiba</value>\n  </data>\n  <data name=\"Stop\" xml:space=\"preserve\">\n    <value>Leállít</value>\n  </data>\n  <data name=\"StopGPUApps\" xml:space=\"preserve\">\n    <value>GPU alkalmazások leállítása</value>\n  </data>\n  <data name=\"StoppingServices\" xml:space=\"preserve\">\n    <value>Szolgáltatások leállítása</value>\n  </data>\n  <data name=\"ToggleAura\" xml:space=\"preserve\">\n    <value>AURA ki-/bekapcsolása</value>\n  </data>\n  <data name=\"ToggleClamshellMode\" xml:space=\"preserve\">\n    <value>Auto Toggle Clamshell Mode</value>\n  </data>\n  <data name=\"ToggleFnLock\" xml:space=\"preserve\">\n    <value>Fn-Lock ki-/bekapcsolása</value>\n  </data>\n  <data name=\"ToggleMiniled\" xml:space=\"preserve\">\n    <value>MiniLED ki-/bekapcsolása (ha támogatott)</value>\n  </data>\n  <data name=\"ToggleScreen\" xml:space=\"preserve\">\n    <value>Képernyő ki-/bekapcsolása</value>\n  </data>\n  <data name=\"ToggleTouchscreen\" xml:space=\"preserve\">\n    <value>Érintőképernyő ki-/bekapcsolása</value>\n  </data>\n  <data name=\"Touchscreen\" xml:space=\"preserve\">\n    <value>Touchscreen</value>\n  </data>\n  <data name=\"Turbo\" xml:space=\"preserve\">\n    <value>Turbó</value>\n  </data>\n  <data name=\"TurnedOff\" xml:space=\"preserve\">\n    <value>Kikapcsolva</value>\n  </data>\n  <data name=\"TurnOffOnBattery\" xml:space=\"preserve\">\n    <value>Akkus üzemmódban kikapcsol</value>\n  </data>\n  <data name=\"UltimateGPUTooltip\" xml:space=\"preserve\">\n    <value>A jobb FPS érdekében a laptop kijelzőt közvetlenül a GPU-n keresztül működteti</value>\n  </data>\n  <data name=\"UltimateMode\" xml:space=\"preserve\">\n    <value>Ultimate</value>\n  </data>\n  <data name=\"UndervoltingRisky\" xml:space=\"preserve\">\n    <value>Undervolting is an experimental and risky feature. If applied values are too low for your hardware, it can become unstable, shut down or cause data corruption. If you want to try - start from small values first, click Apply and test what works for you.</value>\n  </data>\n  <data name=\"Unmuted\" xml:space=\"preserve\">\n    <value>Mikrofon Be</value>\n  </data>\n  <data name=\"Updates\" xml:space=\"preserve\">\n    <value>Frissítések</value>\n  </data>\n  <data name=\"VersionLabel\" xml:space=\"preserve\">\n    <value>Verzió</value>\n  </data>\n  <data name=\"VibrationStrength\" xml:space=\"preserve\">\n    <value>Vibration Strength</value>\n  </data>\n  <data name=\"VisualMode\" xml:space=\"preserve\">\n    <value>Képernyőszín Mód</value>\n  </data>\n  <data name=\"VisualModesHDR\" xml:space=\"preserve\">\n    <value>Visual Modes are not available when HDR is active</value>\n  </data>\n  <data name=\"VisualModesScreen\" xml:space=\"preserve\">\n    <value>Visual Modes are not available when laptop screen is off</value>\n  </data>\n  <data name=\"VolumeDown\" xml:space=\"preserve\">\n    <value>Lehalkítás</value>\n  </data>\n  <data name=\"VolumeMute\" xml:space=\"preserve\">\n    <value>Némítás</value>\n  </data>\n  <data name=\"VolumeUp\" xml:space=\"preserve\">\n    <value>Hangosítás</value>\n  </data>\n  <data name=\"WindowTop\" xml:space=\"preserve\">\n    <value>Alkalmazás maradjon mindig felül</value>\n  </data>\n  <data name=\"Zoom\" xml:space=\"preserve\">\n    <value>Zoom</value>\n  </data>\n  <data name=\"Donate\" xml:space=\"preserve\">\n    <value>Donate</value>\n  </data>\n  <data name=\"Legend\" xml:space=\"preserve\">\n    <value>Legend</value>\n  </data>\n  <data name=\"LegendGray\" xml:space=\"preserve\">\n    <value>Can't check local version</value>\n    <comment>Can't check local version</comment>\n  </data>\n  <data name=\"LegendRed\" xml:space=\"preserve\">\n    <value>Update Available</value>\n    <comment>Update Available</comment>\n  </data>\n  <data name=\"LegendGreen\" xml:space=\"preserve\">\n    <value>Updated</value>\n    <comment>Updated</comment>\n  </data>\n  <data name=\"SlashBounce\" xml:space=\"preserve\">\n    <value>Bounce</value>\n  </data>\n  <data name=\"SlashMode\" xml:space=\"preserve\">\n    <value>Slash</value>\n  </data>\n  <data name=\"SlashLoading\" xml:space=\"preserve\">\n    <value>Loading</value>\n  </data>\n  <data name=\"SlashBitStream\" xml:space=\"preserve\">\n    <value>Bit Stream</value>\n  </data>\n  <data name=\"SlashTransmission\" xml:space=\"preserve\">\n    <value>Transmission</value>\n  </data>\n  <data name=\"SlashFlow\" xml:space=\"preserve\">\n    <value>Flow</value>\n  </data>\n  <data name=\"SlashFlux\" xml:space=\"preserve\">\n    <value>Flux</value>\n  </data>\n  <data name=\"SlashPhantom\" xml:space=\"preserve\">\n    <value>Phantom</value>\n  </data>\n  <data name=\"SlashSpectrum\" xml:space=\"preserve\">\n    <value>Spectrum</value>\n  </data>\n  <data name=\"SlashHazard\" xml:space=\"preserve\">\n    <value>Hazard</value>\n  </data>\n  <data name=\"SlashInterfacing\" xml:space=\"preserve\">\n    <value>Interfacing</value>\n  </data>\n  <data name=\"SlashRamp\" xml:space=\"preserve\">\n    <value>Ramp</value>\n  </data>\n  <data name=\"SlashGameOver\" xml:space=\"preserve\">\n    <value>Game Over</value>\n  </data>\n  <data name=\"SlashStart\" xml:space=\"preserve\">\n    <value>Start</value>\n  </data>\n  <data name=\"SlashBuzzer\" xml:space=\"preserve\">\n    <value>Buzzer</value>\n  </data>\n  <data name=\"SlashStatic\" xml:space=\"preserve\">\n    <value>Static</value>\n  </data>\n  <data name=\"SlashBatteryLevel\" xml:space=\"preserve\">\n    <value>Battery Level</value>\n  </data>\n  <data name=\"IntervalOff\" xml:space=\"preserve\">\n    <value>Interval Off</value>\n  </data>\n  <data name=\"IntervalSeconds\" xml:space=\"preserve\">\n    <value>Interval {0}s</value>\n  </data>\n  <data name=\"DisableDynamicLighting\" xml:space=\"preserve\">\n    <value>Please disable Windows &gt; Dynamic Lighting</value>\n  </data>\n  <data name=\"AmbientModeResources\" xml:space=\"preserve\">\n    <value>Ambient mode may increase resource usage</value>\n  </data>\n  <data name=\"MouseMotionSync\" xml:space=\"preserve\">\n    <value>Motion Sync</value>\n  </data>\n  <data name=\"MouseZoneMode\" xml:space=\"preserve\">\n    <value>Zone Mode</value>\n  </data>\n</root>"
  },
  {
    "path": "app/Properties/Strings.id.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" id=\"root\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\"/>\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"name\" type=\"xsd:string\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\"/>\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Acceleration\" xml:space=\"preserve\">\n    <value>Akselerasi</value>\n  </data>\n  <data name=\"ACPIError\" xml:space=\"preserve\">\n    <value>Tidak dapat terhubung ke ASUS ACPI. tanpanya aplikasi tidak dapat berfungsi. Cobalah untuk menginstal Asus System Control Interface</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestart\" xml:space=\"preserve\">\n    <value>Muat ulang perangkat anda untuk menerapkan perubahan</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestartTitle\" xml:space=\"preserve\">\n    <value>Mulai ulang sekarang?</value>\n  </data>\n  <data name=\"AlertDGPU\" xml:space=\"preserve\">\n    <value>Tampaknya GPU sedang digunakan intensif, nonaktifkan?</value>\n  </data>\n  <data name=\"AlertDGPUTitle\" xml:space=\"preserve\">\n    <value>Mode Eco</value>\n  </data>\n  <data name=\"AlertUltimateOff\" xml:space=\"preserve\">\n    <value>Mematikan Mode Ultimate memerlukan restart.</value>\n  </data>\n  <data name=\"AlertUltimateOn\" xml:space=\"preserve\">\n    <value>Mode Ultimate memerlukan restart</value>\n  </data>\n  <data name=\"AlertUltimateTitle\" xml:space=\"preserve\">\n    <value>Mulai ulang sekarang?</value>\n  </data>\n  <data name=\"AllyController\" xml:space=\"preserve\">\n    <value>Ally Controller</value>\n  </data>\n  <data name=\"AnimationSpeed\" xml:space=\"preserve\">\n    <value>Kecepatan Animasi</value>\n  </data>\n  <data name=\"AnimeMatrix\" xml:space=\"preserve\">\n    <value>Anime Matrix</value>\n  </data>\n  <data name=\"AppAlreadyRunning\" xml:space=\"preserve\">\n    <value>Aplikasi sudah berjalan</value>\n  </data>\n  <data name=\"AppAlreadyRunningText\" xml:space=\"preserve\">\n    <value>G-Helper sudah berjalan. Periksa system tray untuk menemukan ikonnya.</value>\n  </data>\n  <data name=\"Apply\" xml:space=\"preserve\">\n    <value>Terapkan</value>\n  </data>\n  <data name=\"ApplyFanCurve\" xml:space=\"preserve\">\n    <value>Terapkan Custom Fan Curve</value>\n  </data>\n  <data name=\"ApplyPowerLimits\" xml:space=\"preserve\">\n    <value>Terapkan Batas Daya</value>\n  </data>\n  <data name=\"ApplyWindowsPowerPlan\" xml:space=\"preserve\">\n    <value>Otomatis sesuaikan Mode Daya Windows</value>\n  </data>\n  <data name=\"APUMemory\" xml:space=\"preserve\">\n    <value>Memory Assigned to GPU</value>\n  </data>\n  <data name=\"AsusServicesRunning\" xml:space=\"preserve\">\n    <value>Layanan Asus Berjalan</value>\n  </data>\n  <data name=\"AuraBatteryState\" xml:space=\"preserve\">\n    <value>Status Baterai</value>\n  </data>\n  <data name=\"AuraBreathe\" xml:space=\"preserve\">\n    <value>Bernapas</value>\n  </data>\n  <data name=\"AuraClockwise\" xml:space=\"preserve\">\n    <value>Searah Jarum Jam</value>\n  </data>\n  <data name=\"AuraColorCycle\" xml:space=\"preserve\">\n    <value>Siklus Warna</value>\n  </data>\n  <data name=\"AuraComet\" xml:space=\"preserve\">\n    <value>Komet</value>\n  </data>\n  <data name=\"AuraCounterClockwise\" xml:space=\"preserve\">\n    <value>Berlawanan Jarum Jam</value>\n  </data>\n  <data name=\"AuraFast\" xml:space=\"preserve\">\n    <value>Cepat</value>\n  </data>\n  <data name=\"AuraLightingMode\" xml:space=\"preserve\">\n    <value>Mode Pencahayaan</value>\n  </data>\n  <data name=\"AuraNormal\" xml:space=\"preserve\">\n    <value>Normal</value>\n  </data>\n  <data name=\"AuraRainbow\" xml:space=\"preserve\">\n    <value>Pelangi</value>\n  </data>\n  <data name=\"AuraRandomColor\" xml:space=\"preserve\">\n    <value>Acak</value>\n  </data>\n  <data name=\"AuraReact\" xml:space=\"preserve\">\n    <value>Reaksi</value>\n  </data>\n  <data name=\"AuraSlow\" xml:space=\"preserve\">\n    <value>Pelan</value>\n  </data>\n  <data name=\"AuraStatic\" xml:space=\"preserve\">\n    <value>Statis</value>\n  </data>\n  <data name=\"AuraStrobe\" xml:space=\"preserve\">\n    <value>Berkedip</value>\n  </data>\n  <data name=\"AuraZoneAll\" xml:space=\"preserve\">\n    <value>Semua</value>\n  </data>\n  <data name=\"AuraZoneDock\" xml:space=\"preserve\">\n    <value>Dok</value>\n  </data>\n  <data name=\"AuraZoneLogo\" xml:space=\"preserve\">\n    <value>Logo</value>\n  </data>\n  <data name=\"AuraZoneScroll\" xml:space=\"preserve\">\n    <value>Roda Gulir</value>\n  </data>\n  <data name=\"AuraZoneUnderglow\" xml:space=\"preserve\">\n    <value>Cahaya Bawah</value>\n  </data>\n  <data name=\"AutoApply\" xml:space=\"preserve\">\n    <value>Terapkan Secara Otomatis</value>\n  </data>\n  <data name=\"AutoMode\" xml:space=\"preserve\">\n    <value>Otomatis</value>\n  </data>\n  <data name=\"AutoRefreshTooltip\" xml:space=\"preserve\">\n    <value>Atur ke 60Hz untuk menghemat baterai, dan kembalikan saat mengisi daya</value>\n  </data>\n  <data name=\"Awake\" xml:space=\"preserve\">\n    <value>Bangun</value>\n  </data>\n  <data name=\"BacklightLow\" xml:space=\"preserve\">\n    <value>Lemah</value>\n  </data>\n  <data name=\"BacklightMax\" xml:space=\"preserve\">\n    <value>Kuat</value>\n  </data>\n  <data name=\"BacklightMid\" xml:space=\"preserve\">\n    <value>Sedang</value>\n  </data>\n  <data name=\"BacklightOff\" xml:space=\"preserve\">\n    <value>Mati</value>\n  </data>\n  <data name=\"BacklightTimeout\" xml:space=\"preserve\">\n    <value>Waktu tunggu dicolokan / menggunakan baterai (0 - Hidup)</value>\n  </data>\n  <data name=\"BacklightTimeoutBattery\" xml:space=\"preserve\">\n    <value>Backlight Timeout when on battery</value>\n  </data>\n  <data name=\"BacklightTimeoutPlugged\" xml:space=\"preserve\">\n    <value>Backlight Timeout when plugged</value>\n  </data>\n  <data name=\"Balanced\" xml:space=\"preserve\">\n    <value>Seimbang</value>\n  </data>\n  <data name=\"BatteryCharge\" xml:space=\"preserve\">\n    <value>Baterai</value>\n  </data>\n  <data name=\"BatteryChargeLimit\" xml:space=\"preserve\">\n    <value>Batas Pengisian Baterai</value>\n  </data>\n  <data name=\"BatteryHealth\" xml:space=\"preserve\">\n    <value>Kesehatan Baterai</value>\n  </data>\n  <data name=\"BatteryLimitFull\" xml:space=\"preserve\">\n    <value>Isi daya sekali hingga mencapai 100%</value>\n  </data>\n  <data name=\"Binding\" xml:space=\"preserve\">\n    <value>Binding</value>\n  </data>\n  <data name=\"BindingPrimary\" xml:space=\"preserve\">\n    <value>Utama</value>\n  </data>\n  <data name=\"BindingSecondary\" xml:space=\"preserve\">\n    <value>Sekunder</value>\n  </data>\n  <data name=\"BiosAndDriverUpdates\" xml:space=\"preserve\">\n    <value>Pembaruan BIOS dan Driver</value>\n  </data>\n  <data name=\"Boot\" xml:space=\"preserve\">\n    <value>Boot</value>\n  </data>\n  <data name=\"BootSound\" xml:space=\"preserve\">\n    <value>Suara Boot</value>\n  </data>\n  <data name=\"Brightness\" xml:space=\"preserve\">\n    <value>Kecerahan</value>\n  </data>\n  <data name=\"BrightnessDown\" xml:space=\"preserve\">\n    <value>Kurangi Kecerahan</value>\n  </data>\n  <data name=\"BrightnessUp\" xml:space=\"preserve\">\n    <value>Tingkatkan Kecerahan</value>\n  </data>\n  <data name=\"BWTrayIcon\" xml:space=\"preserve\">\n    <value>Black and white tray icon</value>\n  </data>\n  <data name=\"Calibrate\" xml:space=\"preserve\">\n    <value>Kalibrasi</value>\n  </data>\n  <data name=\"Charging\" xml:space=\"preserve\">\n    <value>Mengisi Daya</value>\n  </data>\n  <data name=\"Color\" xml:space=\"preserve\">\n    <value>Warna</value>\n  </data>\n  <data name=\"Contrast\" xml:space=\"preserve\">\n    <value>Kontras</value>\n  </data>\n  <data name=\"Controller\" xml:space=\"preserve\">\n    <value>Controller</value>\n  </data>\n  <data name=\"CPUBoost\" xml:space=\"preserve\">\n    <value>CPU Boost</value>\n  </data>\n  <data name=\"Custom\" xml:space=\"preserve\">\n    <value>Kustom</value>\n  </data>\n  <data name=\"Deceleration\" xml:space=\"preserve\">\n    <value>Perlambatan</value>\n  </data>\n  <data name=\"Default\" xml:space=\"preserve\">\n    <value>Standar</value>\n  </data>\n  <data name=\"DisableController\" xml:space=\"preserve\">\n    <value>Disable Controller</value>\n  </data>\n  <data name=\"DisableOnLidClose\" xml:space=\"preserve\">\n    <value>Disable on lid close</value>\n  </data>\n  <data name=\"DisableOverdrive\" xml:space=\"preserve\">\n    <value>Nonaktifkan screen overdrive</value>\n  </data>\n  <data name=\"Discharging\" xml:space=\"preserve\">\n    <value>Tidak mengisi</value>\n  </data>\n  <data name=\"DownloadColorProfiles\" xml:space=\"preserve\">\n    <value>Download Color Profiles</value>\n  </data>\n  <data name=\"DownloadUpdate\" xml:space=\"preserve\">\n    <value>Unduh</value>\n  </data>\n  <data name=\"DriverAndSoftware\" xml:space=\"preserve\">\n    <value>Driver dan Software</value>\n  </data>\n  <data name=\"EcoGPUTooltip\" xml:space=\"preserve\">\n    <value>Menonaktikan dGPU untuk menghemat baterai</value>\n  </data>\n  <data name=\"EcoMode\" xml:space=\"preserve\">\n    <value>Eco</value>\n  </data>\n  <data name=\"EnableGPUOnShutdown\" xml:space=\"preserve\">\n    <value>Enable GPU on shutdown (prevents issue with Eco mode)</value>\n  </data>\n  <data name=\"EnableOptimusText\" xml:space=\"preserve\">\n    <value>Menonaktikan dGPU dengan masuk ke mode Eco saat Mode Tampilan di Panel Kontrol NVIDIA tidak diatur ke Optimus mungkin dapat menyebabkan masalah dengan kontrol kecerahan hingga mulai ulang berikutnya. \n\nApakah Anda masih ingin melanjutkan?</value>\n  </data>\n  <data name=\"EnableOptimusTitle\" xml:space=\"preserve\">\n    <value>Mode Tampilan NVIDIA tidak diatur ke Optimus</value>\n  </data>\n  <data name=\"EnergySettings\" xml:space=\"preserve\">\n    <value>Pengaturan Energi</value>\n  </data>\n  <data name=\"Export\" xml:space=\"preserve\">\n    <value>Ekspor Profil</value>\n  </data>\n  <data name=\"Extra\" xml:space=\"preserve\">\n    <value>Ekstra</value>\n  </data>\n  <data name=\"ExtraSettings\" xml:space=\"preserve\">\n    <value>Pengaturan Ekstra</value>\n  </data>\n  <data name=\"FactoryDefaults\" xml:space=\"preserve\">\n    <value>Setelan Pabrik</value>\n  </data>\n  <data name=\"FanCurves\" xml:space=\"preserve\">\n    <value>Kurva Kipas</value>\n  </data>\n  <data name=\"FanProfileCPU\" xml:space=\"preserve\">\n    <value>Profil Kipas CPU</value>\n  </data>\n  <data name=\"FanProfileGPU\" xml:space=\"preserve\">\n    <value>Profil Kipas GPU</value>\n  </data>\n  <data name=\"FanProfileMid\" xml:space=\"preserve\">\n    <value>Profil Kipas Sedang</value>\n  </data>\n  <data name=\"FanProfiles\" xml:space=\"preserve\">\n    <value>Profil Kipas</value>\n  </data>\n  <data name=\"FansAndPower\" xml:space=\"preserve\">\n    <value>Kipas dan Daya</value>\n  </data>\n  <data name=\"FanSpeed\" xml:space=\"preserve\">\n    <value>Kipas</value>\n  </data>\n  <data name=\"FansPower\" xml:space=\"preserve\">\n    <value>Kipas + Daya</value>\n  </data>\n  <data name=\"FlickerFreeDimming\" xml:space=\"preserve\">\n    <value>Flicker-free Dimming</value>\n  </data>\n  <data name=\"FnLock\" xml:space=\"preserve\">\n    <value>Proses tombol pintas Fn+F tanpa Fn</value>\n  </data>\n  <data name=\"FnLockOff\" xml:space=\"preserve\">\n    <value>FN-Lock Off</value>\n  </data>\n  <data name=\"FnLockOn\" xml:space=\"preserve\">\n    <value>FN-Lock On</value>\n  </data>\n  <data name=\"GPUBoost\" xml:space=\"preserve\">\n    <value>Dynamic Boost</value>\n  </data>\n  <data name=\"GPUChanging\" xml:space=\"preserve\">\n    <value>Mengubah</value>\n  </data>\n  <data name=\"GPUCoreClockOffset\" xml:space=\"preserve\">\n    <value>Core Clock Offset</value>\n  </data>\n  <data name=\"GPUMemoryClockOffset\" xml:space=\"preserve\">\n    <value>Memory Clock Offset</value>\n  </data>\n  <data name=\"GPUMode\" xml:space=\"preserve\">\n    <value>Mode GPU</value>\n  </data>\n  <data name=\"GPUModeEco\" xml:space=\"preserve\">\n    <value>Hanya iGPU</value>\n  </data>\n  <data name=\"GPUModeStandard\" xml:space=\"preserve\">\n    <value>iGPU + dGPU</value>\n  </data>\n  <data name=\"GPUModeUltimate\" xml:space=\"preserve\">\n    <value>dGPU eksklusif</value>\n  </data>\n  <data name=\"GPUPower\" xml:space=\"preserve\">\n    <value>GPU Power</value>\n  </data>\n  <data name=\"GPUSettings\" xml:space=\"preserve\">\n    <value>Pengaturan GPU</value>\n  </data>\n  <data name=\"GPUTempTarget\" xml:space=\"preserve\">\n    <value>Target Suhu</value>\n  </data>\n  <data name=\"HibernateAfter\" xml:space=\"preserve\">\n    <value>Menit hingga Hibernasi dalam mode tidur saat menggunakan baterai (0 - Mati)</value>\n  </data>\n  <data name=\"High\" xml:space=\"preserve\">\n    <value>Tinggi</value>\n  </data>\n  <data name=\"ImageRotation\" xml:space=\"preserve\">\n    <value>Rotasi Gambar</value>\n  </data>\n  <data name=\"Import\" xml:space=\"preserve\">\n    <value>Impor Profil</value>\n  </data>\n  <data name=\"KeyBindings\" xml:space=\"preserve\">\n    <value>Pintasan Keyboard</value>\n  </data>\n  <data name=\"Keyboard\" xml:space=\"preserve\">\n    <value>Keyboard</value>\n  </data>\n  <data name=\"KillGpuApps\" xml:space=\"preserve\">\n    <value>Hentikan semua aplikasi yang menggunakan GPU saat beralih ke mode Eco</value>\n  </data>\n  <data name=\"LaptopBacklight\" xml:space=\"preserve\">\n    <value>Laptop Backlight</value>\n  </data>\n  <data name=\"LaptopKeyboard\" xml:space=\"preserve\">\n    <value>Laptop Keyboard</value>\n  </data>\n  <data name=\"LaptopScreen\" xml:space=\"preserve\">\n    <value>Layar Laptop</value>\n  </data>\n  <data name=\"LEDStatusIndicators\" xml:space=\"preserve\">\n    <value>LED Status Indicators</value>\n  </data>\n  <data name=\"Lid\" xml:space=\"preserve\">\n    <value>Lid</value>\n  </data>\n  <data name=\"Lightbar\" xml:space=\"preserve\">\n    <value>Lightbar</value>\n  </data>\n  <data name=\"Lighting\" xml:space=\"preserve\">\n    <value>Lighting</value>\n  </data>\n  <data name=\"LockScreen\" xml:space=\"preserve\">\n    <value>Layar Kunci</value>\n  </data>\n  <data name=\"Logo\" xml:space=\"preserve\">\n    <value>Logo</value>\n  </data>\n  <data name=\"Low\" xml:space=\"preserve\">\n    <value>Rendah</value>\n  </data>\n  <data name=\"LSDeadzones\" xml:space=\"preserve\">\n    <value>Left Stick Deadzones</value>\n  </data>\n  <data name=\"LTDeadzones\" xml:space=\"preserve\">\n    <value>Left Trigger Deadzones</value>\n  </data>\n  <data name=\"MatrixAudio\" xml:space=\"preserve\">\n    <value>Visualisasi Audio</value>\n  </data>\n  <data name=\"MatrixBanner\" xml:space=\"preserve\">\n    <value>Binary Banner</value>\n  </data>\n  <data name=\"MatrixBright\" xml:space=\"preserve\">\n    <value>Terang</value>\n  </data>\n  <data name=\"MatrixClock\" xml:space=\"preserve\">\n    <value>Jam</value>\n  </data>\n  <data name=\"MatrixDim\" xml:space=\"preserve\">\n    <value>Redup</value>\n  </data>\n  <data name=\"MatrixLogo\" xml:space=\"preserve\">\n    <value>Logo Rog</value>\n  </data>\n  <data name=\"MatrixMedium\" xml:space=\"preserve\">\n    <value>Sedang</value>\n  </data>\n  <data name=\"MatrixOff\" xml:space=\"preserve\">\n    <value>Mati</value>\n  </data>\n  <data name=\"MatrixPicture\" xml:space=\"preserve\">\n    <value>Gambar</value>\n  </data>\n  <data name=\"MaxRefreshTooltip\" xml:space=\"preserve\">\n    <value>Maks refresh rate untuk mengurangi latensi</value>\n  </data>\n  <data name=\"MinRefreshTooltip\" xml:space=\"preserve\">\n    <value>60Hz refresh rate untuk menghemat baterai</value>\n  </data>\n  <data name=\"Minute\" xml:space=\"preserve\">\n    <value>Menit</value>\n  </data>\n  <data name=\"Minutes\" xml:space=\"preserve\">\n    <value>Menit</value>\n  </data>\n  <data name=\"MouseAngleSnapping\" xml:space=\"preserve\">\n    <value>Angle Snapping / Tuning</value>\n  </data>\n  <data name=\"MouseAutoPowerOff\" xml:space=\"preserve\">\n    <value>Mati Otomatis Setelah</value>\n  </data>\n  <data name=\"MouseButtonResponse\" xml:space=\"preserve\">\n    <value>Respon Tombol</value>\n  </data>\n  <data name=\"MouseImportFailed\" xml:space=\"preserve\">\n    <value>Import failed. Selected file is not a valid mouse profile or corrutpted.</value>\n  </data>\n  <data name=\"MouseLiftOffDistance\" xml:space=\"preserve\">\n    <value>Jarak Angkat</value>\n  </data>\n  <data name=\"MouseLowBatteryWarning\" xml:space=\"preserve\">\n    <value>Peringatan Baterai Rendah pada</value>\n  </data>\n  <data name=\"MousePerformance\" xml:space=\"preserve\">\n    <value>Performa</value>\n  </data>\n  <data name=\"MouseSynchronize\" xml:space=\"preserve\">\n    <value>Sinkronkan dengan mouse</value>\n  </data>\n  <data name=\"Multizone\" xml:space=\"preserve\">\n    <value>Multi Zone</value>\n  </data>\n  <data name=\"MultizoneStrong\" xml:space=\"preserve\">\n    <value>Multi Zone Strong</value>\n  </data>\n  <data name=\"Muted\" xml:space=\"preserve\">\n    <value>Di Bisukan</value>\n  </data>\n  <data name=\"MuteMic\" xml:space=\"preserve\">\n    <value>Bisukan Mic</value>\n  </data>\n  <data name=\"Never\" xml:space=\"preserve\">\n    <value>Jangan Pernah</value>\n  </data>\n  <data name=\"NewUpdates\" xml:space=\"preserve\">\n    <value>Pembaruan Terbaru</value>\n  </data>\n  <data name=\"NoNewUpdates\" xml:space=\"preserve\">\n    <value>Tidak ada pembaruan</value>\n  </data>\n  <data name=\"NotConnected\" xml:space=\"preserve\">\n    <value>Tidak Tersambung</value>\n  </data>\n  <data name=\"Off\" xml:space=\"preserve\">\n    <value>Mati</value>\n  </data>\n  <data name=\"On\" xml:space=\"preserve\">\n    <value>Hidup</value>\n  </data>\n  <data name=\"OneZone\" xml:space=\"preserve\">\n    <value>One Zone</value>\n  </data>\n  <data name=\"OpenGHelper\" xml:space=\"preserve\">\n    <value>Buka Jendela G-Helper</value>\n  </data>\n  <data name=\"Optimized\" xml:space=\"preserve\">\n    <value>Dioptimalkan</value>\n  </data>\n  <data name=\"OptimizedGPUTooltip\" xml:space=\"preserve\">\n    <value>Beralih ke Mode Eco saat menggunakan baterai dan ke Mode Standar saat mengisi daya.</value>\n  </data>\n  <data name=\"OptimizedUSBC\" xml:space=\"preserve\">\n    <value>Tetap matikan GPU pada pengisi daya USB-C dalam mode Dioptimalkan</value>\n  </data>\n  <data name=\"Other\" xml:space=\"preserve\">\n    <value>Lainnya</value>\n  </data>\n  <data name=\"Overdrive\" xml:space=\"preserve\">\n    <value>Overdrive</value>\n  </data>\n  <data name=\"PerformanceMode\" xml:space=\"preserve\">\n    <value>Mode</value>\n  </data>\n  <data name=\"Peripherals\" xml:space=\"preserve\">\n    <value>Periferal</value>\n  </data>\n  <data name=\"PictureGif\" xml:space=\"preserve\">\n    <value>Gambar / Gif</value>\n  </data>\n  <data name=\"PlayPause\" xml:space=\"preserve\">\n    <value>Putar / Jeda</value>\n  </data>\n  <data name=\"PollingRate\" xml:space=\"preserve\">\n    <value>Polling Rate</value>\n  </data>\n  <data name=\"PowerLimits\" xml:space=\"preserve\">\n    <value>Batas Daya</value>\n  </data>\n  <data name=\"PPTExperimental\" xml:space=\"preserve\">\n    <value>Batas Daya adalah fitur eksperimental. Gunakan dengan hati-hati dan atas risiko Anda sendiri!</value>\n  </data>\n  <data name=\"PrintScreen\" xml:space=\"preserve\">\n    <value>PrintScreen</value>\n  </data>\n  <data name=\"Profile\" xml:space=\"preserve\">\n    <value>Profil</value>\n  </data>\n  <data name=\"Quit\" xml:space=\"preserve\">\n    <value>Keluar</value>\n  </data>\n  <data name=\"Reset\" xml:space=\"preserve\">\n    <value>Reset</value>\n  </data>\n  <data name=\"RestartGPU\" xml:space=\"preserve\">\n    <value>Ada yang menggunakan dGPU dan mencegah mode Eco. Biarkan G-Helper mencoba memulai ulang dGPU di pengelola perangkat? (Silakan lanjutkan dengan risiko Anda sendiri)</value>\n  </data>\n  <data name=\"RPM\" xml:space=\"preserve\">\n    <value>RPM</value>\n  </data>\n  <data name=\"RSDeadzones\" xml:space=\"preserve\">\n    <value>Right Stick Deadzones</value>\n  </data>\n  <data name=\"RTDeadzones\" xml:space=\"preserve\">\n    <value>Right Trigger Deadzones</value>\n  </data>\n  <data name=\"RunOnStartup\" xml:space=\"preserve\">\n    <value>Jalankan di Startup</value>\n  </data>\n  <data name=\"ScalingQuality\" xml:space=\"preserve\">\n    <value>Scaling Quality</value>\n  </data>\n  <data name=\"ScreenPadDown\" xml:space=\"preserve\">\n    <value>Kurangi Kecerahan Screenpad</value>\n  </data>\n  <data name=\"ScreenPadUp\" xml:space=\"preserve\">\n    <value>Tingkatkan Kecerahan Screenpad</value>\n  </data>\n  <data name=\"Shutdown\" xml:space=\"preserve\">\n    <value>Matikan</value>\n  </data>\n  <data name=\"Silent\" xml:space=\"preserve\">\n    <value>Diam</value>\n  </data>\n  <data name=\"Sleep\" xml:space=\"preserve\">\n    <value>Tidur</value>\n  </data>\n  <data name=\"StandardGPUTooltip\" xml:space=\"preserve\">\n    <value>Mengaktifkan dGPU untuk penggunaan standar</value>\n  </data>\n  <data name=\"StandardMode\" xml:space=\"preserve\">\n    <value>Standar</value>\n  </data>\n  <data name=\"Start\" xml:space=\"preserve\">\n    <value>Mulai</value>\n  </data>\n  <data name=\"StartingServices\" xml:space=\"preserve\">\n    <value>Memulai Services</value>\n  </data>\n  <data name=\"StartupError\" xml:space=\"preserve\">\n    <value>Startup Error</value>\n  </data>\n  <data name=\"Stop\" xml:space=\"preserve\">\n    <value>Berhenti</value>\n  </data>\n  <data name=\"StopGPUApps\" xml:space=\"preserve\">\n    <value>Hentikan Aplikasi GPU</value>\n  </data>\n  <data name=\"StoppingServices\" xml:space=\"preserve\">\n    <value>Menghentikan Services</value>\n  </data>\n  <data name=\"ToggleAura\" xml:space=\"preserve\">\n    <value>Hidupkan/Matikan Aura</value>\n  </data>\n  <data name=\"ToggleClamshellMode\" xml:space=\"preserve\">\n    <value>Otomatis Hidupkan/Matikan Mode Clamshell</value>\n  </data>\n  <data name=\"ToggleFnLock\" xml:space=\"preserve\">\n    <value>Hidupkan/Matikan Fn-Lock</value>\n  </data>\n  <data name=\"ToggleMiniled\" xml:space=\"preserve\">\n    <value>Toggle Miniled (jika didukung)</value>\n  </data>\n  <data name=\"ToggleScreen\" xml:space=\"preserve\">\n    <value>Hidupkan/Matikan Layar</value>\n  </data>\n  <data name=\"ToggleTouchscreen\" xml:space=\"preserve\">\n    <value>Toggle Touchscreen</value>\n  </data>\n  <data name=\"Touchscreen\" xml:space=\"preserve\">\n    <value>Touchscreen</value>\n  </data>\n  <data name=\"Turbo\" xml:space=\"preserve\">\n    <value>Turbo</value>\n  </data>\n  <data name=\"TurnedOff\" xml:space=\"preserve\">\n    <value>Dimatikan</value>\n  </data>\n  <data name=\"TurnOffOnBattery\" xml:space=\"preserve\">\n    <value>Matikan saat menggunakan baterai</value>\n  </data>\n  <data name=\"UltimateGPUTooltip\" xml:space=\"preserve\">\n    <value>Merutekan layar laptop ke dGPU, memaksimalkan FPS</value>\n  </data>\n  <data name=\"UltimateMode\" xml:space=\"preserve\">\n    <value>Ultimate</value>\n  </data>\n  <data name=\"UndervoltingRisky\" xml:space=\"preserve\">\n    <value>Undervolting adalah fitur eksperimental dan berisiko. Jika nilai yang diterapkan terlalu rendah untuk perangkat keras Anda, ini dapat menjadi tidak stabil, mati mendadak, atau menyebabkan kerusakan data. Jika Anda ingin mencobanya, mulailah dengan nilai kecil terlebih dahulu, klik Terapkan, dan uji apa yang cocok untuk Anda.</value>\n  </data>\n  <data name=\"Unmuted\" xml:space=\"preserve\">\n    <value>Bunyikan</value>\n  </data>\n  <data name=\"Updates\" xml:space=\"preserve\">\n    <value>Pembaruan</value>\n  </data>\n  <data name=\"VersionLabel\" xml:space=\"preserve\">\n    <value>Versi</value>\n  </data>\n  <data name=\"VibrationStrength\" xml:space=\"preserve\">\n    <value>Kekuatan Getaran</value>\n  </data>\n  <data name=\"VisualMode\" xml:space=\"preserve\">\n    <value>Mode Visual</value>\n  </data>\n  <data name=\"VisualModesHDR\" xml:space=\"preserve\">\n    <value>Mode Visual tidak tersedia saat HDR aktif</value>\n  </data>\n  <data name=\"VisualModesScreen\" xml:space=\"preserve\">\n    <value>Mode Visual tidak tersedia saat layar laptop mati</value>\n  </data>\n  <data name=\"VolumeDown\" xml:space=\"preserve\">\n    <value>Volume Turun</value>\n  </data>\n  <data name=\"VolumeMute\" xml:space=\"preserve\">\n    <value>Volume Bisu</value>\n  </data>\n  <data name=\"VolumeUp\" xml:space=\"preserve\">\n    <value>Volume Naik</value>\n  </data>\n  <data name=\"WindowTop\" xml:space=\"preserve\">\n    <value>Jaga agar jendela aplikasi selalu di atas</value>\n  </data>\n  <data name=\"Zoom\" xml:space=\"preserve\">\n    <value>Perbesar</value>\n  </data>\n  <data name=\"Donate\" xml:space=\"preserve\">\n    <value>Donate</value>\n  </data>\n  <data name=\"Legend\" xml:space=\"preserve\">\n    <value>Legend</value>\n  </data>\n  <data name=\"LegendGray\" xml:space=\"preserve\">\n    <value>Can't check local version</value>\n    <comment>Can't check local version</comment>\n  </data>\n  <data name=\"LegendRed\" xml:space=\"preserve\">\n    <value>Update Available</value>\n    <comment>Update Available</comment>\n  </data>\n  <data name=\"LegendGreen\" xml:space=\"preserve\">\n    <value>Updated</value>\n    <comment>Updated</comment>\n  </data>\n  <data name=\"SlashBounce\" xml:space=\"preserve\">\n    <value>Bounce</value>\n  </data>\n  <data name=\"SlashMode\" xml:space=\"preserve\">\n    <value>Slash</value>\n  </data>\n  <data name=\"SlashLoading\" xml:space=\"preserve\">\n    <value>Loading</value>\n  </data>\n  <data name=\"SlashBitStream\" xml:space=\"preserve\">\n    <value>Bit Stream</value>\n  </data>\n  <data name=\"SlashTransmission\" xml:space=\"preserve\">\n    <value>Transmission</value>\n  </data>\n  <data name=\"SlashFlow\" xml:space=\"preserve\">\n    <value>Flow</value>\n  </data>\n  <data name=\"SlashFlux\" xml:space=\"preserve\">\n    <value>Flux</value>\n  </data>\n  <data name=\"SlashPhantom\" xml:space=\"preserve\">\n    <value>Phantom</value>\n  </data>\n  <data name=\"SlashSpectrum\" xml:space=\"preserve\">\n    <value>Spectrum</value>\n  </data>\n  <data name=\"SlashHazard\" xml:space=\"preserve\">\n    <value>Hazard</value>\n  </data>\n  <data name=\"SlashInterfacing\" xml:space=\"preserve\">\n    <value>Interfacing</value>\n  </data>\n  <data name=\"SlashRamp\" xml:space=\"preserve\">\n    <value>Ramp</value>\n  </data>\n  <data name=\"SlashGameOver\" xml:space=\"preserve\">\n    <value>Game Over</value>\n  </data>\n  <data name=\"SlashStart\" xml:space=\"preserve\">\n    <value>Start</value>\n  </data>\n  <data name=\"SlashBuzzer\" xml:space=\"preserve\">\n    <value>Buzzer</value>\n  </data>\n  <data name=\"SlashStatic\" xml:space=\"preserve\">\n    <value>Static</value>\n  </data>\n  <data name=\"SlashBatteryLevel\" xml:space=\"preserve\">\n    <value>Battery Level</value>\n  </data>\n  <data name=\"IntervalOff\" xml:space=\"preserve\">\n    <value>Interval Off</value>\n  </data>\n  <data name=\"IntervalSeconds\" xml:space=\"preserve\">\n    <value>Interval {0}s</value>\n  </data>\n  <data name=\"DisableDynamicLighting\" xml:space=\"preserve\">\n    <value>Please disable Windows &gt; Dynamic Lighting</value>\n  </data>\n  <data name=\"AmbientModeResources\" xml:space=\"preserve\">\n    <value>Ambient mode may increase resource usage</value>\n  </data>\n  <data name=\"MouseMotionSync\" xml:space=\"preserve\">\n    <value>Motion Sync</value>\n  </data>\n  <data name=\"MouseZoneMode\" xml:space=\"preserve\">\n    <value>Zone Mode</value>\n  </data>\n</root>"
  },
  {
    "path": "app/Properties/Strings.it.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" id=\"root\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\"/>\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"name\" type=\"xsd:string\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\"/>\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Acceleration\" xml:space=\"preserve\">\n    <value>Accelerazione</value>\n  </data>\n  <data name=\"ACPIError\" xml:space=\"preserve\">\n    <value>Impossibile connettersi ad ASUS ACPI. Senza di essa l'applicazione non può funzionare. Prova ad installare Asus System Control Interface</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestart\" xml:space=\"preserve\">\n    <value>Riavvia il dispositivo per applicare le modifiche</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestartTitle\" xml:space=\"preserve\">\n    <value>Riavviare ora?</value>\n  </data>\n  <data name=\"AlertDGPU\" xml:space=\"preserve\">\n    <value>Uso intensivo della GPU, disabilitare?</value>\n  </data>\n  <data name=\"AlertDGPUTitle\" xml:space=\"preserve\">\n    <value>Modalità Eco</value>\n  </data>\n  <data name=\"AlertUltimateOff\" xml:space=\"preserve\">\n    <value>Per disattivare la modalità Estrema è necessario riavviare</value>\n  </data>\n  <data name=\"AlertUltimateOn\" xml:space=\"preserve\">\n    <value>Per attivare la modalità Estrema è necessario riavviare</value>\n  </data>\n  <data name=\"AlertUltimateTitle\" xml:space=\"preserve\">\n    <value>Riavviare ora?</value>\n  </data>\n  <data name=\"AllyController\" xml:space=\"preserve\">\n    <value>Ally Controller</value>\n  </data>\n  <data name=\"AnimationSpeed\" xml:space=\"preserve\">\n    <value>Velocità animazione</value>\n  </data>\n  <data name=\"AnimeMatrix\" xml:space=\"preserve\">\n    <value>Anime Matrix</value>\n  </data>\n  <data name=\"AppAlreadyRunning\" xml:space=\"preserve\">\n    <value>App già in esecuzione</value>\n  </data>\n  <data name=\"AppAlreadyRunningText\" xml:space=\"preserve\">\n    <value>G-Helper è già in esecuzione. Controlla l'icona nel system tray.</value>\n  </data>\n  <data name=\"Apply\" xml:space=\"preserve\">\n    <value>Applica</value>\n  </data>\n  <data name=\"ApplyFanCurve\" xml:space=\"preserve\">\n    <value>Applica Curve Ventola</value>\n  </data>\n  <data name=\"ApplyPowerLimits\" xml:space=\"preserve\">\n    <value>Applica Limiti di Potenza</value>\n  </data>\n  <data name=\"ApplyWindowsPowerPlan\" xml:space=\"preserve\">\n    <value>Regola Piano Energetico di Windows in automatico</value>\n  </data>\n  <data name=\"APUMemory\" xml:space=\"preserve\">\n    <value>Memoria assegnata alla GPU</value>\n  </data>\n  <data name=\"AsusServicesRunning\" xml:space=\"preserve\">\n    <value>Servizi Asus in Esecuzione</value>\n  </data>\n  <data name=\"AuraBatteryState\" xml:space=\"preserve\">\n    <value>Stato Batteria</value>\n  </data>\n  <data name=\"AuraBreathe\" xml:space=\"preserve\">\n    <value>Respiro</value>\n  </data>\n  <data name=\"AuraClockwise\" xml:space=\"preserve\">\n    <value>Senso Orario</value>\n  </data>\n  <data name=\"AuraColorCycle\" xml:space=\"preserve\">\n    <value>Ciclo Colori</value>\n  </data>\n  <data name=\"AuraComet\" xml:space=\"preserve\">\n    <value>Cometa</value>\n  </data>\n  <data name=\"AuraCounterClockwise\" xml:space=\"preserve\">\n    <value>Senso Antiorario</value>\n  </data>\n  <data name=\"AuraFast\" xml:space=\"preserve\">\n    <value>Veloce</value>\n  </data>\n  <data name=\"AuraLightingMode\" xml:space=\"preserve\">\n    <value>Modalità Illuminazione</value>\n  </data>\n  <data name=\"AuraNormal\" xml:space=\"preserve\">\n    <value>Normale</value>\n  </data>\n  <data name=\"AuraRainbow\" xml:space=\"preserve\">\n    <value>Arcobaleno</value>\n  </data>\n  <data name=\"AuraRandomColor\" xml:space=\"preserve\">\n    <value>Casuale</value>\n  </data>\n  <data name=\"AuraReact\" xml:space=\"preserve\">\n    <value>Reazione</value>\n  </data>\n  <data name=\"AuraSlow\" xml:space=\"preserve\">\n    <value>Lenta</value>\n  </data>\n  <data name=\"AuraStatic\" xml:space=\"preserve\">\n    <value>Statico</value>\n  </data>\n  <data name=\"AuraStrobe\" xml:space=\"preserve\">\n    <value>Strobo</value>\n  </data>\n  <data name=\"AuraZoneAll\" xml:space=\"preserve\">\n    <value>Tutte</value>\n  </data>\n  <data name=\"AuraZoneDock\" xml:space=\"preserve\">\n    <value>Dock</value>\n  </data>\n  <data name=\"AuraZoneLogo\" xml:space=\"preserve\">\n    <value>Logo</value>\n  </data>\n  <data name=\"AuraZoneScroll\" xml:space=\"preserve\">\n    <value>Rotellina</value>\n  </data>\n  <data name=\"AuraZoneUnderglow\" xml:space=\"preserve\">\n    <value>Underglow</value>\n  </data>\n  <data name=\"AutoApply\" xml:space=\"preserve\">\n    <value>Auto Applica</value>\n  </data>\n  <data name=\"AutoMode\" xml:space=\"preserve\">\n    <value>Auto</value>\n  </data>\n  <data name=\"AutoRefreshTooltip\" xml:space=\"preserve\">\n    <value>Imposta 60Hz per risparmiare batteria, reimposta quando in carica</value>\n  </data>\n  <data name=\"Awake\" xml:space=\"preserve\">\n    <value>In uso</value>\n  </data>\n  <data name=\"BacklightLow\" xml:space=\"preserve\">\n    <value>Basso</value>\n  </data>\n  <data name=\"BacklightMax\" xml:space=\"preserve\">\n    <value>Massimo</value>\n  </data>\n  <data name=\"BacklightMid\" xml:space=\"preserve\">\n    <value>Medio</value>\n  </data>\n  <data name=\"BacklightOff\" xml:space=\"preserve\">\n    <value>Spento</value>\n  </data>\n  <data name=\"BacklightTimeout\" xml:space=\"preserve\">\n    <value>Timeout in carica / a batteria (0 - ACCESO)</value>\n  </data>\n  <data name=\"BacklightTimeoutBattery\" xml:space=\"preserve\">\n    <value>Timeout retroilluminazione quando in batteria</value>\n  </data>\n  <data name=\"BacklightTimeoutPlugged\" xml:space=\"preserve\">\n    <value>Backlight Timeout when plugged</value>\n  </data>\n  <data name=\"Balanced\" xml:space=\"preserve\">\n    <value>Bilanciato</value>\n  </data>\n  <data name=\"BatteryCharge\" xml:space=\"preserve\">\n    <value>Carica</value>\n  </data>\n  <data name=\"BatteryChargeLimit\" xml:space=\"preserve\">\n    <value>Limite Ricarica Batteria</value>\n  </data>\n  <data name=\"BatteryHealth\" xml:space=\"preserve\">\n    <value>Salute Batteria</value>\n  </data>\n  <data name=\"BatteryLimitFull\" xml:space=\"preserve\">\n    <value>One time charge to 100%</value>\n  </data>\n  <data name=\"Binding\" xml:space=\"preserve\">\n    <value>Binding</value>\n  </data>\n  <data name=\"BindingPrimary\" xml:space=\"preserve\">\n    <value>Primario</value>\n  </data>\n  <data name=\"BindingSecondary\" xml:space=\"preserve\">\n    <value>Secondario</value>\n  </data>\n  <data name=\"BiosAndDriverUpdates\" xml:space=\"preserve\">\n    <value>Aggiornamenti Driver e BIOS</value>\n  </data>\n  <data name=\"Boot\" xml:space=\"preserve\">\n    <value>Avvio</value>\n  </data>\n  <data name=\"BootSound\" xml:space=\"preserve\">\n    <value>Suono Di Avvio</value>\n  </data>\n  <data name=\"Brightness\" xml:space=\"preserve\">\n    <value>Luminosità</value>\n  </data>\n  <data name=\"BrightnessDown\" xml:space=\"preserve\">\n    <value>Riduci Luminosità</value>\n  </data>\n  <data name=\"BrightnessUp\" xml:space=\"preserve\">\n    <value>Aumenta Luminosità</value>\n  </data>\n  <data name=\"BWTrayIcon\" xml:space=\"preserve\">\n    <value>Black and white tray icon</value>\n  </data>\n  <data name=\"Calibrate\" xml:space=\"preserve\">\n    <value>Calibrazione</value>\n  </data>\n  <data name=\"Charging\" xml:space=\"preserve\">\n    <value>In carica</value>\n  </data>\n  <data name=\"Color\" xml:space=\"preserve\">\n    <value>Colore</value>\n  </data>\n  <data name=\"Contrast\" xml:space=\"preserve\">\n    <value>Contrasto</value>\n  </data>\n  <data name=\"Controller\" xml:space=\"preserve\">\n    <value>Controller</value>\n  </data>\n  <data name=\"CPUBoost\" xml:space=\"preserve\">\n    <value>Boost CPU</value>\n  </data>\n  <data name=\"Custom\" xml:space=\"preserve\">\n    <value>Personalizzato</value>\n  </data>\n  <data name=\"Deceleration\" xml:space=\"preserve\">\n    <value>Decelerazione</value>\n  </data>\n  <data name=\"Default\" xml:space=\"preserve\">\n    <value>Default</value>\n  </data>\n  <data name=\"DisableController\" xml:space=\"preserve\">\n    <value>Disabilita Controller</value>\n  </data>\n  <data name=\"DisableOnLidClose\" xml:space=\"preserve\">\n    <value>Disattiva a schermo chiuso</value>\n  </data>\n  <data name=\"DisableOverdrive\" xml:space=\"preserve\">\n    <value>Disabilita Overdrive Schermo</value>\n  </data>\n  <data name=\"Discharging\" xml:space=\"preserve\">\n    <value>Scaricamento</value>\n  </data>\n  <data name=\"DownloadColorProfiles\" xml:space=\"preserve\">\n    <value>Scarica Profili Colore</value>\n  </data>\n  <data name=\"DownloadUpdate\" xml:space=\"preserve\">\n    <value>Scarica</value>\n  </data>\n  <data name=\"DriverAndSoftware\" xml:space=\"preserve\">\n    <value>Driver e Software</value>\n  </data>\n  <data name=\"EcoGPUTooltip\" xml:space=\"preserve\">\n    <value>Disabilita dGPU per risparmiare energia</value>\n  </data>\n  <data name=\"EcoMode\" xml:space=\"preserve\">\n    <value>Eco</value>\n  </data>\n  <data name=\"EnableGPUOnShutdown\" xml:space=\"preserve\">\n    <value>Abilita la GPU allo spegnimento (evita problemi con la modalità Eco)</value>\n  </data>\n  <data name=\"EnableOptimusText\" xml:space=\"preserve\">\n    <value>Disabilitare la dGPU impostando la modalità Eco quando non è attiva la modalità schermo Optimus nel Pannello di Controllo NVIDIA può causare problemi al controllo della luminosità fino al prossimo riavvio.\n\nSei sicuro di voler continuare?</value>\n  </data>\n  <data name=\"EnableOptimusTitle\" xml:space=\"preserve\">\n    <value>Modalità schermo NVIDIA non impostata su Optimus</value>\n  </data>\n  <data name=\"EnergySettings\" xml:space=\"preserve\">\n    <value>Risparmio Energia</value>\n  </data>\n  <data name=\"Export\" xml:space=\"preserve\">\n    <value>Esporta Profilo</value>\n  </data>\n  <data name=\"Extra\" xml:space=\"preserve\">\n    <value>Extra</value>\n  </data>\n  <data name=\"ExtraSettings\" xml:space=\"preserve\">\n    <value>Impostazioni aggiuntive</value>\n  </data>\n  <data name=\"FactoryDefaults\" xml:space=\"preserve\">\n    <value>Valori Predefiniti</value>\n  </data>\n  <data name=\"FanCurves\" xml:space=\"preserve\">\n    <value>Curve Ventola</value>\n  </data>\n  <data name=\"FanProfileCPU\" xml:space=\"preserve\">\n    <value>Profilo Ventola CPU</value>\n  </data>\n  <data name=\"FanProfileGPU\" xml:space=\"preserve\">\n    <value>Profilo Ventola GPU</value>\n  </data>\n  <data name=\"FanProfileMid\" xml:space=\"preserve\">\n    <value>Profilo Ventola Centrale</value>\n  </data>\n  <data name=\"FanProfiles\" xml:space=\"preserve\">\n    <value>Profili Ventola</value>\n  </data>\n  <data name=\"FansAndPower\" xml:space=\"preserve\">\n    <value>Alimentazione e Ventole</value>\n  </data>\n  <data name=\"FanSpeed\" xml:space=\"preserve\">\n    <value>Ventola</value>\n  </data>\n  <data name=\"FansPower\" xml:space=\"preserve\">\n    <value>Ventole + Alimentazione</value>\n  </data>\n  <data name=\"FlickerFreeDimming\" xml:space=\"preserve\">\n    <value>Flicker-free Dimming</value>\n  </data>\n  <data name=\"FnLock\" xml:space=\"preserve\">\n    <value>Elabora i tasti Fn+F direttamente senza Fn</value>\n  </data>\n  <data name=\"FnLockOff\" xml:space=\"preserve\">\n    <value>Blocco FN Disattivo</value>\n  </data>\n  <data name=\"FnLockOn\" xml:space=\"preserve\">\n    <value>Blocco FN Attivo</value>\n  </data>\n  <data name=\"GPUBoost\" xml:space=\"preserve\">\n    <value>Boost Dinamico</value>\n  </data>\n  <data name=\"GPUChanging\" xml:space=\"preserve\">\n    <value>Impostando</value>\n  </data>\n  <data name=\"GPUCoreClockOffset\" xml:space=\"preserve\">\n    <value>Offset Clock Core</value>\n  </data>\n  <data name=\"GPUMemoryClockOffset\" xml:space=\"preserve\">\n    <value>Offset Clock Memoria</value>\n  </data>\n  <data name=\"GPUMode\" xml:space=\"preserve\">\n    <value>Modalità GPU</value>\n  </data>\n  <data name=\"GPUModeEco\" xml:space=\"preserve\">\n    <value>Solo iGPU</value>\n  </data>\n  <data name=\"GPUModeStandard\" xml:space=\"preserve\">\n    <value>iGPU + dGPU</value>\n  </data>\n  <data name=\"GPUModeUltimate\" xml:space=\"preserve\">\n    <value>Solo dGPU</value>\n  </data>\n  <data name=\"GPUPower\" xml:space=\"preserve\">\n    <value>Potenza GPU</value>\n  </data>\n  <data name=\"GPUSettings\" xml:space=\"preserve\">\n    <value>Impostazioni GPU</value>\n  </data>\n  <data name=\"GPUTempTarget\" xml:space=\"preserve\">\n    <value>Temperatura Target</value>\n  </data>\n  <data name=\"HibernateAfter\" xml:space=\"preserve\">\n    <value>Iberna dopo X minuti se alimentato a batteria (0 - ACCESO)</value>\n  </data>\n  <data name=\"High\" xml:space=\"preserve\">\n    <value>Elevato</value>\n  </data>\n  <data name=\"ImageRotation\" xml:space=\"preserve\">\n    <value>Rotazione Immagine</value>\n  </data>\n  <data name=\"Import\" xml:space=\"preserve\">\n    <value>Importa Profilo</value>\n  </data>\n  <data name=\"KeyBindings\" xml:space=\"preserve\">\n    <value>Associazione Tasti</value>\n  </data>\n  <data name=\"Keyboard\" xml:space=\"preserve\">\n    <value>Tastiera</value>\n  </data>\n  <data name=\"KillGpuApps\" xml:space=\"preserve\">\n    <value>Arresta tutte le app che usano la GPU passando ad Eco</value>\n  </data>\n  <data name=\"LaptopBacklight\" xml:space=\"preserve\">\n    <value>Retroilluminazione Laptop</value>\n  </data>\n  <data name=\"LaptopKeyboard\" xml:space=\"preserve\">\n    <value>Tastiera Laptop</value>\n  </data>\n  <data name=\"LaptopScreen\" xml:space=\"preserve\">\n    <value>Schermo Laptop</value>\n  </data>\n  <data name=\"LEDStatusIndicators\" xml:space=\"preserve\">\n    <value>Indicatori Di Stato LED</value>\n  </data>\n  <data name=\"Lid\" xml:space=\"preserve\">\n    <value>Schermo</value>\n  </data>\n  <data name=\"Lightbar\" xml:space=\"preserve\">\n    <value>Barra Luminosa</value>\n  </data>\n  <data name=\"Lighting\" xml:space=\"preserve\">\n    <value>Illuminazione</value>\n  </data>\n  <data name=\"LockScreen\" xml:space=\"preserve\">\n    <value>Schermata di blocco</value>\n  </data>\n  <data name=\"Logo\" xml:space=\"preserve\">\n    <value>Logo</value>\n  </data>\n  <data name=\"Low\" xml:space=\"preserve\">\n    <value>Basso</value>\n  </data>\n  <data name=\"LSDeadzones\" xml:space=\"preserve\">\n    <value>Zona morta della levetta sinistra</value>\n  </data>\n  <data name=\"LTDeadzones\" xml:space=\"preserve\">\n    <value>Zona morta dell'interruttore sinistro</value>\n  </data>\n  <data name=\"MatrixAudio\" xml:space=\"preserve\">\n    <value>Visualizzatore Audio</value>\n  </data>\n  <data name=\"MatrixBanner\" xml:space=\"preserve\">\n    <value>Banner Binario</value>\n  </data>\n  <data name=\"MatrixBright\" xml:space=\"preserve\">\n    <value>Luminoso</value>\n  </data>\n  <data name=\"MatrixClock\" xml:space=\"preserve\">\n    <value>Orologio</value>\n  </data>\n  <data name=\"MatrixDim\" xml:space=\"preserve\">\n    <value>Tenue</value>\n  </data>\n  <data name=\"MatrixLogo\" xml:space=\"preserve\">\n    <value>Logo ROG</value>\n  </data>\n  <data name=\"MatrixMedium\" xml:space=\"preserve\">\n    <value>Medio</value>\n  </data>\n  <data name=\"MatrixOff\" xml:space=\"preserve\">\n    <value>Spento</value>\n  </data>\n  <data name=\"MatrixPicture\" xml:space=\"preserve\">\n    <value>Immagine</value>\n  </data>\n  <data name=\"MaxRefreshTooltip\" xml:space=\"preserve\">\n    <value>Massimo refresh rate per latenza ridotta</value>\n  </data>\n  <data name=\"MinRefreshTooltip\" xml:space=\"preserve\">\n    <value>60Hz refresh rate per risparmiare batteria</value>\n  </data>\n  <data name=\"Minute\" xml:space=\"preserve\">\n    <value>Minuto</value>\n  </data>\n  <data name=\"Minutes\" xml:space=\"preserve\">\n    <value>Minuti</value>\n  </data>\n  <data name=\"MouseAngleSnapping\" xml:space=\"preserve\">\n    <value>Angle Snapping / Tuning</value>\n  </data>\n  <data name=\"MouseAutoPowerOff\" xml:space=\"preserve\">\n    <value>Auto-disattivazione dopo</value>\n  </data>\n  <data name=\"MouseButtonResponse\" xml:space=\"preserve\">\n    <value>Risposta Tasto Mouse</value>\n  </data>\n  <data name=\"MouseImportFailed\" xml:space=\"preserve\">\n    <value>Importazione non riuscita. Il file selezionato non è un profilo di mouse valido o è corrotto.</value>\n  </data>\n  <data name=\"MouseLiftOffDistance\" xml:space=\"preserve\">\n    <value>Lift Off Distance</value>\n  </data>\n  <data name=\"MouseLowBatteryWarning\" xml:space=\"preserve\">\n    <value>Avviso Batteria Mouse in Esaurimento</value>\n  </data>\n  <data name=\"MousePerformance\" xml:space=\"preserve\">\n    <value>Prestazioni</value>\n  </data>\n  <data name=\"MouseSynchronize\" xml:space=\"preserve\">\n    <value>Sincronizza con Mouse</value>\n  </data>\n  <data name=\"Multizone\" xml:space=\"preserve\">\n    <value>Multi Zona</value>\n  </data>\n  <data name=\"MultizoneStrong\" xml:space=\"preserve\">\n    <value>Multi Zone Strong</value>\n  </data>\n  <data name=\"Muted\" xml:space=\"preserve\">\n    <value>Muto</value>\n  </data>\n  <data name=\"MuteMic\" xml:space=\"preserve\">\n    <value>Silenzia microfono</value>\n  </data>\n  <data name=\"Never\" xml:space=\"preserve\">\n    <value>Mai</value>\n  </data>\n  <data name=\"NewUpdates\" xml:space=\"preserve\">\n    <value>Nuovi aggiornamenti</value>\n  </data>\n  <data name=\"NoNewUpdates\" xml:space=\"preserve\">\n    <value>Sistema aggiornato</value>\n  </data>\n  <data name=\"NotConnected\" xml:space=\"preserve\">\n    <value>Non Connesso</value>\n  </data>\n  <data name=\"Off\" xml:space=\"preserve\">\n    <value>Spento</value>\n  </data>\n  <data name=\"On\" xml:space=\"preserve\">\n    <value>Acceso</value>\n  </data>\n  <data name=\"OneZone\" xml:space=\"preserve\">\n    <value>One Zone</value>\n  </data>\n  <data name=\"OpenGHelper\" xml:space=\"preserve\">\n    <value>Apri G-Helper</value>\n  </data>\n  <data name=\"Optimized\" xml:space=\"preserve\">\n    <value>Ottimizzata</value>\n  </data>\n  <data name=\"OptimizedGPUTooltip\" xml:space=\"preserve\">\n    <value>Passa ad Eco se alimentato a batteria e a Standard quando in carica</value>\n  </data>\n  <data name=\"OptimizedUSBC\" xml:space=\"preserve\">\n    <value>Disabilita GPU durante ricarica tramite USB-C in modalità Ottimizzata</value>\n  </data>\n  <data name=\"Other\" xml:space=\"preserve\">\n    <value>Altro</value>\n  </data>\n  <data name=\"Overdrive\" xml:space=\"preserve\">\n    <value>Overdrive</value>\n  </data>\n  <data name=\"PerformanceMode\" xml:space=\"preserve\">\n    <value>Profilo</value>\n  </data>\n  <data name=\"Peripherals\" xml:space=\"preserve\">\n    <value>Periferiche</value>\n  </data>\n  <data name=\"PictureGif\" xml:space=\"preserve\">\n    <value>Immagine / Gif</value>\n  </data>\n  <data name=\"PlayPause\" xml:space=\"preserve\">\n    <value>Riproduci / Pausa</value>\n  </data>\n  <data name=\"PollingRate\" xml:space=\"preserve\">\n    <value>Polling Rate</value>\n  </data>\n  <data name=\"PowerLimits\" xml:space=\"preserve\">\n    <value>Limiti di Potenza</value>\n  </data>\n  <data name=\"PPTExperimental\" xml:space=\"preserve\">\n    <value>I Limiti di Potenza sono una funzione sperimentale. Usare con cautela e a proprio rischio!</value>\n  </data>\n  <data name=\"PrintScreen\" xml:space=\"preserve\">\n    <value>PrintScreen</value>\n  </data>\n  <data name=\"Profile\" xml:space=\"preserve\">\n    <value>Profilo</value>\n  </data>\n  <data name=\"Quit\" xml:space=\"preserve\">\n    <value>Esci</value>\n  </data>\n  <data name=\"Reset\" xml:space=\"preserve\">\n    <value>Reimposta</value>\n  </data>\n  <data name=\"RestartGPU\" xml:space=\"preserve\">\n    <value>Qualcosa sta utilizzando la dGPU e impedisce il passaggio alla modalità Eco. Vuoi che G-Helper provi a riavviare la dGPU in gestione dispositivi? (Procedi a tuo rischio)</value>\n  </data>\n  <data name=\"RPM\" xml:space=\"preserve\">\n    <value>RPM</value>\n  </data>\n  <data name=\"RSDeadzones\" xml:space=\"preserve\">\n    <value>Zona morta della levetta destra</value>\n  </data>\n  <data name=\"RTDeadzones\" xml:space=\"preserve\">\n    <value>Zona morta dell'interruttore destro</value>\n  </data>\n  <data name=\"RunOnStartup\" xml:space=\"preserve\">\n    <value>Esegui all'Avvio</value>\n  </data>\n  <data name=\"ScalingQuality\" xml:space=\"preserve\">\n    <value>Scaling Quality</value>\n  </data>\n  <data name=\"ScreenPadDown\" xml:space=\"preserve\">\n    <value>Riduci luminosità Screenpad</value>\n  </data>\n  <data name=\"ScreenPadUp\" xml:space=\"preserve\">\n    <value>Aumenta luminosità Screenpad</value>\n  </data>\n  <data name=\"Shutdown\" xml:space=\"preserve\">\n    <value>Spegnimento</value>\n  </data>\n  <data name=\"Silent\" xml:space=\"preserve\">\n    <value>Silenzioso</value>\n  </data>\n  <data name=\"Sleep\" xml:space=\"preserve\">\n    <value>Sospensione</value>\n  </data>\n  <data name=\"StandardGPUTooltip\" xml:space=\"preserve\">\n    <value>Abilita la dGPU solo quando richiesto da app e giochi</value>\n  </data>\n  <data name=\"StandardMode\" xml:space=\"preserve\">\n    <value>Standard</value>\n  </data>\n  <data name=\"Start\" xml:space=\"preserve\">\n    <value>Avvia</value>\n  </data>\n  <data name=\"StartingServices\" xml:space=\"preserve\">\n    <value>Servizi in avvio</value>\n  </data>\n  <data name=\"StartupError\" xml:space=\"preserve\">\n    <value>Errore Avvio</value>\n  </data>\n  <data name=\"Stop\" xml:space=\"preserve\">\n    <value>Arresta</value>\n  </data>\n  <data name=\"StopGPUApps\" xml:space=\"preserve\">\n    <value>Arresta applicazioni GPU</value>\n  </data>\n  <data name=\"StoppingServices\" xml:space=\"preserve\">\n    <value>Servizi in arresto</value>\n  </data>\n  <data name=\"ToggleAura\" xml:space=\"preserve\">\n    <value>Alterna Aura</value>\n  </data>\n  <data name=\"ToggleClamshellMode\" xml:space=\"preserve\">\n    <value>Attiva automaticamente la modalità a conchiglia</value>\n  </data>\n  <data name=\"ToggleFnLock\" xml:space=\"preserve\">\n    <value>Alterna Blocco-Fn</value>\n  </data>\n  <data name=\"ToggleMiniled\" xml:space=\"preserve\">\n    <value>Alterna Miniled (se supportato)</value>\n  </data>\n  <data name=\"ToggleScreen\" xml:space=\"preserve\">\n    <value>Alterna Schermo</value>\n  </data>\n  <data name=\"ToggleTouchscreen\" xml:space=\"preserve\">\n    <value>Attiva/Disattiva Touchscreen</value>\n  </data>\n  <data name=\"Touchscreen\" xml:space=\"preserve\">\n    <value>Touchscreen</value>\n  </data>\n  <data name=\"Turbo\" xml:space=\"preserve\">\n    <value>Turbo</value>\n  </data>\n  <data name=\"TurnedOff\" xml:space=\"preserve\">\n    <value>Spento</value>\n  </data>\n  <data name=\"TurnOffOnBattery\" xml:space=\"preserve\">\n    <value>Disattiva quando alimentato a batteria</value>\n  </data>\n  <data name=\"UltimateGPUTooltip\" xml:space=\"preserve\">\n    <value>Utilizza la dGPU in modalità esclusiva, massimizzando gli FPS</value>\n  </data>\n  <data name=\"UltimateMode\" xml:space=\"preserve\">\n    <value>Estrema</value>\n  </data>\n  <data name=\"UndervoltingRisky\" xml:space=\"preserve\">\n    <value>L'undervolting è una funzione sperimentale e rischiosa. Se i valori applicati sono troppo bassi per il tuo dispositivo, esso potrebbe diventare instabile, spegnersi o perdere dati. Se vuoi provare - inizia dapprima con valori contenuti, clicca Applica e verifica se funziona tutto correttamente.</value>\n  </data>\n  <data name=\"Unmuted\" xml:space=\"preserve\">\n    <value>Smutato</value>\n  </data>\n  <data name=\"Updates\" xml:space=\"preserve\">\n    <value>Aggiornamenti</value>\n  </data>\n  <data name=\"VersionLabel\" xml:space=\"preserve\">\n    <value>Versione</value>\n  </data>\n  <data name=\"VibrationStrength\" xml:space=\"preserve\">\n    <value>Intensità vibrazione</value>\n  </data>\n  <data name=\"VisualMode\" xml:space=\"preserve\">\n    <value>Visual Mode</value>\n  </data>\n  <data name=\"VisualModesHDR\" xml:space=\"preserve\">\n    <value>Le Visual Modes non sono disponibili quando l'HDR è attivo</value>\n  </data>\n  <data name=\"VisualModesScreen\" xml:space=\"preserve\">\n    <value>Le Visual Modes non sono disponibili quando lo schermo del portatile è spento</value>\n  </data>\n  <data name=\"VolumeDown\" xml:space=\"preserve\">\n    <value>Diminuisci Volume</value>\n  </data>\n  <data name=\"VolumeMute\" xml:space=\"preserve\">\n    <value>Azzera Volume</value>\n  </data>\n  <data name=\"VolumeUp\" xml:space=\"preserve\">\n    <value>Aumenta Volume</value>\n  </data>\n  <data name=\"WindowTop\" xml:space=\"preserve\">\n    <value>Mantieni applicazione sempre in primo piano</value>\n  </data>\n  <data name=\"Zoom\" xml:space=\"preserve\">\n    <value>Zoom</value>\n  </data>\n  <data name=\"Donate\" xml:space=\"preserve\">\n    <value>Dona</value>\n  </data>\n  <data name=\"Legend\" xml:space=\"preserve\">\n    <value>Legend</value>\n  </data>\n  <data name=\"LegendGray\" xml:space=\"preserve\">\n    <value>Impossibile verificare la versione locale</value>\n    <comment>Can't check local version</comment>\n  </data>\n  <data name=\"LegendRed\" xml:space=\"preserve\">\n    <value>Aggiornamento Disponibile</value>\n    <comment>Update Available</comment>\n  </data>\n  <data name=\"LegendGreen\" xml:space=\"preserve\">\n    <value>Aggiornato</value>\n    <comment>Updated</comment>\n  </data>\n  <data name=\"SlashBounce\" xml:space=\"preserve\">\n    <value>Rimbalzo</value>\n  </data>\n  <data name=\"SlashMode\" xml:space=\"preserve\">\n    <value>Slash</value>\n  </data>\n  <data name=\"SlashLoading\" xml:space=\"preserve\">\n    <value>Caricamento</value>\n  </data>\n  <data name=\"SlashBitStream\" xml:space=\"preserve\">\n    <value>Bit Stream</value>\n  </data>\n  <data name=\"SlashTransmission\" xml:space=\"preserve\">\n    <value>Trasmissione</value>\n  </data>\n  <data name=\"SlashFlow\" xml:space=\"preserve\">\n    <value>Flow</value>\n  </data>\n  <data name=\"SlashFlux\" xml:space=\"preserve\">\n    <value>Flux</value>\n  </data>\n  <data name=\"SlashPhantom\" xml:space=\"preserve\">\n    <value>Phantom</value>\n  </data>\n  <data name=\"SlashSpectrum\" xml:space=\"preserve\">\n    <value>Spectrum</value>\n  </data>\n  <data name=\"SlashHazard\" xml:space=\"preserve\">\n    <value>Hazard</value>\n  </data>\n  <data name=\"SlashInterfacing\" xml:space=\"preserve\">\n    <value>Interfacing</value>\n  </data>\n  <data name=\"SlashRamp\" xml:space=\"preserve\">\n    <value>Ramp</value>\n  </data>\n  <data name=\"SlashGameOver\" xml:space=\"preserve\">\n    <value>Game Over</value>\n  </data>\n  <data name=\"SlashStart\" xml:space=\"preserve\">\n    <value>Start</value>\n  </data>\n  <data name=\"SlashBuzzer\" xml:space=\"preserve\">\n    <value>Buzzer</value>\n  </data>\n  <data name=\"SlashStatic\" xml:space=\"preserve\">\n    <value>Statico</value>\n  </data>\n  <data name=\"SlashBatteryLevel\" xml:space=\"preserve\">\n    <value>Livello Batteria</value>\n  </data>\n  <data name=\"IntervalOff\" xml:space=\"preserve\">\n    <value>Interval Off</value>\n  </data>\n  <data name=\"IntervalSeconds\" xml:space=\"preserve\">\n    <value>Intervallo {0}s</value>\n  </data>\n  <data name=\"DisableDynamicLighting\" xml:space=\"preserve\">\n    <value>Per favore disabilita Windows &gt; Illuminazione Dinamica</value>\n  </data>\n  <data name=\"AmbientModeResources\" xml:space=\"preserve\">\n    <value>La modalità Ambient può aumentare l'utilizzo delle risorse</value>\n  </data>\n  <data name=\"MouseMotionSync\" xml:space=\"preserve\">\n    <value>Motion Sync</value>\n  </data>\n  <data name=\"MouseZoneMode\" xml:space=\"preserve\">\n    <value>Zone Mode</value>\n  </data>\n</root>"
  },
  {
    "path": "app/Properties/Strings.ja.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" id=\"root\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\"/>\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"name\" type=\"xsd:string\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\"/>\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Acceleration\" xml:space=\"preserve\">\n    <value>Acceleration</value>\n  </data>\n  <data name=\"ACPIError\" xml:space=\"preserve\">\n    <value>ASUS ACPIに接続できません。 Asus System Control Interfaceをインストールしてください</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestart\" xml:space=\"preserve\">\n    <value>変更を適用するにはデバイスを再起動してください</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestartTitle\" xml:space=\"preserve\">\n    <value>再起動しますか？</value>\n  </data>\n  <data name=\"AlertDGPU\" xml:space=\"preserve\">\n    <value>GPUが大量に使用されているようです。無効にしますか？</value>\n  </data>\n  <data name=\"AlertDGPUTitle\" xml:space=\"preserve\">\n    <value>エコモード</value>\n  </data>\n  <data name=\"AlertUltimateOff\" xml:space=\"preserve\">\n    <value>Ultimate モードをオフにするには再起動が必要です</value>\n  </data>\n  <data name=\"AlertUltimateOn\" xml:space=\"preserve\">\n    <value>Ultimate モードには再起動が必要です</value>\n  </data>\n  <data name=\"AlertUltimateTitle\" xml:space=\"preserve\">\n    <value>今すぐ再起動？</value>\n  </data>\n  <data name=\"AllyController\" xml:space=\"preserve\">\n    <value>Allyコントローラ</value>\n  </data>\n  <data name=\"AnimationSpeed\" xml:space=\"preserve\">\n    <value>アニメーション速度</value>\n  </data>\n  <data name=\"AnimeMatrix\" xml:space=\"preserve\">\n    <value>AniMe Matrix</value>\n  </data>\n  <data name=\"AppAlreadyRunning\" xml:space=\"preserve\">\n    <value>アプリは既に実行中です</value>\n  </data>\n  <data name=\"AppAlreadyRunningText\" xml:space=\"preserve\">\n    <value>G-Helperは既に実行されています。システムトレイのアイコンをチェックしてください。</value>\n  </data>\n  <data name=\"Apply\" xml:space=\"preserve\">\n    <value>適用</value>\n  </data>\n  <data name=\"ApplyFanCurve\" xml:space=\"preserve\">\n    <value>カスタムファンカーブの適用</value>\n  </data>\n  <data name=\"ApplyPowerLimits\" xml:space=\"preserve\">\n    <value>電力制限を適用する</value>\n  </data>\n  <data name=\"ApplyWindowsPowerPlan\" xml:space=\"preserve\">\n    <value>Windows電源モードを自動調整</value>\n  </data>\n  <data name=\"APUMemory\" xml:space=\"preserve\">\n    <value>GPUに割り当てられたメモリ</value>\n  </data>\n  <data name=\"AsusServicesRunning\" xml:space=\"preserve\">\n    <value>Asusサービスを実行中</value>\n  </data>\n  <data name=\"AuraBatteryState\" xml:space=\"preserve\">\n    <value>バッテリーの状態</value>\n  </data>\n  <data name=\"AuraBreathe\" xml:space=\"preserve\">\n    <value>呼吸</value>\n  </data>\n  <data name=\"AuraClockwise\" xml:space=\"preserve\">\n    <value>時計回り</value>\n  </data>\n  <data name=\"AuraColorCycle\" xml:space=\"preserve\">\n    <value>カラーサイクル</value>\n  </data>\n  <data name=\"AuraComet\" xml:space=\"preserve\">\n    <value>コメット</value>\n  </data>\n  <data name=\"AuraCounterClockwise\" xml:space=\"preserve\">\n    <value>反時計回り</value>\n  </data>\n  <data name=\"AuraFast\" xml:space=\"preserve\">\n    <value>高速</value>\n  </data>\n  <data name=\"AuraLightingMode\" xml:space=\"preserve\">\n    <value>照明モード</value>\n  </data>\n  <data name=\"AuraNormal\" xml:space=\"preserve\">\n    <value>普通</value>\n  </data>\n  <data name=\"AuraRainbow\" xml:space=\"preserve\">\n    <value>虹</value>\n  </data>\n  <data name=\"AuraRandomColor\" xml:space=\"preserve\">\n    <value>ランダム</value>\n  </data>\n  <data name=\"AuraReact\" xml:space=\"preserve\">\n    <value>リアクト</value>\n  </data>\n  <data name=\"AuraSlow\" xml:space=\"preserve\">\n    <value>低速</value>\n  </data>\n  <data name=\"AuraStatic\" xml:space=\"preserve\">\n    <value>固定</value>\n  </data>\n  <data name=\"AuraStrobe\" xml:space=\"preserve\">\n    <value>ストロボ</value>\n  </data>\n  <data name=\"AuraZoneAll\" xml:space=\"preserve\">\n    <value>全て</value>\n  </data>\n  <data name=\"AuraZoneDock\" xml:space=\"preserve\">\n    <value>ドック</value>\n  </data>\n  <data name=\"AuraZoneLogo\" xml:space=\"preserve\">\n    <value>ロゴ</value>\n  </data>\n  <data name=\"AuraZoneScroll\" xml:space=\"preserve\">\n    <value>Scrollwheel</value>\n  </data>\n  <data name=\"AuraZoneUnderglow\" xml:space=\"preserve\">\n    <value>アンダーグロー</value>\n  </data>\n  <data name=\"AutoApply\" xml:space=\"preserve\">\n    <value>自動的に適用</value>\n  </data>\n  <data name=\"AutoMode\" xml:space=\"preserve\">\n    <value>自動</value>\n  </data>\n  <data name=\"AutoRefreshTooltip\" xml:space=\"preserve\">\n    <value>電源接続時にバッテリーを節約するために60Hzを設定する</value>\n  </data>\n  <data name=\"Awake\" xml:space=\"preserve\">\n    <value>起動中</value>\n  </data>\n  <data name=\"BacklightLow\" xml:space=\"preserve\">\n    <value>Low</value>\n  </data>\n  <data name=\"BacklightMax\" xml:space=\"preserve\">\n    <value>Max</value>\n  </data>\n  <data name=\"BacklightMid\" xml:space=\"preserve\">\n    <value>Mid</value>\n  </data>\n  <data name=\"BacklightOff\" xml:space=\"preserve\">\n    <value>オフ</value>\n  </data>\n  <data name=\"BacklightTimeout\" xml:space=\"preserve\">\n    <value>バッテリー / 接続時間 (0 - ON)</value>\n  </data>\n  <data name=\"BacklightTimeoutBattery\" xml:space=\"preserve\">\n    <value>バッテリー時のバックライトタイムアウト</value>\n  </data>\n  <data name=\"BacklightTimeoutPlugged\" xml:space=\"preserve\">\n    <value>電源接続時のバックライトのタイムアウト</value>\n  </data>\n  <data name=\"Balanced\" xml:space=\"preserve\">\n    <value>バランス</value>\n  </data>\n  <data name=\"BatteryCharge\" xml:space=\"preserve\">\n    <value>充電</value>\n  </data>\n  <data name=\"BatteryChargeLimit\" xml:space=\"preserve\">\n    <value>バッテリー充電制限</value>\n  </data>\n  <data name=\"BatteryHealth\" xml:space=\"preserve\">\n    <value>バッテリー健康度</value>\n  </data>\n  <data name=\"BatteryLimitFull\" xml:space=\"preserve\">\n    <value>100%までの一回限りの充電</value>\n  </data>\n  <data name=\"Binding\" xml:space=\"preserve\">\n    <value>Binding</value>\n  </data>\n  <data name=\"BindingPrimary\" xml:space=\"preserve\">\n    <value>Primary</value>\n  </data>\n  <data name=\"BindingSecondary\" xml:space=\"preserve\">\n    <value>Secondary</value>\n  </data>\n  <data name=\"BiosAndDriverUpdates\" xml:space=\"preserve\">\n    <value>BIOS とドライバの更新</value>\n  </data>\n  <data name=\"Boot\" xml:space=\"preserve\">\n    <value>ブート</value>\n  </data>\n  <data name=\"BootSound\" xml:space=\"preserve\">\n    <value>起動音</value>\n  </data>\n  <data name=\"Brightness\" xml:space=\"preserve\">\n    <value>明るさ</value>\n  </data>\n  <data name=\"BrightnessDown\" xml:space=\"preserve\">\n    <value>明るさダウン</value>\n  </data>\n  <data name=\"BrightnessUp\" xml:space=\"preserve\">\n    <value>明るさを上げる</value>\n  </data>\n  <data name=\"BWTrayIcon\" xml:space=\"preserve\">\n    <value>白黒トレイアイコン</value>\n  </data>\n  <data name=\"Calibrate\" xml:space=\"preserve\">\n    <value>キャリブレーション</value>\n  </data>\n  <data name=\"Charging\" xml:space=\"preserve\">\n    <value>充電中</value>\n  </data>\n  <data name=\"Color\" xml:space=\"preserve\">\n    <value>カラー</value>\n  </data>\n  <data name=\"Contrast\" xml:space=\"preserve\">\n    <value>コントラスト</value>\n  </data>\n  <data name=\"Controller\" xml:space=\"preserve\">\n    <value>コントローラー</value>\n  </data>\n  <data name=\"CPUBoost\" xml:space=\"preserve\">\n    <value>CPUブースト</value>\n  </data>\n  <data name=\"Custom\" xml:space=\"preserve\">\n    <value>カスタム</value>\n  </data>\n  <data name=\"Deceleration\" xml:space=\"preserve\">\n    <value>Deceleration</value>\n  </data>\n  <data name=\"Default\" xml:space=\"preserve\">\n    <value>既定</value>\n  </data>\n  <data name=\"DisableController\" xml:space=\"preserve\">\n    <value>コントローラーを無効化</value>\n  </data>\n  <data name=\"DisableOnLidClose\" xml:space=\"preserve\">\n    <value>フタを閉じた時に無効化</value>\n  </data>\n  <data name=\"DisableOverdrive\" xml:space=\"preserve\">\n    <value>スクリーンオーバードライブを無効にする</value>\n  </data>\n  <data name=\"Discharging\" xml:space=\"preserve\">\n    <value>放電中</value>\n  </data>\n  <data name=\"DownloadColorProfiles\" xml:space=\"preserve\">\n    <value>カラープロファイルをダウンロード</value>\n  </data>\n  <data name=\"DownloadUpdate\" xml:space=\"preserve\">\n    <value>ダウンロード</value>\n  </data>\n  <data name=\"DriverAndSoftware\" xml:space=\"preserve\">\n    <value>ドライバとソフトウェア</value>\n  </data>\n  <data name=\"EcoGPUTooltip\" xml:space=\"preserve\">\n    <value>バッテリー節約のためにdGPUを無効にします</value>\n  </data>\n  <data name=\"EcoMode\" xml:space=\"preserve\">\n    <value>エコ</value>\n  </data>\n  <data name=\"EnableGPUOnShutdown\" xml:space=\"preserve\">\n    <value>シャットダウン時にGPUを有効にする (エコモードでの問題を防ぐ)</value>\n  </data>\n  <data name=\"EnableOptimusText\" xml:space=\"preserve\">\n    <value>NVIDIA Control Panel の ディスプレイモード が Optimus に設定されていない場合、エコモードに入って dGPU を無効にすると、次回再起動するまで明るさコントロールに問題が生じる可能性があります。 \n\n続行しますか？</value>\n  </data>\n  <data name=\"EnableOptimusTitle\" xml:space=\"preserve\">\n    <value>NVIDIA ディスプレイモードが Optimus に設定されていません</value>\n  </data>\n  <data name=\"EnergySettings\" xml:space=\"preserve\">\n    <value>エネルギー設定</value>\n  </data>\n  <data name=\"Export\" xml:space=\"preserve\">\n    <value>プロファイルをエクスポート</value>\n  </data>\n  <data name=\"Extra\" xml:space=\"preserve\">\n    <value>その他</value>\n  </data>\n  <data name=\"ExtraSettings\" xml:space=\"preserve\">\n    <value>その他の設定</value>\n  </data>\n  <data name=\"FactoryDefaults\" xml:space=\"preserve\">\n    <value>出荷時のデフォルト設定</value>\n  </data>\n  <data name=\"FanCurves\" xml:space=\"preserve\">\n    <value>ファンカーブ</value>\n  </data>\n  <data name=\"FanProfileCPU\" xml:space=\"preserve\">\n    <value>CPUファンプロファイル</value>\n  </data>\n  <data name=\"FanProfileGPU\" xml:space=\"preserve\">\n    <value>GPU ファンプロファイル</value>\n  </data>\n  <data name=\"FanProfileMid\" xml:space=\"preserve\">\n    <value>ミッドファンプロファイル</value>\n  </data>\n  <data name=\"FanProfiles\" xml:space=\"preserve\">\n    <value>ファンプロファイル</value>\n  </data>\n  <data name=\"FansAndPower\" xml:space=\"preserve\">\n    <value>ファンとパワー</value>\n  </data>\n  <data name=\"FanSpeed\" xml:space=\"preserve\">\n    <value>ファン</value>\n  </data>\n  <data name=\"FansPower\" xml:space=\"preserve\">\n    <value>ファン + パワー</value>\n  </data>\n  <data name=\"FlickerFreeDimming\" xml:space=\"preserve\">\n    <value>フリッカーフリー調光</value>\n  </data>\n  <data name=\"FnLock\" xml:space=\"preserve\">\n    <value>FnなしでFn+Fホットキーを処理</value>\n  </data>\n  <data name=\"FnLockOff\" xml:space=\"preserve\">\n    <value>FNロック オフ</value>\n  </data>\n  <data name=\"FnLockOn\" xml:space=\"preserve\">\n    <value>FNロック オン</value>\n  </data>\n  <data name=\"GPUBoost\" xml:space=\"preserve\">\n    <value>Dynamic Boost</value>\n  </data>\n  <data name=\"GPUChanging\" xml:space=\"preserve\">\n    <value>Changing</value>\n  </data>\n  <data name=\"GPUCoreClockOffset\" xml:space=\"preserve\">\n    <value>コアクロックオフセット</value>\n  </data>\n  <data name=\"GPUMemoryClockOffset\" xml:space=\"preserve\">\n    <value>メモリクロックオフセット</value>\n  </data>\n  <data name=\"GPUMode\" xml:space=\"preserve\">\n    <value>GPUモード</value>\n  </data>\n  <data name=\"GPUModeEco\" xml:space=\"preserve\">\n    <value>iGPU のみ</value>\n  </data>\n  <data name=\"GPUModeStandard\" xml:space=\"preserve\">\n    <value>iGPU + dGPU</value>\n  </data>\n  <data name=\"GPUModeUltimate\" xml:space=\"preserve\">\n    <value>dGPU 専用</value>\n  </data>\n  <data name=\"GPUPower\" xml:space=\"preserve\">\n    <value>GPU電力</value>\n  </data>\n  <data name=\"GPUSettings\" xml:space=\"preserve\">\n    <value>GPU設定</value>\n  </data>\n  <data name=\"GPUTempTarget\" xml:space=\"preserve\">\n    <value>温度ターゲット</value>\n  </data>\n  <data name=\"HibernateAfter\" xml:space=\"preserve\">\n    <value>スリープ時にバッテリーを停止するまでの時間 (0 - OFF)</value>\n  </data>\n  <data name=\"High\" xml:space=\"preserve\">\n    <value>High</value>\n  </data>\n  <data name=\"ImageRotation\" xml:space=\"preserve\">\n    <value>画像の回転</value>\n  </data>\n  <data name=\"Import\" xml:space=\"preserve\">\n    <value>プロファイルをインポート</value>\n  </data>\n  <data name=\"KeyBindings\" xml:space=\"preserve\">\n    <value>キー割り当て</value>\n  </data>\n  <data name=\"Keyboard\" xml:space=\"preserve\">\n    <value>キーボード</value>\n  </data>\n  <data name=\"KillGpuApps\" xml:space=\"preserve\">\n    <value>エコに切り替えるときにGPUを使用しているすべてのアプリを停止します</value>\n  </data>\n  <data name=\"LaptopBacklight\" xml:space=\"preserve\">\n    <value>ラップトップのバックライト</value>\n  </data>\n  <data name=\"LaptopKeyboard\" xml:space=\"preserve\">\n    <value>ラップトップキーボード</value>\n  </data>\n  <data name=\"LaptopScreen\" xml:space=\"preserve\">\n    <value>ラップトップ画面</value>\n  </data>\n  <data name=\"LEDStatusIndicators\" xml:space=\"preserve\">\n    <value>LEDステータス表示</value>\n  </data>\n  <data name=\"Lid\" xml:space=\"preserve\">\n    <value>フタ</value>\n  </data>\n  <data name=\"Lightbar\" xml:space=\"preserve\">\n    <value>ライトバー</value>\n  </data>\n  <data name=\"Lighting\" xml:space=\"preserve\">\n    <value>ライティング</value>\n  </data>\n  <data name=\"LockScreen\" xml:space=\"preserve\">\n    <value>ロック画面</value>\n  </data>\n  <data name=\"Logo\" xml:space=\"preserve\">\n    <value>ロゴ</value>\n  </data>\n  <data name=\"Low\" xml:space=\"preserve\">\n    <value>Low</value>\n  </data>\n  <data name=\"LSDeadzones\" xml:space=\"preserve\">\n    <value>左スティックデッドゾーン</value>\n  </data>\n  <data name=\"LTDeadzones\" xml:space=\"preserve\">\n    <value>左トリガーデッドゾーン</value>\n  </data>\n  <data name=\"MatrixAudio\" xml:space=\"preserve\">\n    <value>オーディオビジュアライザー</value>\n  </data>\n  <data name=\"MatrixBanner\" xml:space=\"preserve\">\n    <value>Binary Banner</value>\n  </data>\n  <data name=\"MatrixBright\" xml:space=\"preserve\">\n    <value>明度調整</value>\n  </data>\n  <data name=\"MatrixClock\" xml:space=\"preserve\">\n    <value>時計</value>\n  </data>\n  <data name=\"MatrixDim\" xml:space=\"preserve\">\n    <value>Dim</value>\n  </data>\n  <data name=\"MatrixLogo\" xml:space=\"preserve\">\n    <value>Rog ロゴ</value>\n  </data>\n  <data name=\"MatrixMedium\" xml:space=\"preserve\">\n    <value>Medium</value>\n  </data>\n  <data name=\"MatrixOff\" xml:space=\"preserve\">\n    <value>オフ</value>\n  </data>\n  <data name=\"MatrixPicture\" xml:space=\"preserve\">\n    <value>画像</value>\n  </data>\n  <data name=\"MaxRefreshTooltip\" xml:space=\"preserve\">\n    <value>最大リフレッシュレートで低遅延を実現</value>\n  </data>\n  <data name=\"MinRefreshTooltip\" xml:space=\"preserve\">\n    <value>バッテリーを節約するために60Hzのリフレッシュレートを使用</value>\n  </data>\n  <data name=\"Minute\" xml:space=\"preserve\">\n    <value>Minute</value>\n  </data>\n  <data name=\"Minutes\" xml:space=\"preserve\">\n    <value>Minutes</value>\n  </data>\n  <data name=\"MouseAngleSnapping\" xml:space=\"preserve\">\n    <value>Angle Snapping / Tuning</value>\n  </data>\n  <data name=\"MouseAutoPowerOff\" xml:space=\"preserve\">\n    <value>自動電源オフ</value>\n  </data>\n  <data name=\"MouseButtonResponse\" xml:space=\"preserve\">\n    <value>ボタンの応答</value>\n  </data>\n  <data name=\"MouseImportFailed\" xml:space=\"preserve\">\n    <value>インポートに失敗しました。選択したファイルは有効なマウスプロファイルではないか、壊れています。</value>\n  </data>\n  <data name=\"MouseLiftOffDistance\" xml:space=\"preserve\">\n    <value>持ち上げ距離</value>\n  </data>\n  <data name=\"MouseLowBatteryWarning\" xml:space=\"preserve\">\n    <value>バッテリー残量低下警告</value>\n  </data>\n  <data name=\"MousePerformance\" xml:space=\"preserve\">\n    <value>パフォーマンス</value>\n  </data>\n  <data name=\"MouseSynchronize\" xml:space=\"preserve\">\n    <value>マウスと同期</value>\n  </data>\n  <data name=\"Multizone\" xml:space=\"preserve\">\n    <value>Multi Zone</value>\n  </data>\n  <data name=\"MultizoneStrong\" xml:space=\"preserve\">\n    <value>Multi Zone Strong</value>\n  </data>\n  <data name=\"Muted\" xml:space=\"preserve\">\n    <value>ミュート</value>\n  </data>\n  <data name=\"MuteMic\" xml:space=\"preserve\">\n    <value>マイクをミュートする</value>\n  </data>\n  <data name=\"Never\" xml:space=\"preserve\">\n    <value>なし</value>\n  </data>\n  <data name=\"NewUpdates\" xml:space=\"preserve\">\n    <value>新しい更新</value>\n  </data>\n  <data name=\"NoNewUpdates\" xml:space=\"preserve\">\n    <value>アップデートはありません</value>\n  </data>\n  <data name=\"NotConnected\" xml:space=\"preserve\">\n    <value>未接続</value>\n  </data>\n  <data name=\"Off\" xml:space=\"preserve\">\n    <value>オフ</value>\n  </data>\n  <data name=\"On\" xml:space=\"preserve\">\n    <value>オン</value>\n  </data>\n  <data name=\"OneZone\" xml:space=\"preserve\">\n    <value>1つのゾーン</value>\n  </data>\n  <data name=\"OpenGHelper\" xml:space=\"preserve\">\n    <value>G-Helperウィンドウを開く</value>\n  </data>\n  <data name=\"Optimized\" xml:space=\"preserve\">\n    <value>最適化</value>\n  </data>\n  <data name=\"OptimizedGPUTooltip\" xml:space=\"preserve\">\n    <value>Switch to Eco on battery and to Standard when plugged in</value>\n  </data>\n  <data name=\"OptimizedUSBC\" xml:space=\"preserve\">\n    <value>最適化モードでUSB-C充電器でGPUを無効にする</value>\n  </data>\n  <data name=\"Other\" xml:space=\"preserve\">\n    <value>その他</value>\n  </data>\n  <data name=\"Overdrive\" xml:space=\"preserve\">\n    <value>オーバードライブ</value>\n  </data>\n  <data name=\"PerformanceMode\" xml:space=\"preserve\">\n    <value>モード</value>\n  </data>\n  <data name=\"Peripherals\" xml:space=\"preserve\">\n    <value>周辺機器</value>\n  </data>\n  <data name=\"PictureGif\" xml:space=\"preserve\">\n    <value>画像 / Gif</value>\n  </data>\n  <data name=\"PlayPause\" xml:space=\"preserve\">\n    <value>再生 / 一時停止</value>\n  </data>\n  <data name=\"PollingRate\" xml:space=\"preserve\">\n    <value>ポーリング レート</value>\n  </data>\n  <data name=\"PowerLimits\" xml:space=\"preserve\">\n    <value>電力制限</value>\n  </data>\n  <data name=\"PPTExperimental\" xml:space=\"preserve\">\n    <value>電力制限は実験的な機能です。慎重に、ご自身の責任において使用してください！</value>\n  </data>\n  <data name=\"PrintScreen\" xml:space=\"preserve\">\n    <value>PrintScreen</value>\n  </data>\n  <data name=\"Profile\" xml:space=\"preserve\">\n    <value>プロファイル</value>\n  </data>\n  <data name=\"Quit\" xml:space=\"preserve\">\n    <value>終了</value>\n  </data>\n  <data name=\"Reset\" xml:space=\"preserve\">\n    <value>リセット</value>\n  </data>\n  <data name=\"RestartGPU\" xml:space=\"preserve\">\n    <value>何らかの問題が dGPU を使用しており、エコモードを防止しています。G-Helper をデバイスマネージャーで dGPU を再起動させてください。(自己責任で進んでください)</value>\n  </data>\n  <data name=\"RPM\" xml:space=\"preserve\">\n    <value>RPM</value>\n  </data>\n  <data name=\"RSDeadzones\" xml:space=\"preserve\">\n    <value>右スティックのデッドゾーン</value>\n  </data>\n  <data name=\"RTDeadzones\" xml:space=\"preserve\">\n    <value>右トリガーデッドゾーン</value>\n  </data>\n  <data name=\"RunOnStartup\" xml:space=\"preserve\">\n    <value>起動時に実行する</value>\n  </data>\n  <data name=\"ScalingQuality\" xml:space=\"preserve\">\n    <value>スケーリング品質</value>\n  </data>\n  <data name=\"ScreenPadDown\" xml:space=\"preserve\">\n    <value>画面の明るさダウン</value>\n  </data>\n  <data name=\"ScreenPadUp\" xml:space=\"preserve\">\n    <value>画面の明るさを上げる</value>\n  </data>\n  <data name=\"Shutdown\" xml:space=\"preserve\">\n    <value>シャットダウン</value>\n  </data>\n  <data name=\"Silent\" xml:space=\"preserve\">\n    <value>サイレント</value>\n  </data>\n  <data name=\"Sleep\" xml:space=\"preserve\">\n    <value>スリープ</value>\n  </data>\n  <data name=\"StandardGPUTooltip\" xml:space=\"preserve\">\n    <value>標準的な使用のために dGPU を有効にします</value>\n  </data>\n  <data name=\"StandardMode\" xml:space=\"preserve\">\n    <value>標準</value>\n  </data>\n  <data name=\"Start\" xml:space=\"preserve\">\n    <value>スタート</value>\n  </data>\n  <data name=\"StartingServices\" xml:space=\"preserve\">\n    <value>サービスを開始</value>\n  </data>\n  <data name=\"StartupError\" xml:space=\"preserve\">\n    <value>起動エラー</value>\n  </data>\n  <data name=\"Stop\" xml:space=\"preserve\">\n    <value>ストップ</value>\n  </data>\n  <data name=\"StopGPUApps\" xml:space=\"preserve\">\n    <value>GPU アプリケーションを停止</value>\n  </data>\n  <data name=\"StoppingServices\" xml:space=\"preserve\">\n    <value>サービスの停止中</value>\n  </data>\n  <data name=\"ToggleAura\" xml:space=\"preserve\">\n    <value>Auraを切り替える</value>\n  </data>\n  <data name=\"ToggleClamshellMode\" xml:space=\"preserve\">\n    <value>クランシェルモードの自動切り替え</value>\n  </data>\n  <data name=\"ToggleFnLock\" xml:space=\"preserve\">\n    <value>Fn-Lockを切り替える</value>\n  </data>\n  <data name=\"ToggleMiniled\" xml:space=\"preserve\">\n    <value>Toggle Miniled (if supported)</value>\n  </data>\n  <data name=\"ToggleScreen\" xml:space=\"preserve\">\n    <value>画面を切り替える</value>\n  </data>\n  <data name=\"ToggleTouchscreen\" xml:space=\"preserve\">\n    <value>タッチスクリーンの切り替え</value>\n  </data>\n  <data name=\"Touchscreen\" xml:space=\"preserve\">\n    <value>タッチスクリーン</value>\n  </data>\n  <data name=\"Turbo\" xml:space=\"preserve\">\n    <value>ターボ</value>\n  </data>\n  <data name=\"TurnedOff\" xml:space=\"preserve\">\n    <value>無効</value>\n  </data>\n  <data name=\"TurnOffOnBattery\" xml:space=\"preserve\">\n    <value>バッテリーを無効にする</value>\n  </data>\n  <data name=\"UltimateGPUTooltip\" xml:space=\"preserve\">\n    <value>ラップトップ画面をdGPUにルーティングし、FPSを最大化</value>\n  </data>\n  <data name=\"UltimateMode\" xml:space=\"preserve\">\n    <value>Ultimate</value>\n  </data>\n  <data name=\"UndervoltingRisky\" xml:space=\"preserve\">\n    <value>アンダーボルトは、実験的で危険な機能です。 適用される値がハードウェアに低すぎると、不安定になったり、シャットダウンしたり、データが破損したりする可能性があります。 試してみたい場合 - 最初に小さい値から始めて、適用をクリックして、何があなたに役立つかをテストします。</value>\n  </data>\n  <data name=\"Unmuted\" xml:space=\"preserve\">\n    <value>ミュート解除</value>\n  </data>\n  <data name=\"Updates\" xml:space=\"preserve\">\n    <value>アップデート</value>\n  </data>\n  <data name=\"VersionLabel\" xml:space=\"preserve\">\n    <value>バージョン</value>\n  </data>\n  <data name=\"VibrationStrength\" xml:space=\"preserve\">\n    <value>振動の強さ</value>\n  </data>\n  <data name=\"VisualMode\" xml:space=\"preserve\">\n    <value>ビジュアルモード</value>\n  </data>\n  <data name=\"VisualModesHDR\" xml:space=\"preserve\">\n    <value>HDRがアクティブな場合、ビジュアルモードは利用できません</value>\n  </data>\n  <data name=\"VisualModesScreen\" xml:space=\"preserve\">\n    <value>ラップトップ画面がオフの場合、ビジュアルモードは使用できません</value>\n  </data>\n  <data name=\"VolumeDown\" xml:space=\"preserve\">\n    <value>音量ダウン</value>\n  </data>\n  <data name=\"VolumeMute\" xml:space=\"preserve\">\n    <value>音量ミュート</value>\n  </data>\n  <data name=\"VolumeUp\" xml:space=\"preserve\">\n    <value>音量アップ</value>\n  </data>\n  <data name=\"WindowTop\" xml:space=\"preserve\">\n    <value>アプリのウィンドウを常にトップに表示する</value>\n  </data>\n  <data name=\"Zoom\" xml:space=\"preserve\">\n    <value>ズーム</value>\n  </data>\n  <data name=\"Donate\" xml:space=\"preserve\">\n    <value>寄付</value>\n  </data>\n  <data name=\"Legend\" xml:space=\"preserve\">\n    <value>凡例</value>\n  </data>\n  <data name=\"LegendGray\" xml:space=\"preserve\">\n    <value>ローカルバージョンを確認できません</value>\n    <comment>Can't check local version</comment>\n  </data>\n  <data name=\"LegendRed\" xml:space=\"preserve\">\n    <value>アップデートが利用できます</value>\n    <comment>Update Available</comment>\n  </data>\n  <data name=\"LegendGreen\" xml:space=\"preserve\">\n    <value>更新</value>\n    <comment>Updated</comment>\n  </data>\n  <data name=\"SlashBounce\" xml:space=\"preserve\">\n    <value>Bounce</value>\n  </data>\n  <data name=\"SlashMode\" xml:space=\"preserve\">\n    <value>Slash</value>\n  </data>\n  <data name=\"SlashLoading\" xml:space=\"preserve\">\n    <value>Loading</value>\n  </data>\n  <data name=\"SlashBitStream\" xml:space=\"preserve\">\n    <value>Bit Stream</value>\n  </data>\n  <data name=\"SlashTransmission\" xml:space=\"preserve\">\n    <value>Transmission</value>\n  </data>\n  <data name=\"SlashFlow\" xml:space=\"preserve\">\n    <value>Flow</value>\n  </data>\n  <data name=\"SlashFlux\" xml:space=\"preserve\">\n    <value>Flux</value>\n  </data>\n  <data name=\"SlashPhantom\" xml:space=\"preserve\">\n    <value>Phantom</value>\n  </data>\n  <data name=\"SlashSpectrum\" xml:space=\"preserve\">\n    <value>Spectrum</value>\n  </data>\n  <data name=\"SlashHazard\" xml:space=\"preserve\">\n    <value>Hazard</value>\n  </data>\n  <data name=\"SlashInterfacing\" xml:space=\"preserve\">\n    <value>Interfacing</value>\n  </data>\n  <data name=\"SlashRamp\" xml:space=\"preserve\">\n    <value>Ramp</value>\n  </data>\n  <data name=\"SlashGameOver\" xml:space=\"preserve\">\n    <value>Game Over</value>\n  </data>\n  <data name=\"SlashStart\" xml:space=\"preserve\">\n    <value>Start</value>\n  </data>\n  <data name=\"SlashBuzzer\" xml:space=\"preserve\">\n    <value>Buzzer</value>\n  </data>\n  <data name=\"SlashStatic\" xml:space=\"preserve\">\n    <value>Static</value>\n  </data>\n  <data name=\"SlashBatteryLevel\" xml:space=\"preserve\">\n    <value>バッテリー残量</value>\n  </data>\n  <data name=\"IntervalOff\" xml:space=\"preserve\">\n    <value>インターバルオフ</value>\n  </data>\n  <data name=\"IntervalSeconds\" xml:space=\"preserve\">\n    <value>間隔 {0}秒</value>\n  </data>\n  <data name=\"DisableDynamicLighting\" xml:space=\"preserve\">\n    <value>Windows &gt; 動的ライティングを無効にしてください</value>\n  </data>\n  <data name=\"AmbientModeResources\" xml:space=\"preserve\">\n    <value>アンビエントモードはリソース使用量を増加させる可能性があります</value>\n  </data>\n  <data name=\"MouseMotionSync\" xml:space=\"preserve\">\n    <value>モーションシンク</value>\n  </data>\n  <data name=\"MouseZoneMode\" xml:space=\"preserve\">\n    <value>Zoneモード</value>\n  </data>\n</root>"
  },
  {
    "path": "app/Properties/Strings.ko.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" id=\"root\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\"/>\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"name\" type=\"xsd:string\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\"/>\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Acceleration\" xml:space=\"preserve\">\n    <value>가속</value>\n  </data>\n  <data name=\"ACPIError\" xml:space=\"preserve\">\n    <value>ASUS ACPI에 연결할 수 없어 응용 프로그램이 작동하지 않습니다. Asus System Control Interface를 먼저 설치하십시오.</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestart\" xml:space=\"preserve\">\n    <value>변경 사항을 적용하려면 기기를 다시 시작하십시오.</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestartTitle\" xml:space=\"preserve\">\n    <value>지금 다시 시작하시겠습니까?</value>\n  </data>\n  <data name=\"AlertDGPU\" xml:space=\"preserve\">\n    <value>GPU 사용량이 높습니다. 비활성화하시겠습니까?</value>\n  </data>\n  <data name=\"AlertDGPUTitle\" xml:space=\"preserve\">\n    <value>Eco 모드</value>\n  </data>\n  <data name=\"AlertUltimateOff\" xml:space=\"preserve\">\n    <value>Ultimate 모드를 끄기 위해서는 다시 시작해야 합니다.</value>\n  </data>\n  <data name=\"AlertUltimateOn\" xml:space=\"preserve\">\n    <value>Ultimate 모드를 켜기 위해서는 다시 시작해야 합니다.</value>\n  </data>\n  <data name=\"AlertUltimateTitle\" xml:space=\"preserve\">\n    <value>지금 다시 시작하시겠습니까?</value>\n  </data>\n  <data name=\"AllyController\" xml:space=\"preserve\">\n    <value>Ally 컨트롤러</value>\n  </data>\n  <data name=\"AnimationSpeed\" xml:space=\"preserve\">\n    <value>애니메이션 속도</value>\n  </data>\n  <data name=\"AnimeMatrix\" xml:space=\"preserve\">\n    <value>Anime Matrix</value>\n  </data>\n  <data name=\"AppAlreadyRunning\" xml:space=\"preserve\">\n    <value>프로그램이 이미 실행중입니다.</value>\n  </data>\n  <data name=\"AppAlreadyRunningText\" xml:space=\"preserve\">\n    <value>G-Helper가 이미 실행중입니다. 시스템 트레이에서 아이콘을 확인하십시오.</value>\n  </data>\n  <data name=\"Apply\" xml:space=\"preserve\">\n    <value>적용</value>\n  </data>\n  <data name=\"ApplyFanCurve\" xml:space=\"preserve\">\n    <value>사용자 설정 팬 커브 적용</value>\n  </data>\n  <data name=\"ApplyPowerLimits\" xml:space=\"preserve\">\n    <value>전력 제한 적용</value>\n  </data>\n  <data name=\"ApplyWindowsPowerPlan\" xml:space=\"preserve\">\n    <value>윈도우 전원 모드 자동조절</value>\n  </data>\n  <data name=\"APUMemory\" xml:space=\"preserve\">\n    <value>GPU에 할당된 메모리</value>\n  </data>\n  <data name=\"AsusServicesRunning\" xml:space=\"preserve\">\n    <value>실행 중인 Asus 서비스</value>\n  </data>\n  <data name=\"AuraBatteryState\" xml:space=\"preserve\">\n    <value>배터리 상태</value>\n  </data>\n  <data name=\"AuraBreathe\" xml:space=\"preserve\">\n    <value>숨쉬기</value>\n  </data>\n  <data name=\"AuraClockwise\" xml:space=\"preserve\">\n    <value>시계 방향</value>\n  </data>\n  <data name=\"AuraColorCycle\" xml:space=\"preserve\">\n    <value>색 순환</value>\n  </data>\n  <data name=\"AuraComet\" xml:space=\"preserve\">\n    <value>혜성</value>\n  </data>\n  <data name=\"AuraCounterClockwise\" xml:space=\"preserve\">\n    <value>반시계 방향</value>\n  </data>\n  <data name=\"AuraFast\" xml:space=\"preserve\">\n    <value>빠르게</value>\n  </data>\n  <data name=\"AuraLightingMode\" xml:space=\"preserve\">\n    <value>조명 모드</value>\n  </data>\n  <data name=\"AuraNormal\" xml:space=\"preserve\">\n    <value>보통</value>\n  </data>\n  <data name=\"AuraRainbow\" xml:space=\"preserve\">\n    <value>무지개</value>\n  </data>\n  <data name=\"AuraRandomColor\" xml:space=\"preserve\">\n    <value>랜덤</value>\n  </data>\n  <data name=\"AuraReact\" xml:space=\"preserve\">\n    <value>반응</value>\n  </data>\n  <data name=\"AuraSlow\" xml:space=\"preserve\">\n    <value>느리게</value>\n  </data>\n  <data name=\"AuraStatic\" xml:space=\"preserve\">\n    <value>정적</value>\n  </data>\n  <data name=\"AuraStrobe\" xml:space=\"preserve\">\n    <value>섬광</value>\n  </data>\n  <data name=\"AuraZoneAll\" xml:space=\"preserve\">\n    <value>전체</value>\n  </data>\n  <data name=\"AuraZoneDock\" xml:space=\"preserve\">\n    <value>독</value>\n  </data>\n  <data name=\"AuraZoneLogo\" xml:space=\"preserve\">\n    <value>로고</value>\n  </data>\n  <data name=\"AuraZoneScroll\" xml:space=\"preserve\">\n    <value>스크롤 휠</value>\n  </data>\n  <data name=\"AuraZoneUnderglow\" xml:space=\"preserve\">\n    <value>하단 조명</value>\n  </data>\n  <data name=\"AutoApply\" xml:space=\"preserve\">\n    <value>자동 적용</value>\n  </data>\n  <data name=\"AutoMode\" xml:space=\"preserve\">\n    <value>자동</value>\n  </data>\n  <data name=\"AutoRefreshTooltip\" xml:space=\"preserve\">\n    <value>배터리 사용 중에만 60Hz 설정</value>\n  </data>\n  <data name=\"Awake\" xml:space=\"preserve\">\n    <value>활성</value>\n  </data>\n  <data name=\"BacklightLow\" xml:space=\"preserve\">\n    <value>낮음</value>\n  </data>\n  <data name=\"BacklightMax\" xml:space=\"preserve\">\n    <value>최대</value>\n  </data>\n  <data name=\"BacklightMid\" xml:space=\"preserve\">\n    <value>중간</value>\n  </data>\n  <data name=\"BacklightOff\" xml:space=\"preserve\">\n    <value>꺼짐</value>\n  </data>\n  <data name=\"BacklightTimeout\" xml:space=\"preserve\">\n    <value>전원 / 배터리 사용 중 자동 꺼짐 시간 (0 - 항상 켜짐)</value>\n  </data>\n  <data name=\"BacklightTimeoutBattery\" xml:space=\"preserve\">\n    <value>배터리 사용 중 백라이트 자동 꺼짐</value>\n  </data>\n  <data name=\"BacklightTimeoutPlugged\" xml:space=\"preserve\">\n    <value>전원 사용 중 백라이트 자동 꺼짐</value>\n  </data>\n  <data name=\"Balanced\" xml:space=\"preserve\">\n    <value>균형</value>\n  </data>\n  <data name=\"BatteryCharge\" xml:space=\"preserve\">\n    <value>잔량</value>\n  </data>\n  <data name=\"BatteryChargeLimit\" xml:space=\"preserve\">\n    <value>배터리 충전 제한</value>\n  </data>\n  <data name=\"BatteryHealth\" xml:space=\"preserve\">\n    <value>배터리 수명</value>\n  </data>\n  <data name=\"BatteryLimitFull\" xml:space=\"preserve\">\n    <value>이번만 100%까지 충전</value>\n  </data>\n  <data name=\"Binding\" xml:space=\"preserve\">\n    <value>바인딩</value>\n  </data>\n  <data name=\"BindingPrimary\" xml:space=\"preserve\">\n    <value>Primary</value>\n  </data>\n  <data name=\"BindingSecondary\" xml:space=\"preserve\">\n    <value>Secondary</value>\n  </data>\n  <data name=\"BiosAndDriverUpdates\" xml:space=\"preserve\">\n    <value>바이오스/드라이버 업데이트</value>\n  </data>\n  <data name=\"Boot\" xml:space=\"preserve\">\n    <value>부팅</value>\n  </data>\n  <data name=\"BootSound\" xml:space=\"preserve\">\n    <value>부팅 사운드</value>\n  </data>\n  <data name=\"Brightness\" xml:space=\"preserve\">\n    <value>밝기</value>\n  </data>\n  <data name=\"BrightnessDown\" xml:space=\"preserve\">\n    <value>밝기 감소</value>\n  </data>\n  <data name=\"BrightnessUp\" xml:space=\"preserve\">\n    <value>밝기 증가</value>\n  </data>\n  <data name=\"BWTrayIcon\" xml:space=\"preserve\">\n    <value>흑백 트레이 아이콘</value>\n  </data>\n  <data name=\"Calibrate\" xml:space=\"preserve\">\n    <value>보정</value>\n  </data>\n  <data name=\"Charging\" xml:space=\"preserve\">\n    <value>충전 중</value>\n  </data>\n  <data name=\"Color\" xml:space=\"preserve\">\n    <value>색상</value>\n  </data>\n  <data name=\"Contrast\" xml:space=\"preserve\">\n    <value>대비</value>\n  </data>\n  <data name=\"Controller\" xml:space=\"preserve\">\n    <value>컨트롤러</value>\n  </data>\n  <data name=\"CPUBoost\" xml:space=\"preserve\">\n    <value>CPU 부스트</value>\n  </data>\n  <data name=\"Custom\" xml:space=\"preserve\">\n    <value>사용자 설정</value>\n  </data>\n  <data name=\"Deceleration\" xml:space=\"preserve\">\n    <value>감속</value>\n  </data>\n  <data name=\"Default\" xml:space=\"preserve\">\n    <value>기본</value>\n  </data>\n  <data name=\"DisableController\" xml:space=\"preserve\">\n    <value>컨트롤러 비활성화</value>\n  </data>\n  <data name=\"DisableOnLidClose\" xml:space=\"preserve\">\n    <value>덮개를 닫을 시 비활성화</value>\n  </data>\n  <data name=\"DisableOverdrive\" xml:space=\"preserve\">\n    <value>화면 OD 끄기</value>\n  </data>\n  <data name=\"Discharging\" xml:space=\"preserve\">\n    <value>방전 중</value>\n  </data>\n  <data name=\"DownloadColorProfiles\" xml:space=\"preserve\">\n    <value>색상 프로필 다운로드</value>\n  </data>\n  <data name=\"DownloadUpdate\" xml:space=\"preserve\">\n    <value>다운로드</value>\n  </data>\n  <data name=\"DriverAndSoftware\" xml:space=\"preserve\">\n    <value>드라이버와 소프트웨어</value>\n  </data>\n  <data name=\"EcoGPUTooltip\" xml:space=\"preserve\">\n    <value>배터리 절약을 위해 dGPU 비활성화</value>\n  </data>\n  <data name=\"EcoMode\" xml:space=\"preserve\">\n    <value>Eco</value>\n  </data>\n  <data name=\"EnableGPUOnShutdown\" xml:space=\"preserve\">\n    <value>종료 시 GPU 활성화 (Eco 모드 문제 방지)</value>\n  </data>\n  <data name=\"EnableOptimusText\" xml:space=\"preserve\">\n    <value>NVIDIA 제어판에서 디스플레이 모드가 Optimus로 설정되지 않은 상태에서 Eco 모드로 전환하여 dGPU를 비활성화하면 다시 시작하기 전까지 밝기 조절에 문제가 발생할 수 있습니다.\n\n계속 진행하시겠습니까?</value>\n  </data>\n  <data name=\"EnableOptimusTitle\" xml:space=\"preserve\">\n    <value>NVIDIA 디스플레이 모드가 Optimus로 설정되어 있지 않습니다.</value>\n  </data>\n  <data name=\"EnergySettings\" xml:space=\"preserve\">\n    <value>Energy Settings</value>\n  </data>\n  <data name=\"Export\" xml:space=\"preserve\">\n    <value>프로필 내보내기</value>\n  </data>\n  <data name=\"Extra\" xml:space=\"preserve\">\n    <value>추가 설정</value>\n  </data>\n  <data name=\"ExtraSettings\" xml:space=\"preserve\">\n    <value>추가 설정</value>\n  </data>\n  <data name=\"FactoryDefaults\" xml:space=\"preserve\">\n    <value>공장 설정</value>\n  </data>\n  <data name=\"FanCurves\" xml:space=\"preserve\">\n    <value>팬 커브</value>\n  </data>\n  <data name=\"FanProfileCPU\" xml:space=\"preserve\">\n    <value>CPU 팬 프로필</value>\n  </data>\n  <data name=\"FanProfileGPU\" xml:space=\"preserve\">\n    <value>GPU 팬 프로필</value>\n  </data>\n  <data name=\"FanProfileMid\" xml:space=\"preserve\">\n    <value>중간 팬 프로필</value>\n  </data>\n  <data name=\"FanProfiles\" xml:space=\"preserve\">\n    <value>팬 프로필</value>\n  </data>\n  <data name=\"FansAndPower\" xml:space=\"preserve\">\n    <value>팬 속도/전력</value>\n  </data>\n  <data name=\"FanSpeed\" xml:space=\"preserve\">\n    <value>팬</value>\n  </data>\n  <data name=\"FansPower\" xml:space=\"preserve\">\n    <value>팬 + 전력</value>\n  </data>\n  <data name=\"FlickerFreeDimming\" xml:space=\"preserve\">\n    <value>플리커 프리 디밍</value>\n  </data>\n  <data name=\"FnLock\" xml:space=\"preserve\">\n    <value>Fn 키를 누르지 않고 Fn+F 핫키 작동</value>\n  </data>\n  <data name=\"FnLockOff\" xml:space=\"preserve\">\n    <value>FN-Lock 꺼짐</value>\n  </data>\n  <data name=\"FnLockOn\" xml:space=\"preserve\">\n    <value>FN-Lock 켜짐</value>\n  </data>\n  <data name=\"GPUBoost\" xml:space=\"preserve\">\n    <value>다이나믹 부스트</value>\n  </data>\n  <data name=\"GPUChanging\" xml:space=\"preserve\">\n    <value>바꾸는 중</value>\n  </data>\n  <data name=\"GPUCoreClockOffset\" xml:space=\"preserve\">\n    <value>코어 클럭 오프셋</value>\n  </data>\n  <data name=\"GPUMemoryClockOffset\" xml:space=\"preserve\">\n    <value>메모리 클럭 오프셋</value>\n  </data>\n  <data name=\"GPUMode\" xml:space=\"preserve\">\n    <value>GPU 모드</value>\n  </data>\n  <data name=\"GPUModeEco\" xml:space=\"preserve\">\n    <value>iGPU만 사용</value>\n  </data>\n  <data name=\"GPUModeStandard\" xml:space=\"preserve\">\n    <value>iGPU + dGPU</value>\n  </data>\n  <data name=\"GPUModeUltimate\" xml:space=\"preserve\">\n    <value>dGPU만 사용</value>\n  </data>\n  <data name=\"GPUPower\" xml:space=\"preserve\">\n    <value>GPU Power</value>\n  </data>\n  <data name=\"GPUSettings\" xml:space=\"preserve\">\n    <value>GPU 설정</value>\n  </data>\n  <data name=\"GPUTempTarget\" xml:space=\"preserve\">\n    <value>목표 온도</value>\n  </data>\n  <data name=\"HibernateAfter\" xml:space=\"preserve\">\n    <value>최대 절전 모드 전환 시간 (0 - 꺼짐)</value>\n  </data>\n  <data name=\"High\" xml:space=\"preserve\">\n    <value>높게</value>\n  </data>\n  <data name=\"ImageRotation\" xml:space=\"preserve\">\n    <value>이미지 방향</value>\n  </data>\n  <data name=\"Import\" xml:space=\"preserve\">\n    <value>프로필 가져오기</value>\n  </data>\n  <data name=\"KeyBindings\" xml:space=\"preserve\">\n    <value>키 바인딩</value>\n  </data>\n  <data name=\"Keyboard\" xml:space=\"preserve\">\n    <value>키보드</value>\n  </data>\n  <data name=\"KillGpuApps\" xml:space=\"preserve\">\n    <value>Eco 모드로 전환 시 GPU를 사용하는 모든 앱 중지</value>\n  </data>\n  <data name=\"LaptopBacklight\" xml:space=\"preserve\">\n    <value>백라이트</value>\n  </data>\n  <data name=\"LaptopKeyboard\" xml:space=\"preserve\">\n    <value>키보드</value>\n  </data>\n  <data name=\"LaptopScreen\" xml:space=\"preserve\">\n    <value>화면</value>\n  </data>\n  <data name=\"LEDStatusIndicators\" xml:space=\"preserve\">\n    <value>LED 상태 표시등</value>\n  </data>\n  <data name=\"Lid\" xml:space=\"preserve\">\n    <value>덮개</value>\n  </data>\n  <data name=\"Lightbar\" xml:space=\"preserve\">\n    <value>라이트바</value>\n  </data>\n  <data name=\"Lighting\" xml:space=\"preserve\">\n    <value>조명</value>\n  </data>\n  <data name=\"LockScreen\" xml:space=\"preserve\">\n    <value>잠금화면</value>\n  </data>\n  <data name=\"Logo\" xml:space=\"preserve\">\n    <value>로고</value>\n  </data>\n  <data name=\"Low\" xml:space=\"preserve\">\n    <value>낮게</value>\n  </data>\n  <data name=\"LSDeadzones\" xml:space=\"preserve\">\n    <value>왼쪽 스틱 데드존</value>\n  </data>\n  <data name=\"LTDeadzones\" xml:space=\"preserve\">\n    <value>왼쪽 트리거 데드존</value>\n  </data>\n  <data name=\"MatrixAudio\" xml:space=\"preserve\">\n    <value>오디오 비주얼라이저</value>\n  </data>\n  <data name=\"MatrixBanner\" xml:space=\"preserve\">\n    <value>Binary Banner</value>\n  </data>\n  <data name=\"MatrixBright\" xml:space=\"preserve\">\n    <value>밝게</value>\n  </data>\n  <data name=\"MatrixClock\" xml:space=\"preserve\">\n    <value>시계</value>\n  </data>\n  <data name=\"MatrixDim\" xml:space=\"preserve\">\n    <value>어둡게</value>\n  </data>\n  <data name=\"MatrixLogo\" xml:space=\"preserve\">\n    <value>Rog 로고</value>\n  </data>\n  <data name=\"MatrixMedium\" xml:space=\"preserve\">\n    <value>중간</value>\n  </data>\n  <data name=\"MatrixOff\" xml:space=\"preserve\">\n    <value>끄기</value>\n  </data>\n  <data name=\"MatrixPicture\" xml:space=\"preserve\">\n    <value>사진</value>\n  </data>\n  <data name=\"MaxRefreshTooltip\" xml:space=\"preserve\">\n    <value>최대 주사율 설정</value>\n  </data>\n  <data name=\"MinRefreshTooltip\" xml:space=\"preserve\">\n    <value>60Hz 주사율 설정</value>\n  </data>\n  <data name=\"Minute\" xml:space=\"preserve\">\n    <value>분 후</value>\n  </data>\n  <data name=\"Minutes\" xml:space=\"preserve\">\n    <value>분 후</value>\n  </data>\n  <data name=\"MouseAngleSnapping\" xml:space=\"preserve\">\n    <value>Angle Snapping / Tuning</value>\n  </data>\n  <data name=\"MouseAutoPowerOff\" xml:space=\"preserve\">\n    <value>자동 전원 꺼짐</value>\n  </data>\n  <data name=\"MouseButtonResponse\" xml:space=\"preserve\">\n    <value>버튼 응답</value>\n  </data>\n  <data name=\"MouseImportFailed\" xml:space=\"preserve\">\n    <value>가져오기 실패. 유효한 마우스 프로필이 아니거나 손상된 파일입니다.</value>\n  </data>\n  <data name=\"MouseLiftOffDistance\" xml:space=\"preserve\">\n    <value>들어올림 거리</value>\n  </data>\n  <data name=\"MouseLowBatteryWarning\" xml:space=\"preserve\">\n    <value>배터리 부족 경고 알림</value>\n  </data>\n  <data name=\"MousePerformance\" xml:space=\"preserve\">\n    <value>성능</value>\n  </data>\n  <data name=\"MouseSynchronize\" xml:space=\"preserve\">\n    <value>마우스와 동기화</value>\n  </data>\n  <data name=\"Multizone\" xml:space=\"preserve\">\n    <value>다중 영역</value>\n  </data>\n  <data name=\"MultizoneStrong\" xml:space=\"preserve\">\n    <value>다중 영역 강도</value>\n  </data>\n  <data name=\"Muted\" xml:space=\"preserve\">\n    <value>음소거</value>\n  </data>\n  <data name=\"MuteMic\" xml:space=\"preserve\">\n    <value>마이크 음소거</value>\n  </data>\n  <data name=\"Never\" xml:space=\"preserve\">\n    <value>사용 안함</value>\n  </data>\n  <data name=\"NewUpdates\" xml:space=\"preserve\">\n    <value>새 업데이트</value>\n  </data>\n  <data name=\"NoNewUpdates\" xml:space=\"preserve\">\n    <value>새 업데이트 없음</value>\n  </data>\n  <data name=\"NotConnected\" xml:space=\"preserve\">\n    <value>연결되지 않음</value>\n  </data>\n  <data name=\"Off\" xml:space=\"preserve\">\n    <value>꺼짐</value>\n  </data>\n  <data name=\"On\" xml:space=\"preserve\">\n    <value>켜짐</value>\n  </data>\n  <data name=\"OneZone\" xml:space=\"preserve\">\n    <value>단일 영역</value>\n  </data>\n  <data name=\"OpenGHelper\" xml:space=\"preserve\">\n    <value>G-Helper 열기</value>\n  </data>\n  <data name=\"Optimized\" xml:space=\"preserve\">\n    <value>최적화</value>\n  </data>\n  <data name=\"OptimizedGPUTooltip\" xml:space=\"preserve\">\n    <value>배터리 사용 중에만 Eco 모드로 전환</value>\n  </data>\n  <data name=\"OptimizedUSBC\" xml:space=\"preserve\">\n    <value>최적화 모드에서 PD 충전 시 GPU 비활성화</value>\n  </data>\n  <data name=\"Other\" xml:space=\"preserve\">\n    <value>기타 설정</value>\n  </data>\n  <data name=\"Overdrive\" xml:space=\"preserve\">\n    <value>오버드라이브</value>\n  </data>\n  <data name=\"PerformanceMode\" xml:space=\"preserve\">\n    <value>성능 모드</value>\n  </data>\n  <data name=\"Peripherals\" xml:space=\"preserve\">\n    <value>주변 장치</value>\n  </data>\n  <data name=\"PictureGif\" xml:space=\"preserve\">\n    <value>사진 / Gif</value>\n  </data>\n  <data name=\"PlayPause\" xml:space=\"preserve\">\n    <value>재생 / 정지</value>\n  </data>\n  <data name=\"PollingRate\" xml:space=\"preserve\">\n    <value>폴링레이트</value>\n  </data>\n  <data name=\"PowerLimits\" xml:space=\"preserve\">\n    <value>전력 제한</value>\n  </data>\n  <data name=\"PPTExperimental\" xml:space=\"preserve\">\n    <value>전력 제한은 실험적인 기능입니다. 주의하여 사용하세요!</value>\n  </data>\n  <data name=\"PrintScreen\" xml:space=\"preserve\">\n    <value>PrintScreen</value>\n  </data>\n  <data name=\"Profile\" xml:space=\"preserve\">\n    <value>프로필</value>\n  </data>\n  <data name=\"Quit\" xml:space=\"preserve\">\n    <value>종료</value>\n  </data>\n  <data name=\"Reset\" xml:space=\"preserve\">\n    <value>초기화</value>\n  </data>\n  <data name=\"RestartGPU\" xml:space=\"preserve\">\n    <value>dGPU가 사용중이기 때문에 Eco 모드로 전환할 수 없습니다. 장치 관리자에서 dGPU를 재시작하시겠습니까?</value>\n  </data>\n  <data name=\"RPM\" xml:space=\"preserve\">\n    <value>RPM</value>\n  </data>\n  <data name=\"RSDeadzones\" xml:space=\"preserve\">\n    <value>오른쪽 스틱 데드존</value>\n  </data>\n  <data name=\"RTDeadzones\" xml:space=\"preserve\">\n    <value>오른쪽 트리거 데드존</value>\n  </data>\n  <data name=\"RunOnStartup\" xml:space=\"preserve\">\n    <value>시스템 시작 시 실행</value>\n  </data>\n  <data name=\"ScalingQuality\" xml:space=\"preserve\">\n    <value>스케일링 품질</value>\n  </data>\n  <data name=\"ScreenPadDown\" xml:space=\"preserve\">\n    <value>Screenpad 밝기 감소</value>\n  </data>\n  <data name=\"ScreenPadUp\" xml:space=\"preserve\">\n    <value>Screenpad 밝기 증가</value>\n  </data>\n  <data name=\"Shutdown\" xml:space=\"preserve\">\n    <value>종료</value>\n  </data>\n  <data name=\"Silent\" xml:space=\"preserve\">\n    <value>조용</value>\n  </data>\n  <data name=\"Sleep\" xml:space=\"preserve\">\n    <value>절전</value>\n  </data>\n  <data name=\"StandardGPUTooltip\" xml:space=\"preserve\">\n    <value>표준 모드에서 dGPU 켜기</value>\n  </data>\n  <data name=\"StandardMode\" xml:space=\"preserve\">\n    <value>표준</value>\n  </data>\n  <data name=\"Start\" xml:space=\"preserve\">\n    <value>시작</value>\n  </data>\n  <data name=\"StartingServices\" xml:space=\"preserve\">\n    <value>서비스 시작 중</value>\n  </data>\n  <data name=\"StartupError\" xml:space=\"preserve\">\n    <value>시작 오류</value>\n  </data>\n  <data name=\"Stop\" xml:space=\"preserve\">\n    <value>중지</value>\n  </data>\n  <data name=\"StopGPUApps\" xml:space=\"preserve\">\n    <value>GPU를 사용하는 앱 중지</value>\n  </data>\n  <data name=\"StoppingServices\" xml:space=\"preserve\">\n    <value>서비스 중지 중</value>\n  </data>\n  <data name=\"ToggleAura\" xml:space=\"preserve\">\n    <value>Aura 전환</value>\n  </data>\n  <data name=\"ToggleClamshellMode\" xml:space=\"preserve\">\n    <value>클램셸 모드 자동 전환</value>\n  </data>\n  <data name=\"ToggleFnLock\" xml:space=\"preserve\">\n    <value>Fn-Lock 전환</value>\n  </data>\n  <data name=\"ToggleMiniled\" xml:space=\"preserve\">\n    <value>Miniled 전환 (지원하는 기기만)</value>\n  </data>\n  <data name=\"ToggleScreen\" xml:space=\"preserve\">\n    <value>화면 전환</value>\n  </data>\n  <data name=\"ToggleTouchscreen\" xml:space=\"preserve\">\n    <value>터치스크린 전환</value>\n  </data>\n  <data name=\"Touchscreen\" xml:space=\"preserve\">\n    <value>터치스크린</value>\n  </data>\n  <data name=\"Turbo\" xml:space=\"preserve\">\n    <value>터보</value>\n  </data>\n  <data name=\"TurnedOff\" xml:space=\"preserve\">\n    <value>꺼짐</value>\n  </data>\n  <data name=\"TurnOffOnBattery\" xml:space=\"preserve\">\n    <value>배터리 사용 중에는 끄기</value>\n  </data>\n  <data name=\"UltimateGPUTooltip\" xml:space=\"preserve\">\n    <value>노트북 화면을 dGPU와 연결, FPS 최대화</value>\n  </data>\n  <data name=\"UltimateMode\" xml:space=\"preserve\">\n    <value>Ultimate</value>\n  </data>\n  <data name=\"UndervoltingRisky\" xml:space=\"preserve\">\n    <value>언더볼팅은 실험적이며 위험한 기능입니다. 적용 값이 너무 낮은 경우 시스템이 불안정해지고, 강제 종료되거나 데이터 손상을 유발할 수 있습니다. 낮은 값부터 적용하여 잘 작동하는지 확인해 보십시오.</value>\n  </data>\n  <data name=\"Unmuted\" xml:space=\"preserve\">\n    <value>음소거 해제</value>\n  </data>\n  <data name=\"Updates\" xml:space=\"preserve\">\n    <value>업데이트</value>\n  </data>\n  <data name=\"VersionLabel\" xml:space=\"preserve\">\n    <value>버전</value>\n  </data>\n  <data name=\"VibrationStrength\" xml:space=\"preserve\">\n    <value>진동 세기</value>\n  </data>\n  <data name=\"VisualMode\" xml:space=\"preserve\">\n    <value>비주얼 모드</value>\n  </data>\n  <data name=\"VisualModesHDR\" xml:space=\"preserve\">\n    <value>HDR이 켜져 있을 때에는 비주얼 모드를 사용할 수 없습니다.</value>\n  </data>\n  <data name=\"VisualModesScreen\" xml:space=\"preserve\">\n    <value>노트북 화면이 꺼져 있을 때는 비주얼 모드 사용 불가</value>\n  </data>\n  <data name=\"VolumeDown\" xml:space=\"preserve\">\n    <value>볼륨 작게</value>\n  </data>\n  <data name=\"VolumeMute\" xml:space=\"preserve\">\n    <value>음소거</value>\n  </data>\n  <data name=\"VolumeUp\" xml:space=\"preserve\">\n    <value>볼륨 크게</value>\n  </data>\n  <data name=\"WindowTop\" xml:space=\"preserve\">\n    <value>창을 항상 맨 위로 유지</value>\n  </data>\n  <data name=\"Zoom\" xml:space=\"preserve\">\n    <value>확대/축소</value>\n  </data>\n  <data name=\"Donate\" xml:space=\"preserve\">\n    <value>후원</value>\n  </data>\n  <data name=\"Legend\" xml:space=\"preserve\">\n    <value>범례</value>\n  </data>\n  <data name=\"LegendGray\" xml:space=\"preserve\">\n    <value>설치된 버전 확인 불가</value>\n    <comment>Can't check local version</comment>\n  </data>\n  <data name=\"LegendRed\" xml:space=\"preserve\">\n    <value>업데이트 이용 가능</value>\n    <comment>Update Available</comment>\n  </data>\n  <data name=\"LegendGreen\" xml:space=\"preserve\">\n    <value>업데이트됨</value>\n    <comment>Updated</comment>\n  </data>\n  <data name=\"SlashBounce\" xml:space=\"preserve\">\n    <value>Bounce</value>\n  </data>\n  <data name=\"SlashMode\" xml:space=\"preserve\">\n    <value>Slash</value>\n  </data>\n  <data name=\"SlashLoading\" xml:space=\"preserve\">\n    <value>Loading</value>\n  </data>\n  <data name=\"SlashBitStream\" xml:space=\"preserve\">\n    <value>Bit Stream</value>\n  </data>\n  <data name=\"SlashTransmission\" xml:space=\"preserve\">\n    <value>Transmission</value>\n  </data>\n  <data name=\"SlashFlow\" xml:space=\"preserve\">\n    <value>Flow</value>\n  </data>\n  <data name=\"SlashFlux\" xml:space=\"preserve\">\n    <value>Flux</value>\n  </data>\n  <data name=\"SlashPhantom\" xml:space=\"preserve\">\n    <value>Phantom</value>\n  </data>\n  <data name=\"SlashSpectrum\" xml:space=\"preserve\">\n    <value>Spectrum</value>\n  </data>\n  <data name=\"SlashHazard\" xml:space=\"preserve\">\n    <value>Hazard</value>\n  </data>\n  <data name=\"SlashInterfacing\" xml:space=\"preserve\">\n    <value>Interfacing</value>\n  </data>\n  <data name=\"SlashRamp\" xml:space=\"preserve\">\n    <value>Ramp</value>\n  </data>\n  <data name=\"SlashGameOver\" xml:space=\"preserve\">\n    <value>Game Over</value>\n  </data>\n  <data name=\"SlashStart\" xml:space=\"preserve\">\n    <value>Start</value>\n  </data>\n  <data name=\"SlashBuzzer\" xml:space=\"preserve\">\n    <value>Buzzer</value>\n  </data>\n  <data name=\"SlashStatic\" xml:space=\"preserve\">\n    <value>Static</value>\n  </data>\n  <data name=\"SlashBatteryLevel\" xml:space=\"preserve\">\n    <value>Battery Level</value>\n  </data>\n  <data name=\"IntervalOff\" xml:space=\"preserve\">\n    <value>Interval Off</value>\n  </data>\n  <data name=\"IntervalSeconds\" xml:space=\"preserve\">\n    <value>Interval {0}s</value>\n  </data>\n  <data name=\"DisableDynamicLighting\" xml:space=\"preserve\">\n    <value>Please disable Windows &gt; Dynamic Lighting</value>\n  </data>\n  <data name=\"AmbientModeResources\" xml:space=\"preserve\">\n    <value>Ambient mode may increase resource usage</value>\n  </data>\n  <data name=\"MouseMotionSync\" xml:space=\"preserve\">\n    <value>Motion Sync</value>\n  </data>\n  <data name=\"MouseZoneMode\" xml:space=\"preserve\">\n    <value>Zone Mode</value>\n  </data>\n</root>"
  },
  {
    "path": "app/Properties/Strings.lt.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" id=\"root\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\"/>\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"name\" type=\"xsd:string\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\"/>\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Acceleration\" xml:space=\"preserve\">\n    <value>Greitėjimas</value>\n  </data>\n  <data name=\"ACPIError\" xml:space=\"preserve\">\n    <value>Nepavyko prisijungti prie ASUS ACPI. Programėlė be jo negali veikti. Pabandykite įdiegti Asus System Control Interface</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestart\" xml:space=\"preserve\">\n    <value>Norėdami pritaikyti pakeitimus, paleiskite įrenginį iš naujo</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestartTitle\" xml:space=\"preserve\">\n    <value>Paleisti iš naujo?</value>\n  </data>\n  <data name=\"AlertDGPU\" xml:space=\"preserve\">\n    <value>Panašu, kad jūsų GPU yra intensyviai naudojamas. Išjungti jį?</value>\n  </data>\n  <data name=\"AlertDGPUTitle\" xml:space=\"preserve\">\n    <value>Ekonomiškas režimas</value>\n  </data>\n  <data name=\"AlertUltimateOff\" xml:space=\"preserve\">\n    <value>Maksimalaus režimo išjungimas reikalauja paleidimo iš naujo</value>\n  </data>\n  <data name=\"AlertUltimateOn\" xml:space=\"preserve\">\n    <value>Maksimalus režimas reikalauja paleidimo iš naujo</value>\n  </data>\n  <data name=\"AlertUltimateTitle\" xml:space=\"preserve\">\n    <value>Paleisti iš naujo dabar?</value>\n  </data>\n  <data name=\"AllyController\" xml:space=\"preserve\">\n    <value>„Ally“ valdiklis</value>\n  </data>\n  <data name=\"AnimationSpeed\" xml:space=\"preserve\">\n    <value>Animacijos greitis</value>\n  </data>\n  <data name=\"AnimeMatrix\" xml:space=\"preserve\">\n    <value>Anime matrica</value>\n  </data>\n  <data name=\"AppAlreadyRunning\" xml:space=\"preserve\">\n    <value>Programėlė jau paleista</value>\n  </data>\n  <data name=\"AppAlreadyRunningText\" xml:space=\"preserve\">\n    <value>G-Helper jau paleistas. Patikrinkite, ar sistemos juostelėje nėra piktogramos.</value>\n  </data>\n  <data name=\"Apply\" xml:space=\"preserve\">\n    <value>Taikyti</value>\n  </data>\n  <data name=\"ApplyFanCurve\" xml:space=\"preserve\">\n    <value>Taikyti tinkintą kreivę</value>\n  </data>\n  <data name=\"ApplyPowerLimits\" xml:space=\"preserve\">\n    <value>Taikyti galios ribas</value>\n  </data>\n  <data name=\"ApplyWindowsPowerPlan\" xml:space=\"preserve\">\n    <value>Automatiškai derinti Windows energijos režimus</value>\n  </data>\n  <data name=\"APUMemory\" xml:space=\"preserve\">\n    <value>Atmintis priskirta vaizdo plokštei</value>\n  </data>\n  <data name=\"AsusServicesRunning\" xml:space=\"preserve\">\n    <value>Veikiančios Asus tarnybos</value>\n  </data>\n  <data name=\"AuraBatteryState\" xml:space=\"preserve\">\n    <value>Būsena</value>\n  </data>\n  <data name=\"AuraBreathe\" xml:space=\"preserve\">\n    <value>Kvėpavimas</value>\n  </data>\n  <data name=\"AuraClockwise\" xml:space=\"preserve\">\n    <value>Pagal laikrodžio rodyklę</value>\n  </data>\n  <data name=\"AuraColorCycle\" xml:space=\"preserve\">\n    <value>Spalvų ciklas</value>\n  </data>\n  <data name=\"AuraComet\" xml:space=\"preserve\">\n    <value>Kometa</value>\n  </data>\n  <data name=\"AuraCounterClockwise\" xml:space=\"preserve\">\n    <value>Prieš laikrodžio rodyklę</value>\n  </data>\n  <data name=\"AuraFast\" xml:space=\"preserve\">\n    <value>Greitas</value>\n  </data>\n  <data name=\"AuraLightingMode\" xml:space=\"preserve\">\n    <value>Apšvietimo režimas</value>\n  </data>\n  <data name=\"AuraNormal\" xml:space=\"preserve\">\n    <value>Įprastas</value>\n  </data>\n  <data name=\"AuraRainbow\" xml:space=\"preserve\">\n    <value>Vaivorykštė</value>\n  </data>\n  <data name=\"AuraRandomColor\" xml:space=\"preserve\">\n    <value>Atsitiktinė</value>\n  </data>\n  <data name=\"AuraReact\" xml:space=\"preserve\">\n    <value>Reaktyvinis</value>\n  </data>\n  <data name=\"AuraSlow\" xml:space=\"preserve\">\n    <value>Lėtas</value>\n  </data>\n  <data name=\"AuraStatic\" xml:space=\"preserve\">\n    <value>Statinis</value>\n  </data>\n  <data name=\"AuraStrobe\" xml:space=\"preserve\">\n    <value>Blyksniai</value>\n  </data>\n  <data name=\"AuraZoneAll\" xml:space=\"preserve\">\n    <value>Visi</value>\n  </data>\n  <data name=\"AuraZoneDock\" xml:space=\"preserve\">\n    <value>Jungčių stotelė</value>\n  </data>\n  <data name=\"AuraZoneLogo\" xml:space=\"preserve\">\n    <value>Logotipas</value>\n  </data>\n  <data name=\"AuraZoneScroll\" xml:space=\"preserve\">\n    <value>Ratukas</value>\n  </data>\n  <data name=\"AuraZoneUnderglow\" xml:space=\"preserve\">\n    <value>Apatinis apšvietimas</value>\n  </data>\n  <data name=\"AutoApply\" xml:space=\"preserve\">\n    <value>Taikyti automatiškai</value>\n  </data>\n  <data name=\"AutoMode\" xml:space=\"preserve\">\n    <value>Automatinis</value>\n  </data>\n  <data name=\"AutoRefreshTooltip\" xml:space=\"preserve\">\n    <value>Baterijos režimu nustatomas 60Hz dažn., atstatoma įkraunant</value>\n  </data>\n  <data name=\"Awake\" xml:space=\"preserve\">\n    <value>Pabudus</value>\n  </data>\n  <data name=\"BacklightLow\" xml:space=\"preserve\">\n    <value>Žem.</value>\n  </data>\n  <data name=\"BacklightMax\" xml:space=\"preserve\">\n    <value>Maks.</value>\n  </data>\n  <data name=\"BacklightMid\" xml:space=\"preserve\">\n    <value>Vid.</value>\n  </data>\n  <data name=\"BacklightOff\" xml:space=\"preserve\">\n    <value>Išjungta</value>\n  </data>\n  <data name=\"BacklightTimeout\" xml:space=\"preserve\">\n    <value>Apšvietimo laikas įkraunant / baterija (0 – ĮJUNGTA)</value>\n  </data>\n  <data name=\"BacklightTimeoutBattery\" xml:space=\"preserve\">\n    <value>Foninio apšvietimo laikas akumuliatoriaus režimu</value>\n  </data>\n  <data name=\"BacklightTimeoutPlugged\" xml:space=\"preserve\">\n    <value>Foninio apšvietimo laikas įkraunant</value>\n  </data>\n  <data name=\"Balanced\" xml:space=\"preserve\">\n    <value>Balansuotas</value>\n  </data>\n  <data name=\"BatteryCharge\" xml:space=\"preserve\">\n    <value>Įkrova</value>\n  </data>\n  <data name=\"BatteryChargeLimit\" xml:space=\"preserve\">\n    <value>Įkrovos riba</value>\n  </data>\n  <data name=\"BatteryHealth\" xml:space=\"preserve\">\n    <value>Baterijos būklė</value>\n  </data>\n  <data name=\"BatteryLimitFull\" xml:space=\"preserve\">\n    <value>Vienkartinė įkrova iki 100%</value>\n  </data>\n  <data name=\"Binding\" xml:space=\"preserve\">\n    <value>Saistymas</value>\n  </data>\n  <data name=\"BindingPrimary\" xml:space=\"preserve\">\n    <value>Pirminis</value>\n  </data>\n  <data name=\"BindingSecondary\" xml:space=\"preserve\">\n    <value>Antrinis</value>\n  </data>\n  <data name=\"BiosAndDriverUpdates\" xml:space=\"preserve\">\n    <value>BIOS ir tvarkyklių naujinimai</value>\n  </data>\n  <data name=\"Boot\" xml:space=\"preserve\">\n    <value>Paleidžiant</value>\n  </data>\n  <data name=\"BootSound\" xml:space=\"preserve\">\n    <value>Paleidimo garsas</value>\n  </data>\n  <data name=\"Brightness\" xml:space=\"preserve\">\n    <value>Ryškumas</value>\n  </data>\n  <data name=\"BrightnessDown\" xml:space=\"preserve\">\n    <value>Ryškumo mažinimas</value>\n  </data>\n  <data name=\"BrightnessUp\" xml:space=\"preserve\">\n    <value>Ryškumo didinimas</value>\n  </data>\n  <data name=\"BWTrayIcon\" xml:space=\"preserve\">\n    <value>Naudoti juodai baltą piktogramą</value>\n  </data>\n  <data name=\"Calibrate\" xml:space=\"preserve\">\n    <value>Kalibruoti</value>\n  </data>\n  <data name=\"Charging\" xml:space=\"preserve\">\n    <value>Įkrovimas</value>\n  </data>\n  <data name=\"Color\" xml:space=\"preserve\">\n    <value>Spalva</value>\n  </data>\n  <data name=\"Contrast\" xml:space=\"preserve\">\n    <value>Kontrastas</value>\n  </data>\n  <data name=\"Controller\" xml:space=\"preserve\">\n    <value>Valdiklis</value>\n  </data>\n  <data name=\"CPUBoost\" xml:space=\"preserve\">\n    <value>CPU spartinimas</value>\n  </data>\n  <data name=\"Custom\" xml:space=\"preserve\">\n    <value>Tinkintas</value>\n  </data>\n  <data name=\"Deceleration\" xml:space=\"preserve\">\n    <value>Lėtėjimas</value>\n  </data>\n  <data name=\"Default\" xml:space=\"preserve\">\n    <value>Numatytas</value>\n  </data>\n  <data name=\"DisableController\" xml:space=\"preserve\">\n    <value>Išjungti valdiklį</value>\n  </data>\n  <data name=\"DisableOnLidClose\" xml:space=\"preserve\">\n    <value>Išjungti uždarius gaubtą</value>\n  </data>\n  <data name=\"DisableOverdrive\" xml:space=\"preserve\">\n    <value>Išjungti ekrano pikselių spartinimą</value>\n  </data>\n  <data name=\"Discharging\" xml:space=\"preserve\">\n    <value>Iškrovimas</value>\n  </data>\n  <data name=\"DownloadColorProfiles\" xml:space=\"preserve\">\n    <value>Atsisiųsti spalvų profilius</value>\n  </data>\n  <data name=\"DownloadUpdate\" xml:space=\"preserve\">\n    <value>Atsisiųsti</value>\n  </data>\n  <data name=\"DriverAndSoftware\" xml:space=\"preserve\">\n    <value>Tvarkyklės ir programinė įranga</value>\n  </data>\n  <data name=\"EcoGPUTooltip\" xml:space=\"preserve\">\n    <value>Išjungiamas dGPU (tausojama baterija)</value>\n  </data>\n  <data name=\"EcoMode\" xml:space=\"preserve\">\n    <value>Ekonomiškas</value>\n  </data>\n  <data name=\"EnableGPUOnShutdown\" xml:space=\"preserve\">\n    <value>Įgalinti GPU išjungimo metu (apsauga nuo „Eco“ režimo problemos)</value>\n  </data>\n  <data name=\"EnableOptimusText\" xml:space=\"preserve\">\n    <value>Jei ekrano režimas NVIDIA valdymo skyde yra nenustatytas į Optimus, kai dGPU yra išjungtas perjungus į ekonominį režimą, gali kilti problemų su ryškumo valdymu iki kito paleidimo iš naujo. \n\nVis tiek norite tęsti?</value>\n  </data>\n  <data name=\"EnableOptimusTitle\" xml:space=\"preserve\">\n    <value>NVIDIA ekrano režimas nenustatytas į Optimus</value>\n  </data>\n  <data name=\"EnergySettings\" xml:space=\"preserve\">\n    <value>Energijos nustatymai</value>\n  </data>\n  <data name=\"Export\" xml:space=\"preserve\">\n    <value>Eksportuoti profilį</value>\n  </data>\n  <data name=\"Extra\" xml:space=\"preserve\">\n    <value>Išplėstiniai</value>\n  </data>\n  <data name=\"ExtraSettings\" xml:space=\"preserve\">\n    <value>Išplėstiniai nustatymai</value>\n  </data>\n  <data name=\"FactoryDefaults\" xml:space=\"preserve\">\n    <value>Numatytieji</value>\n  </data>\n  <data name=\"FanCurves\" xml:space=\"preserve\">\n    <value>Aušintuvų kreivės</value>\n  </data>\n  <data name=\"FanProfileCPU\" xml:space=\"preserve\">\n    <value>CPU aušintuvo profilis</value>\n  </data>\n  <data name=\"FanProfileGPU\" xml:space=\"preserve\">\n    <value>GPU aušintuvo profilis</value>\n  </data>\n  <data name=\"FanProfileMid\" xml:space=\"preserve\">\n    <value>Vidurinio aušintuvo profilis</value>\n  </data>\n  <data name=\"FanProfiles\" xml:space=\"preserve\">\n    <value>Aušintuvų profiliai</value>\n  </data>\n  <data name=\"FansAndPower\" xml:space=\"preserve\">\n    <value>Aušintuvai ir galia</value>\n  </data>\n  <data name=\"FanSpeed\" xml:space=\"preserve\">\n    <value>Aušintuvas</value>\n  </data>\n  <data name=\"FansPower\" xml:space=\"preserve\">\n    <value>Aušintuvai + galia</value>\n  </data>\n  <data name=\"FlickerFreeDimming\" xml:space=\"preserve\">\n    <value>Užtamsinimas be mirgėjimo</value>\n  </data>\n  <data name=\"FnLock\" xml:space=\"preserve\">\n    <value>Apdoroti Fn+F sparčiuosius klavišus be Fn</value>\n  </data>\n  <data name=\"FnLockOff\" xml:space=\"preserve\">\n    <value>FN užraktas išjungtas</value>\n  </data>\n  <data name=\"FnLockOn\" xml:space=\"preserve\">\n    <value>FN užraktas įjungtas</value>\n  </data>\n  <data name=\"GPUBoost\" xml:space=\"preserve\">\n    <value>Dinaminis spartinimas</value>\n  </data>\n  <data name=\"GPUChanging\" xml:space=\"preserve\">\n    <value>Keičiamas</value>\n  </data>\n  <data name=\"GPUCoreClockOffset\" xml:space=\"preserve\">\n    <value>Branduolių taktų poslinkis</value>\n  </data>\n  <data name=\"GPUMemoryClockOffset\" xml:space=\"preserve\">\n    <value>Atminties taktų poslinkis</value>\n  </data>\n  <data name=\"GPUMode\" xml:space=\"preserve\">\n    <value>GPU režimas</value>\n  </data>\n  <data name=\"GPUModeEco\" xml:space=\"preserve\">\n    <value>Tik iGPU</value>\n  </data>\n  <data name=\"GPUModeStandard\" xml:space=\"preserve\">\n    <value>iGPU + dGPU</value>\n  </data>\n  <data name=\"GPUModeUltimate\" xml:space=\"preserve\">\n    <value>Tik dGPU</value>\n  </data>\n  <data name=\"GPUPower\" xml:space=\"preserve\">\n    <value>GPU galia</value>\n  </data>\n  <data name=\"GPUSettings\" xml:space=\"preserve\">\n    <value>GPU nustatymai</value>\n  </data>\n  <data name=\"GPUTempTarget\" xml:space=\"preserve\">\n    <value>Temperatūros tikslas</value>\n  </data>\n  <data name=\"HibernateAfter\" xml:space=\"preserve\">\n    <value>Užmigimo laikas akumuliatoriaus režimu (0 – IŠJUNGTA)</value>\n  </data>\n  <data name=\"High\" xml:space=\"preserve\">\n    <value>Aukštas</value>\n  </data>\n  <data name=\"ImageRotation\" xml:space=\"preserve\">\n    <value>Atvaizdo pasukimas</value>\n  </data>\n  <data name=\"Import\" xml:space=\"preserve\">\n    <value>Importuoti profilį</value>\n  </data>\n  <data name=\"KeyBindings\" xml:space=\"preserve\">\n    <value>Klavišų priskyrimas</value>\n  </data>\n  <data name=\"Keyboard\" xml:space=\"preserve\">\n    <value>Klaviatūra</value>\n  </data>\n  <data name=\"KillGpuApps\" xml:space=\"preserve\">\n    <value>Sustabdyti visas GPU naudojančias programėles, kai perjungiama į ekon. režimą</value>\n  </data>\n  <data name=\"LaptopBacklight\" xml:space=\"preserve\">\n    <value>Apšvietimas</value>\n  </data>\n  <data name=\"LaptopKeyboard\" xml:space=\"preserve\">\n    <value>Klaviatūra</value>\n  </data>\n  <data name=\"LaptopScreen\" xml:space=\"preserve\">\n    <value>Ekranas</value>\n  </data>\n  <data name=\"LEDStatusIndicators\" xml:space=\"preserve\">\n    <value>LED būsenos indikatoriai</value>\n  </data>\n  <data name=\"Lid\" xml:space=\"preserve\">\n    <value>Dangtis</value>\n  </data>\n  <data name=\"Lightbar\" xml:space=\"preserve\">\n    <value>Šviesos juosta</value>\n  </data>\n  <data name=\"Lighting\" xml:space=\"preserve\">\n    <value>Apšvietimas</value>\n  </data>\n  <data name=\"LockScreen\" xml:space=\"preserve\">\n    <value>Užrakinimo ekranas</value>\n  </data>\n  <data name=\"Logo\" xml:space=\"preserve\">\n    <value>Logotipas</value>\n  </data>\n  <data name=\"Low\" xml:space=\"preserve\">\n    <value>Žemas</value>\n  </data>\n  <data name=\"LSDeadzones\" xml:space=\"preserve\">\n    <value>Kairiojo jungiklio nejautrumo zonos</value>\n  </data>\n  <data name=\"LTDeadzones\" xml:space=\"preserve\">\n    <value>Kairiojo jungiklio nejautrumo zonos</value>\n  </data>\n  <data name=\"MatrixAudio\" xml:space=\"preserve\">\n    <value>Garso vizualizatorius</value>\n  </data>\n  <data name=\"MatrixBanner\" xml:space=\"preserve\">\n    <value>Dvejetainė vėliava</value>\n  </data>\n  <data name=\"MatrixBright\" xml:space=\"preserve\">\n    <value>Šviesi</value>\n  </data>\n  <data name=\"MatrixClock\" xml:space=\"preserve\">\n    <value>Laikrodis</value>\n  </data>\n  <data name=\"MatrixDim\" xml:space=\"preserve\">\n    <value>Temdymas</value>\n  </data>\n  <data name=\"MatrixLogo\" xml:space=\"preserve\">\n    <value>Rog logotipas</value>\n  </data>\n  <data name=\"MatrixMedium\" xml:space=\"preserve\">\n    <value>Vidutinis</value>\n  </data>\n  <data name=\"MatrixOff\" xml:space=\"preserve\">\n    <value>Išjungta</value>\n  </data>\n  <data name=\"MatrixPicture\" xml:space=\"preserve\">\n    <value>Paveikslėlis</value>\n  </data>\n  <data name=\"MaxRefreshTooltip\" xml:space=\"preserve\">\n    <value>Maksimalus kadrų dažnis (mažesnė delsa)</value>\n  </data>\n  <data name=\"MinRefreshTooltip\" xml:space=\"preserve\">\n    <value>Nustatomas 60Hz kadrų dažnis (tausojama baterija)</value>\n  </data>\n  <data name=\"Minute\" xml:space=\"preserve\">\n    <value>min.</value>\n  </data>\n  <data name=\"Minutes\" xml:space=\"preserve\">\n    <value>min.</value>\n  </data>\n  <data name=\"MouseAngleSnapping\" xml:space=\"preserve\">\n    <value>Angle Snapping / Tuning</value>\n  </data>\n  <data name=\"MouseAutoPowerOff\" xml:space=\"preserve\">\n    <value>Automatiškai išjungti po</value>\n  </data>\n  <data name=\"MouseButtonResponse\" xml:space=\"preserve\">\n    <value>Klavišo atsakas</value>\n  </data>\n  <data name=\"MouseImportFailed\" xml:space=\"preserve\">\n    <value>Importuoti nepavyko. Pasirinktas failas nėra galiojantis pelės profilis arba yra sugadintas.</value>\n  </data>\n  <data name=\"MouseLiftOffDistance\" xml:space=\"preserve\">\n    <value>Pakilimo atstumas</value>\n  </data>\n  <data name=\"MouseLowBatteryWarning\" xml:space=\"preserve\">\n    <value>Senkančio akumuliatoriaus įspėjimas</value>\n  </data>\n  <data name=\"MousePerformance\" xml:space=\"preserve\">\n    <value>Našumas</value>\n  </data>\n  <data name=\"MouseSynchronize\" xml:space=\"preserve\">\n    <value>Sinchronizuoti su pele</value>\n  </data>\n  <data name=\"Multizone\" xml:space=\"preserve\">\n    <value>Kelios zonos</value>\n  </data>\n  <data name=\"MultizoneStrong\" xml:space=\"preserve\">\n    <value>Kelių zonų stiprumas</value>\n  </data>\n  <data name=\"Muted\" xml:space=\"preserve\">\n    <value>Išjungta</value>\n  </data>\n  <data name=\"MuteMic\" xml:space=\"preserve\">\n    <value>Mikrofono nutildymas</value>\n  </data>\n  <data name=\"Never\" xml:space=\"preserve\">\n    <value>Niekada</value>\n  </data>\n  <data name=\"NewUpdates\" xml:space=\"preserve\">\n    <value>Naujinimai</value>\n  </data>\n  <data name=\"NoNewUpdates\" xml:space=\"preserve\">\n    <value>Nėra naujinimų</value>\n  </data>\n  <data name=\"NotConnected\" xml:space=\"preserve\">\n    <value>Neprijungta</value>\n  </data>\n  <data name=\"Off\" xml:space=\"preserve\">\n    <value>Išjungta</value>\n  </data>\n  <data name=\"On\" xml:space=\"preserve\">\n    <value>Įjungta</value>\n  </data>\n  <data name=\"OneZone\" xml:space=\"preserve\">\n    <value>Viena zona</value>\n  </data>\n  <data name=\"OpenGHelper\" xml:space=\"preserve\">\n    <value>Atidaryti G-Helper langą</value>\n  </data>\n  <data name=\"Optimized\" xml:space=\"preserve\">\n    <value>Optimizuotas</value>\n  </data>\n  <data name=\"OptimizedGPUTooltip\" xml:space=\"preserve\">\n    <value>Įkraunant - įprastas režimas; naudojant bateriją - ekonomiškas režimas</value>\n  </data>\n  <data name=\"OptimizedUSBC\" xml:space=\"preserve\">\n    <value>Išjungti GPU optimizuotame režime, kai naudojamas USB-C įkroviklis</value>\n  </data>\n  <data name=\"Other\" xml:space=\"preserve\">\n    <value>Kita</value>\n  </data>\n  <data name=\"Overdrive\" xml:space=\"preserve\">\n    <value>Pikselių spartinimas</value>\n  </data>\n  <data name=\"PerformanceMode\" xml:space=\"preserve\">\n    <value>Režimas</value>\n  </data>\n  <data name=\"Peripherals\" xml:space=\"preserve\">\n    <value>Išoriniai įrenginiai</value>\n  </data>\n  <data name=\"PictureGif\" xml:space=\"preserve\">\n    <value>Paveikslėlis / GIF</value>\n  </data>\n  <data name=\"PlayPause\" xml:space=\"preserve\">\n    <value>Paleisti / Pristabdyti</value>\n  </data>\n  <data name=\"PollingRate\" xml:space=\"preserve\">\n    <value>Iškvietų dažnis</value>\n  </data>\n  <data name=\"PowerLimits\" xml:space=\"preserve\">\n    <value>Galios ribos</value>\n  </data>\n  <data name=\"PPTExperimental\" xml:space=\"preserve\">\n    <value>Galios ribos yra eksperimentinė funkcija. Naudokitės atsargiai!</value>\n  </data>\n  <data name=\"PrintScreen\" xml:space=\"preserve\">\n    <value>Ekrano kopija</value>\n  </data>\n  <data name=\"Profile\" xml:space=\"preserve\">\n    <value>Profilis</value>\n  </data>\n  <data name=\"Quit\" xml:space=\"preserve\">\n    <value>Išeiti</value>\n  </data>\n  <data name=\"Reset\" xml:space=\"preserve\">\n    <value>Atstatyti</value>\n  </data>\n  <data name=\"RestartGPU\" xml:space=\"preserve\">\n    <value>Kažkas naudoja dGPU ir neleidžia įjungti ekonomiško režimo. Norite leisti G-Helper bandyti iš naujo paleisti dGPU įrenginių tvarkytuvėje? (Tęskite savo rizika)</value>\n  </data>\n  <data name=\"RPM\" xml:space=\"preserve\">\n    <value>aps.</value>\n  </data>\n  <data name=\"RSDeadzones\" xml:space=\"preserve\">\n    <value>Dešiniojo jungiklio nejautrumo zonos</value>\n  </data>\n  <data name=\"RTDeadzones\" xml:space=\"preserve\">\n    <value>Dešiniojo jungiklio nejautrumo zonos</value>\n  </data>\n  <data name=\"RunOnStartup\" xml:space=\"preserve\">\n    <value>Paleisti įjungus sistemą</value>\n  </data>\n  <data name=\"ScalingQuality\" xml:space=\"preserve\">\n    <value>Mastelio kokybė</value>\n  </data>\n  <data name=\"ScreenPadDown\" xml:space=\"preserve\">\n    <value>Ekrano skydelio ryškumo mažinimas</value>\n  </data>\n  <data name=\"ScreenPadUp\" xml:space=\"preserve\">\n    <value>Ekrano skydelio ryškumo didinimas</value>\n  </data>\n  <data name=\"Shutdown\" xml:space=\"preserve\">\n    <value>Išjungus</value>\n  </data>\n  <data name=\"Silent\" xml:space=\"preserve\">\n    <value>Tylus</value>\n  </data>\n  <data name=\"Sleep\" xml:space=\"preserve\">\n    <value>Miegant</value>\n  </data>\n  <data name=\"StandardGPUTooltip\" xml:space=\"preserve\">\n    <value>Įjungiamas dGPU (įprastam naudojimui)</value>\n  </data>\n  <data name=\"StandardMode\" xml:space=\"preserve\">\n    <value>Įprastas</value>\n  </data>\n  <data name=\"Start\" xml:space=\"preserve\">\n    <value>Paleisti</value>\n  </data>\n  <data name=\"StartingServices\" xml:space=\"preserve\">\n    <value>Paleidžiamos tarnybos</value>\n  </data>\n  <data name=\"StartupError\" xml:space=\"preserve\">\n    <value>Paleidimo klaida</value>\n  </data>\n  <data name=\"Stop\" xml:space=\"preserve\">\n    <value>Stabdyti</value>\n  </data>\n  <data name=\"StopGPUApps\" xml:space=\"preserve\">\n    <value>Stabdyti GPU programėles</value>\n  </data>\n  <data name=\"StoppingServices\" xml:space=\"preserve\">\n    <value>Stabdomos tarnybos</value>\n  </data>\n  <data name=\"ToggleAura\" xml:space=\"preserve\">\n    <value>Perjungti Aura</value>\n  </data>\n  <data name=\"ToggleClamshellMode\" xml:space=\"preserve\">\n    <value>Automatiškai perjungti Clamshell režimą</value>\n  </data>\n  <data name=\"ToggleFnLock\" xml:space=\"preserve\">\n    <value>Perjungti Fn-Lock</value>\n  </data>\n  <data name=\"ToggleMiniled\" xml:space=\"preserve\">\n    <value>Perjungti Miniled (jei palaikoma)</value>\n  </data>\n  <data name=\"ToggleScreen\" xml:space=\"preserve\">\n    <value>Perjungti ekraną</value>\n  </data>\n  <data name=\"ToggleTouchscreen\" xml:space=\"preserve\">\n    <value>Valdyti jutiklinį ekraną</value>\n  </data>\n  <data name=\"Touchscreen\" xml:space=\"preserve\">\n    <value>Jutiklinis ekranas</value>\n  </data>\n  <data name=\"Turbo\" xml:space=\"preserve\">\n    <value>Turbo</value>\n  </data>\n  <data name=\"TurnedOff\" xml:space=\"preserve\">\n    <value>Išjungta</value>\n  </data>\n  <data name=\"TurnOffOnBattery\" xml:space=\"preserve\">\n    <value>Išjungti naudojant akumuliatorių</value>\n  </data>\n  <data name=\"UltimateGPUTooltip\" xml:space=\"preserve\">\n    <value>Nukreipiama į dGPU (maksimaliai padidinamas kadrų kiekis)</value>\n  </data>\n  <data name=\"UltimateMode\" xml:space=\"preserve\">\n    <value>Maksimalus</value>\n  </data>\n  <data name=\"UndervoltingRisky\" xml:space=\"preserve\">\n    <value>Įtampos mažinimas yra eksperimentinė ir pavojinga funkcija. Jei pritaikytos reikšmės yra per mažos jūsų aparatinei įrangai, ji gali tapti nestabili, išsijungti arba pažeisti duomenų vientisumą. Jei norite pabandyti, iš pirmo pradėkite nuo mažų reikšmių, spustelėkite „Taikyti“ ir išbandykite, kas jums tinka.</value>\n  </data>\n  <data name=\"Unmuted\" xml:space=\"preserve\">\n    <value>Įjungta</value>\n  </data>\n  <data name=\"Updates\" xml:space=\"preserve\">\n    <value>Naujinimai</value>\n  </data>\n  <data name=\"VersionLabel\" xml:space=\"preserve\">\n    <value>Versija</value>\n  </data>\n  <data name=\"VibrationStrength\" xml:space=\"preserve\">\n    <value>Vibracijos stiprumas</value>\n  </data>\n  <data name=\"VisualMode\" xml:space=\"preserve\">\n    <value>Vizualinis režimas</value>\n  </data>\n  <data name=\"VisualModesHDR\" xml:space=\"preserve\">\n    <value>Vizualiniai režimai nepasiekiami, kuomet įjungtas HDR</value>\n  </data>\n  <data name=\"VisualModesScreen\" xml:space=\"preserve\">\n    <value>Vizualiniai režimai nepasiekiami, kuomet kompiuterio ekranas išjungtas</value>\n  </data>\n  <data name=\"VolumeDown\" xml:space=\"preserve\">\n    <value>Garsumo mažinimas</value>\n  </data>\n  <data name=\"VolumeMute\" xml:space=\"preserve\">\n    <value>Garsumo nutildymas</value>\n  </data>\n  <data name=\"VolumeUp\" xml:space=\"preserve\">\n    <value>Garsumo didinimas</value>\n  </data>\n  <data name=\"WindowTop\" xml:space=\"preserve\">\n    <value>Visada rodyti programėlės langą viršuje</value>\n  </data>\n  <data name=\"Zoom\" xml:space=\"preserve\">\n    <value>Mastelis</value>\n  </data>\n  <data name=\"Donate\" xml:space=\"preserve\">\n    <value>Paremti</value>\n  </data>\n  <data name=\"Legend\" xml:space=\"preserve\">\n    <value>Legenda</value>\n  </data>\n  <data name=\"LegendGray\" xml:space=\"preserve\">\n    <value>Nepavyko patikrinti vietinės versijos</value>\n    <comment>Can't check local version</comment>\n  </data>\n  <data name=\"LegendRed\" xml:space=\"preserve\">\n    <value>Išleista nauja versija</value>\n    <comment>Update Available</comment>\n  </data>\n  <data name=\"LegendGreen\" xml:space=\"preserve\">\n    <value>Atnaujinta</value>\n    <comment>Updated</comment>\n  </data>\n  <data name=\"SlashBounce\" xml:space=\"preserve\">\n    <value>Atšokimas</value>\n  </data>\n  <data name=\"SlashMode\" xml:space=\"preserve\">\n    <value>Kirtis</value>\n  </data>\n  <data name=\"SlashLoading\" xml:space=\"preserve\">\n    <value>Įkėlimas</value>\n  </data>\n  <data name=\"SlashBitStream\" xml:space=\"preserve\">\n    <value>Bitų srautas</value>\n  </data>\n  <data name=\"SlashTransmission\" xml:space=\"preserve\">\n    <value>Perdavimas</value>\n  </data>\n  <data name=\"SlashFlow\" xml:space=\"preserve\">\n    <value>Srautas</value>\n  </data>\n  <data name=\"SlashFlux\" xml:space=\"preserve\">\n    <value>„Flux“</value>\n  </data>\n  <data name=\"SlashPhantom\" xml:space=\"preserve\">\n    <value>Fantomas</value>\n  </data>\n  <data name=\"SlashSpectrum\" xml:space=\"preserve\">\n    <value>Spektras</value>\n  </data>\n  <data name=\"SlashHazard\" xml:space=\"preserve\">\n    <value>Grėsmė</value>\n  </data>\n  <data name=\"SlashInterfacing\" xml:space=\"preserve\">\n    <value>Sąveika</value>\n  </data>\n  <data name=\"SlashRamp\" xml:space=\"preserve\">\n    <value>Rampa</value>\n  </data>\n  <data name=\"SlashGameOver\" xml:space=\"preserve\">\n    <value>Žaidimo pabaiga</value>\n  </data>\n  <data name=\"SlashStart\" xml:space=\"preserve\">\n    <value>Pradėti</value>\n  </data>\n  <data name=\"SlashBuzzer\" xml:space=\"preserve\">\n    <value>„Buzzer“</value>\n  </data>\n  <data name=\"SlashStatic\" xml:space=\"preserve\">\n    <value>Statinis</value>\n  </data>\n  <data name=\"SlashBatteryLevel\" xml:space=\"preserve\">\n    <value>Baterijos įkrovos lygis</value>\n  </data>\n  <data name=\"IntervalOff\" xml:space=\"preserve\">\n    <value>Intervalas išjungtas</value>\n  </data>\n  <data name=\"IntervalSeconds\" xml:space=\"preserve\">\n    <value>Intervalas {0} s.</value>\n  </data>\n  <data name=\"DisableDynamicLighting\" xml:space=\"preserve\">\n    <value>Išjunkite „Windows“ &gt; „Dinaminis apšvietimas“</value>\n  </data>\n  <data name=\"AmbientModeResources\" xml:space=\"preserve\">\n    <value>„Ambient“ režimas gali padidinti energijos suvartojimą</value>\n  </data>\n  <data name=\"MouseMotionSync\" xml:space=\"preserve\">\n    <value>Motion Sync</value>\n  </data>\n  <data name=\"MouseZoneMode\" xml:space=\"preserve\">\n    <value>Zone Mode</value>\n  </data>\n</root>"
  },
  {
    "path": "app/Properties/Strings.pl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" id=\"root\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\"/>\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"name\" type=\"xsd:string\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\"/>\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Acceleration\" xml:space=\"preserve\">\n    <value>Przyśpieszenie</value>\n  </data>\n  <data name=\"ACPIError\" xml:space=\"preserve\">\n    <value>Nie można odnaleźć sterownika ASUS ACPI. Aplikacja nie może bez niego funkcjonować. Spróbuj zainstalować Asus System Control Interface</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestart\" xml:space=\"preserve\">\n    <value>Uruchom ponownie, aby zastosować ustawienia</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestartTitle\" xml:space=\"preserve\">\n    <value>Uruchomić ponownie teraz?</value>\n  </data>\n  <data name=\"AlertDGPU\" xml:space=\"preserve\">\n    <value>Wygląda na to, że GPU jest mocno obciążone. Wyłączyć?</value>\n  </data>\n  <data name=\"AlertDGPUTitle\" xml:space=\"preserve\">\n    <value>Tryb Eco</value>\n  </data>\n  <data name=\"AlertUltimateOff\" xml:space=\"preserve\">\n    <value>Wyłączenie trybu Ultimate wymaga ponownego uruchomienia</value>\n  </data>\n  <data name=\"AlertUltimateOn\" xml:space=\"preserve\">\n    <value>Tryb Ultimate wymaga ponownego uruchomienia</value>\n  </data>\n  <data name=\"AlertUltimateTitle\" xml:space=\"preserve\">\n    <value>Uruchomić ponownie teraz?</value>\n  </data>\n  <data name=\"AllyController\" xml:space=\"preserve\">\n    <value>Kontroler Ally</value>\n  </data>\n  <data name=\"AnimationSpeed\" xml:space=\"preserve\">\n    <value>Prędkość animacji</value>\n  </data>\n  <data name=\"AnimeMatrix\" xml:space=\"preserve\">\n    <value>Anime Matrix</value>\n  </data>\n  <data name=\"AppAlreadyRunning\" xml:space=\"preserve\">\n    <value>Aplikacja jest już uruchomiona</value>\n  </data>\n  <data name=\"AppAlreadyRunningText\" xml:space=\"preserve\">\n    <value>G-Helper jest już uruchomiony. Sprawdź obszar powiadomień na pasku zadań.</value>\n  </data>\n  <data name=\"Apply\" xml:space=\"preserve\">\n    <value>Zastosuj</value>\n  </data>\n  <data name=\"ApplyFanCurve\" xml:space=\"preserve\">\n    <value>Zastosuj krzywe</value>\n  </data>\n  <data name=\"ApplyPowerLimits\" xml:space=\"preserve\">\n    <value>Zastosuj limity</value>\n  </data>\n  <data name=\"ApplyWindowsPowerPlan\" xml:space=\"preserve\">\n    <value>Dostosuj systemowy Tryb Zasilania</value>\n  </data>\n  <data name=\"APUMemory\" xml:space=\"preserve\">\n    <value>Pamięć przypisana do GPU</value>\n  </data>\n  <data name=\"AsusServicesRunning\" xml:space=\"preserve\">\n    <value>Uruchomione usługi Asus</value>\n  </data>\n  <data name=\"AuraBatteryState\" xml:space=\"preserve\">\n    <value>Stan baterii</value>\n  </data>\n  <data name=\"AuraBreathe\" xml:space=\"preserve\">\n    <value>Oddychanie</value>\n  </data>\n  <data name=\"AuraClockwise\" xml:space=\"preserve\">\n    <value>W prawo</value>\n  </data>\n  <data name=\"AuraColorCycle\" xml:space=\"preserve\">\n    <value>Pętla kolorów</value>\n  </data>\n  <data name=\"AuraComet\" xml:space=\"preserve\">\n    <value>Kometa</value>\n  </data>\n  <data name=\"AuraCounterClockwise\" xml:space=\"preserve\">\n    <value>W lewo</value>\n  </data>\n  <data name=\"AuraFast\" xml:space=\"preserve\">\n    <value>Szybka</value>\n  </data>\n  <data name=\"AuraLightingMode\" xml:space=\"preserve\">\n    <value>Tryb oświetlenia</value>\n  </data>\n  <data name=\"AuraNormal\" xml:space=\"preserve\">\n    <value>Normalna</value>\n  </data>\n  <data name=\"AuraRainbow\" xml:space=\"preserve\">\n    <value>Tęcza</value>\n  </data>\n  <data name=\"AuraRandomColor\" xml:space=\"preserve\">\n    <value>Losowo</value>\n  </data>\n  <data name=\"AuraReact\" xml:space=\"preserve\">\n    <value>Tryb reaktywny</value>\n  </data>\n  <data name=\"AuraSlow\" xml:space=\"preserve\">\n    <value>Powolna</value>\n  </data>\n  <data name=\"AuraStatic\" xml:space=\"preserve\">\n    <value>Statyczny</value>\n  </data>\n  <data name=\"AuraStrobe\" xml:space=\"preserve\">\n    <value>Stroboskop</value>\n  </data>\n  <data name=\"AuraZoneAll\" xml:space=\"preserve\">\n    <value>Wszystko</value>\n  </data>\n  <data name=\"AuraZoneDock\" xml:space=\"preserve\">\n    <value>Dock</value>\n  </data>\n  <data name=\"AuraZoneLogo\" xml:space=\"preserve\">\n    <value>Logo</value>\n  </data>\n  <data name=\"AuraZoneScroll\" xml:space=\"preserve\">\n    <value>Rolka</value>\n  </data>\n  <data name=\"AuraZoneUnderglow\" xml:space=\"preserve\">\n    <value>Dolna poświata</value>\n  </data>\n  <data name=\"AutoApply\" xml:space=\"preserve\">\n    <value>Zastosuj automatycznie</value>\n  </data>\n  <data name=\"AutoMode\" xml:space=\"preserve\">\n    <value>Auto</value>\n  </data>\n  <data name=\"AutoRefreshTooltip\" xml:space=\"preserve\">\n    <value>Automatycznie ustaw odświeżanie 60 Hz w czasie pracy na baterii</value>\n  </data>\n  <data name=\"Awake\" xml:space=\"preserve\">\n    <value>Włączone</value>\n  </data>\n  <data name=\"BacklightLow\" xml:space=\"preserve\">\n    <value>Niskie</value>\n  </data>\n  <data name=\"BacklightMax\" xml:space=\"preserve\">\n    <value>Wysokie</value>\n  </data>\n  <data name=\"BacklightMid\" xml:space=\"preserve\">\n    <value>Średnie</value>\n  </data>\n  <data name=\"BacklightOff\" xml:space=\"preserve\">\n    <value>Wyłączone</value>\n  </data>\n  <data name=\"BacklightTimeout\" xml:space=\"preserve\">\n    <value>Limit czasu podłączonego / na baterii (0 - Włączony)</value>\n  </data>\n  <data name=\"BacklightTimeoutBattery\" xml:space=\"preserve\">\n    <value>Czas podświetlenia na baterii</value>\n  </data>\n  <data name=\"BacklightTimeoutPlugged\" xml:space=\"preserve\">\n    <value>Czas podświetlenia po podłączeniu</value>\n  </data>\n  <data name=\"Balanced\" xml:space=\"preserve\">\n    <value>Balans</value>\n  </data>\n  <data name=\"BatteryCharge\" xml:space=\"preserve\">\n    <value>Naładowanie</value>\n  </data>\n  <data name=\"BatteryChargeLimit\" xml:space=\"preserve\">\n    <value>Limit ładowania baterii</value>\n  </data>\n  <data name=\"BatteryHealth\" xml:space=\"preserve\">\n    <value>Stan baterii</value>\n  </data>\n  <data name=\"BatteryLimitFull\" xml:space=\"preserve\">\n    <value>Jednorazowo naładuj do 100%</value>\n  </data>\n  <data name=\"Binding\" xml:space=\"preserve\">\n    <value>Przypisanie klawiszy</value>\n  </data>\n  <data name=\"BindingPrimary\" xml:space=\"preserve\">\n    <value>Podstawowe</value>\n  </data>\n  <data name=\"BindingSecondary\" xml:space=\"preserve\">\n    <value>Drugorzędne</value>\n  </data>\n  <data name=\"BiosAndDriverUpdates\" xml:space=\"preserve\">\n    <value>Aktualizacje BIOS i sterowników</value>\n  </data>\n  <data name=\"Boot\" xml:space=\"preserve\">\n    <value>Uruchamianie</value>\n  </data>\n  <data name=\"BootSound\" xml:space=\"preserve\">\n    <value>Dźwięk podczas rozruchu</value>\n  </data>\n  <data name=\"Brightness\" xml:space=\"preserve\">\n    <value>Jasność</value>\n  </data>\n  <data name=\"BrightnessDown\" xml:space=\"preserve\">\n    <value>Zmniejsz jasność</value>\n  </data>\n  <data name=\"BrightnessUp\" xml:space=\"preserve\">\n    <value>Zwiększ jasność</value>\n  </data>\n  <data name=\"BWTrayIcon\" xml:space=\"preserve\">\n    <value>Czarnobiała ikona obszaru powiadomień</value>\n  </data>\n  <data name=\"Calibrate\" xml:space=\"preserve\">\n    <value>Kalibruj</value>\n  </data>\n  <data name=\"Charging\" xml:space=\"preserve\">\n    <value>Ładowanie</value>\n  </data>\n  <data name=\"Color\" xml:space=\"preserve\">\n    <value>Kolor</value>\n  </data>\n  <data name=\"Contrast\" xml:space=\"preserve\">\n    <value>Kontrast</value>\n  </data>\n  <data name=\"Controller\" xml:space=\"preserve\">\n    <value>Kontroler</value>\n  </data>\n  <data name=\"CPUBoost\" xml:space=\"preserve\">\n    <value>Zwiększenie taktowania CPU</value>\n  </data>\n  <data name=\"Custom\" xml:space=\"preserve\">\n    <value>Niestandardowy</value>\n  </data>\n  <data name=\"Deceleration\" xml:space=\"preserve\">\n    <value>Spowolnienie</value>\n  </data>\n  <data name=\"Default\" xml:space=\"preserve\">\n    <value>Domyślny</value>\n  </data>\n  <data name=\"DisableController\" xml:space=\"preserve\">\n    <value>Wyłącz kontroler</value>\n  </data>\n  <data name=\"DisableOnLidClose\" xml:space=\"preserve\">\n    <value>Wyłącz po zamknięciu pokrywy</value>\n  </data>\n  <data name=\"DisableOverdrive\" xml:space=\"preserve\">\n    <value>Wyłącz funkcję Overdrive monitora</value>\n  </data>\n  <data name=\"Discharging\" xml:space=\"preserve\">\n    <value>Zużycie mocy</value>\n  </data>\n  <data name=\"DownloadColorProfiles\" xml:space=\"preserve\">\n    <value>Pobieranie profili kolorów</value>\n  </data>\n  <data name=\"DownloadUpdate\" xml:space=\"preserve\">\n    <value>Pobierz</value>\n  </data>\n  <data name=\"DriverAndSoftware\" xml:space=\"preserve\">\n    <value>Sterowniki i oprogramowanie</value>\n  </data>\n  <data name=\"EcoGPUTooltip\" xml:space=\"preserve\">\n    <value>Wyłącza dedykowane GPU aby oszczędzić baterię</value>\n  </data>\n  <data name=\"EcoMode\" xml:space=\"preserve\">\n    <value>Eco</value>\n  </data>\n  <data name=\"EnableGPUOnShutdown\" xml:space=\"preserve\">\n    <value>Aktywuj GPU przy wyłączaniu (zapobiega problemom z trybem Eco)</value>\n  </data>\n  <data name=\"EnableOptimusText\" xml:space=\"preserve\">\n    <value>Wyłączenie dGPU przez przejście do trybu Eco, podczas gdy tryb wyświetlania w Panelu sterowania NVIDIA nie jest ustawiony na Optimus, może powodować problemy z regulacją jasności do czasu następnego restartu systemu. \n\nNadal chcesz kontynuować?</value>\n  </data>\n  <data name=\"EnableOptimusTitle\" xml:space=\"preserve\">\n    <value>Tryb wyświetlania NVIDIA nie jest ustawiony na Optimus</value>\n  </data>\n  <data name=\"EnergySettings\" xml:space=\"preserve\">\n    <value>Ustawienia zasilania</value>\n  </data>\n  <data name=\"Export\" xml:space=\"preserve\">\n    <value>Eksportuj profil</value>\n  </data>\n  <data name=\"Extra\" xml:space=\"preserve\">\n    <value>Ustawienia</value>\n  </data>\n  <data name=\"ExtraSettings\" xml:space=\"preserve\">\n    <value>Dodatkowe ustawienia</value>\n  </data>\n  <data name=\"FactoryDefaults\" xml:space=\"preserve\">\n    <value>Ustawienia fabryczne</value>\n  </data>\n  <data name=\"FanCurves\" xml:space=\"preserve\">\n    <value>Krzywe wentylatorów</value>\n  </data>\n  <data name=\"FanProfileCPU\" xml:space=\"preserve\">\n    <value>Krzywa wentylatora CPU</value>\n  </data>\n  <data name=\"FanProfileGPU\" xml:space=\"preserve\">\n    <value>Krzywa wentylatora GPU</value>\n  </data>\n  <data name=\"FanProfileMid\" xml:space=\"preserve\">\n    <value>Krzywa wentylatora centralnego</value>\n  </data>\n  <data name=\"FanProfiles\" xml:space=\"preserve\">\n    <value>Tryb krzywych</value>\n  </data>\n  <data name=\"FansAndPower\" xml:space=\"preserve\">\n    <value>Wentylatory i moc</value>\n  </data>\n  <data name=\"FanSpeed\" xml:space=\"preserve\">\n    <value>Went</value>\n  </data>\n  <data name=\"FansPower\" xml:space=\"preserve\">\n    <value>Dostosuj</value>\n  </data>\n  <data name=\"FlickerFreeDimming\" xml:space=\"preserve\">\n    <value>Przyciemnianie bez migotania</value>\n  </data>\n  <data name=\"FnLock\" xml:space=\"preserve\">\n    <value>Używaj klawiszy funkcyjnych bez przycisku Fn</value>\n  </data>\n  <data name=\"FnLockOff\" xml:space=\"preserve\">\n    <value>Fn-Lock wył.</value>\n  </data>\n  <data name=\"FnLockOn\" xml:space=\"preserve\">\n    <value>Fn-Lock wł.</value>\n  </data>\n  <data name=\"GPUBoost\" xml:space=\"preserve\">\n    <value>Dynamic Boost</value>\n  </data>\n  <data name=\"GPUChanging\" xml:space=\"preserve\">\n    <value>Przełączanie</value>\n  </data>\n  <data name=\"GPUCoreClockOffset\" xml:space=\"preserve\">\n    <value>Przesunięcie zegara rdzenia</value>\n  </data>\n  <data name=\"GPUMemoryClockOffset\" xml:space=\"preserve\">\n    <value>Przesunięcie zegara pamięci</value>\n  </data>\n  <data name=\"GPUMode\" xml:space=\"preserve\">\n    <value>Tryb GPU</value>\n  </data>\n  <data name=\"GPUModeEco\" xml:space=\"preserve\">\n    <value>tylko iGPU</value>\n  </data>\n  <data name=\"GPUModeStandard\" xml:space=\"preserve\">\n    <value>iGPU + dGPU</value>\n  </data>\n  <data name=\"GPUModeUltimate\" xml:space=\"preserve\">\n    <value>tylko dGPU</value>\n  </data>\n  <data name=\"GPUPower\" xml:space=\"preserve\">\n    <value>Moc GPU</value>\n  </data>\n  <data name=\"GPUSettings\" xml:space=\"preserve\">\n    <value>Ustawienia GPU</value>\n  </data>\n  <data name=\"GPUTempTarget\" xml:space=\"preserve\">\n    <value>Temperatura docelowa</value>\n  </data>\n  <data name=\"HibernateAfter\" xml:space=\"preserve\">\n    <value>Czas przejścia w hibernację na baterii (0 - wcale)</value>\n  </data>\n  <data name=\"High\" xml:space=\"preserve\">\n    <value>Wysoka</value>\n  </data>\n  <data name=\"ImageRotation\" xml:space=\"preserve\">\n    <value>Obracanie obrazu</value>\n  </data>\n  <data name=\"Import\" xml:space=\"preserve\">\n    <value>Importuj profil</value>\n  </data>\n  <data name=\"KeyBindings\" xml:space=\"preserve\">\n    <value>Ustawienia klawiszy skrótów</value>\n  </data>\n  <data name=\"Keyboard\" xml:space=\"preserve\">\n    <value>Klawiatura</value>\n  </data>\n  <data name=\"KillGpuApps\" xml:space=\"preserve\">\n    <value>Zatrzymaj wszystkie aplikacje używające GPU podczas przełączania na Eco</value>\n  </data>\n  <data name=\"LaptopBacklight\" xml:space=\"preserve\">\n    <value>Podświetlenie</value>\n  </data>\n  <data name=\"LaptopKeyboard\" xml:space=\"preserve\">\n    <value>Klawiatura laptopa</value>\n  </data>\n  <data name=\"LaptopScreen\" xml:space=\"preserve\">\n    <value>Ekran laptopa</value>\n  </data>\n  <data name=\"LEDStatusIndicators\" xml:space=\"preserve\">\n    <value>Wskaźniki stanu</value>\n  </data>\n  <data name=\"Lid\" xml:space=\"preserve\">\n    <value>Pokrywa</value>\n  </data>\n  <data name=\"Lightbar\" xml:space=\"preserve\">\n    <value>Lightbar</value>\n  </data>\n  <data name=\"Lighting\" xml:space=\"preserve\">\n    <value>Oświetlenie</value>\n  </data>\n  <data name=\"LockScreen\" xml:space=\"preserve\">\n    <value>Ekran blokady</value>\n  </data>\n  <data name=\"Logo\" xml:space=\"preserve\">\n    <value>Logo</value>\n  </data>\n  <data name=\"Low\" xml:space=\"preserve\">\n    <value>Niska</value>\n  </data>\n  <data name=\"LSDeadzones\" xml:space=\"preserve\">\n    <value>Martwe strefy lewego joysticka</value>\n  </data>\n  <data name=\"LTDeadzones\" xml:space=\"preserve\">\n    <value>Martwe strefy lewego triggera</value>\n  </data>\n  <data name=\"MatrixAudio\" xml:space=\"preserve\">\n    <value>Wizualizer muzyki</value>\n  </data>\n  <data name=\"MatrixBanner\" xml:space=\"preserve\">\n    <value>Binarny</value>\n  </data>\n  <data name=\"MatrixBright\" xml:space=\"preserve\">\n    <value>Jasny</value>\n  </data>\n  <data name=\"MatrixClock\" xml:space=\"preserve\">\n    <value>Zegar</value>\n  </data>\n  <data name=\"MatrixDim\" xml:space=\"preserve\">\n    <value>Ciemny</value>\n  </data>\n  <data name=\"MatrixLogo\" xml:space=\"preserve\">\n    <value>Logo ROG</value>\n  </data>\n  <data name=\"MatrixMedium\" xml:space=\"preserve\">\n    <value>Średni</value>\n  </data>\n  <data name=\"MatrixOff\" xml:space=\"preserve\">\n    <value>Wyłączony</value>\n  </data>\n  <data name=\"MatrixPicture\" xml:space=\"preserve\">\n    <value>Obraz</value>\n  </data>\n  <data name=\"MaxRefreshTooltip\" xml:space=\"preserve\">\n    <value>Maksymalna częstotliwość odświeżania dla mniejszych opóźnień</value>\n  </data>\n  <data name=\"MinRefreshTooltip\" xml:space=\"preserve\">\n    <value>Częstotliwość odświeżania 60 Hz dla oszczędzania baterii</value>\n  </data>\n  <data name=\"Minute\" xml:space=\"preserve\">\n    <value>min.</value>\n  </data>\n  <data name=\"Minutes\" xml:space=\"preserve\">\n    <value>min.</value>\n  </data>\n  <data name=\"MouseAngleSnapping\" xml:space=\"preserve\">\n    <value>Angle Snapping / Tuning</value>\n  </data>\n  <data name=\"MouseAutoPowerOff\" xml:space=\"preserve\">\n    <value>Przejście w tryb uśpienia po</value>\n  </data>\n  <data name=\"MouseButtonResponse\" xml:space=\"preserve\">\n    <value>Reakcja przycisków</value>\n  </data>\n  <data name=\"MouseImportFailed\" xml:space=\"preserve\">\n    <value>Błąd importu. Wybrany plik jest uszkodzony lub nie jest poprawnym profilem myszy.</value>\n  </data>\n  <data name=\"MouseLiftOffDistance\" xml:space=\"preserve\">\n    <value>Wysokość reakcji sensora</value>\n  </data>\n  <data name=\"MouseLowBatteryWarning\" xml:space=\"preserve\">\n    <value>Ostrzeżenie o niskim poziomie baterii</value>\n  </data>\n  <data name=\"MousePerformance\" xml:space=\"preserve\">\n    <value>Wydajność</value>\n  </data>\n  <data name=\"MouseSynchronize\" xml:space=\"preserve\">\n    <value>Synchronizuj z myszką</value>\n  </data>\n  <data name=\"Multizone\" xml:space=\"preserve\">\n    <value>Wiele stref</value>\n  </data>\n  <data name=\"MultizoneStrong\" xml:space=\"preserve\">\n    <value>Wiele stref (mocniejsze)</value>\n  </data>\n  <data name=\"Muted\" xml:space=\"preserve\">\n    <value>Wyciszony</value>\n  </data>\n  <data name=\"MuteMic\" xml:space=\"preserve\">\n    <value>Wyciszenie mikrofonu</value>\n  </data>\n  <data name=\"Never\" xml:space=\"preserve\">\n    <value>Nigdy</value>\n  </data>\n  <data name=\"NewUpdates\" xml:space=\"preserve\">\n    <value>Nowe aktualizacje</value>\n  </data>\n  <data name=\"NoNewUpdates\" xml:space=\"preserve\">\n    <value>Brak aktualizacji</value>\n  </data>\n  <data name=\"NotConnected\" xml:space=\"preserve\">\n    <value>Nie połączono</value>\n  </data>\n  <data name=\"Off\" xml:space=\"preserve\">\n    <value>Wyłączony</value>\n  </data>\n  <data name=\"On\" xml:space=\"preserve\">\n    <value>Włączony</value>\n  </data>\n  <data name=\"OneZone\" xml:space=\"preserve\">\n    <value>Jedna strefa</value>\n  </data>\n  <data name=\"OpenGHelper\" xml:space=\"preserve\">\n    <value>Otwórz okno G-Helper</value>\n  </data>\n  <data name=\"Optimized\" xml:space=\"preserve\">\n    <value>Optymalny</value>\n  </data>\n  <data name=\"OptimizedGPUTooltip\" xml:space=\"preserve\">\n    <value>Przełącza na Eco w czasie pracy na baterii i na Standard po podłączeniu</value>\n  </data>\n  <data name=\"OptimizedUSBC\" xml:space=\"preserve\">\n    <value>W trybie Optymalnym wyłącz GPU podczas ładowania przez USB-C</value>\n  </data>\n  <data name=\"Other\" xml:space=\"preserve\">\n    <value>Inne</value>\n  </data>\n  <data name=\"Overdrive\" xml:space=\"preserve\">\n    <value>Overdrive</value>\n  </data>\n  <data name=\"PerformanceMode\" xml:space=\"preserve\">\n    <value>Tryb zasilania</value>\n  </data>\n  <data name=\"Peripherals\" xml:space=\"preserve\">\n    <value>Urządzenia peryferyjne</value>\n  </data>\n  <data name=\"PictureGif\" xml:space=\"preserve\">\n    <value>Obraz / GIF</value>\n  </data>\n  <data name=\"PlayPause\" xml:space=\"preserve\">\n    <value>Odtwórz / Pauza</value>\n  </data>\n  <data name=\"PollingRate\" xml:space=\"preserve\">\n    <value>Częstotliwość raportowania</value>\n  </data>\n  <data name=\"PowerLimits\" xml:space=\"preserve\">\n    <value>Limit mocy</value>\n  </data>\n  <data name=\"PPTExperimental\" xml:space=\"preserve\">\n    <value>Ustawienie limitu mocy jest funkcją eksperymentalną. Używaj ostrożnie, na własną odpowiedzialność!</value>\n  </data>\n  <data name=\"PrintScreen\" xml:space=\"preserve\">\n    <value>Zrzut ekranu</value>\n  </data>\n  <data name=\"Profile\" xml:space=\"preserve\">\n    <value>Profil</value>\n  </data>\n  <data name=\"Quit\" xml:space=\"preserve\">\n    <value>Zamknij</value>\n  </data>\n  <data name=\"Reset\" xml:space=\"preserve\">\n    <value>Reset</value>\n  </data>\n  <data name=\"RestartGPU\" xml:space=\"preserve\">\n    <value>Coś korzysta z dGPU, uniemożliwiając włączenie trybu Eco. Czy G-Helper ma zresetować dGPU w Menadżerze Urządzeń? (Korzystasz na własne ryzyko)</value>\n  </data>\n  <data name=\"RPM\" xml:space=\"preserve\">\n    <value>RPM</value>\n  </data>\n  <data name=\"RSDeadzones\" xml:space=\"preserve\">\n    <value>Martwe strefy prawego joysticka</value>\n  </data>\n  <data name=\"RTDeadzones\" xml:space=\"preserve\">\n    <value>Martwe strefy prawego triggera</value>\n  </data>\n  <data name=\"RunOnStartup\" xml:space=\"preserve\">\n    <value>Uruchom przy starcie</value>\n  </data>\n  <data name=\"ScalingQuality\" xml:space=\"preserve\">\n    <value>Jakość skalowania</value>\n  </data>\n  <data name=\"ScreenPadDown\" xml:space=\"preserve\">\n    <value>Zmniejsz jasność ScreenPad</value>\n  </data>\n  <data name=\"ScreenPadUp\" xml:space=\"preserve\">\n    <value>Zwiększ jasność ScreenPad</value>\n  </data>\n  <data name=\"Shutdown\" xml:space=\"preserve\">\n    <value>Zamknij</value>\n  </data>\n  <data name=\"Silent\" xml:space=\"preserve\">\n    <value>Cichy</value>\n  </data>\n  <data name=\"Sleep\" xml:space=\"preserve\">\n    <value>Uśpij</value>\n  </data>\n  <data name=\"StandardGPUTooltip\" xml:space=\"preserve\">\n    <value>Włącza dGPU dla standardowego użycia</value>\n  </data>\n  <data name=\"StandardMode\" xml:space=\"preserve\">\n    <value>Standard</value>\n  </data>\n  <data name=\"Start\" xml:space=\"preserve\">\n    <value>Start</value>\n  </data>\n  <data name=\"StartingServices\" xml:space=\"preserve\">\n    <value>Uruchamianie usług</value>\n  </data>\n  <data name=\"StartupError\" xml:space=\"preserve\">\n    <value>Błąd uruchamiania</value>\n  </data>\n  <data name=\"Stop\" xml:space=\"preserve\">\n    <value>Stop</value>\n  </data>\n  <data name=\"StopGPUApps\" xml:space=\"preserve\">\n    <value>Zatrzymaj aplikacje używające GPU</value>\n  </data>\n  <data name=\"StoppingServices\" xml:space=\"preserve\">\n    <value>Zatrzymywanie usług</value>\n  </data>\n  <data name=\"ToggleAura\" xml:space=\"preserve\">\n    <value>Przełącz Aura</value>\n  </data>\n  <data name=\"ToggleClamshellMode\" xml:space=\"preserve\">\n    <value>Automatyczny tryb pracy z zamkniętą pokrywą</value>\n  </data>\n  <data name=\"ToggleFnLock\" xml:space=\"preserve\">\n    <value>Przełącz Fn-Lock</value>\n  </data>\n  <data name=\"ToggleMiniled\" xml:space=\"preserve\">\n    <value>Przełącz MiniLED</value>\n  </data>\n  <data name=\"ToggleScreen\" xml:space=\"preserve\">\n    <value>Przełącz ekran</value>\n  </data>\n  <data name=\"ToggleTouchscreen\" xml:space=\"preserve\">\n    <value>Włącz/wyłącz ekran dotykowy</value>\n  </data>\n  <data name=\"Touchscreen\" xml:space=\"preserve\">\n    <value>Ekran dotykowy</value>\n  </data>\n  <data name=\"Turbo\" xml:space=\"preserve\">\n    <value>Turbo</value>\n  </data>\n  <data name=\"TurnedOff\" xml:space=\"preserve\">\n    <value>Wyłączony</value>\n  </data>\n  <data name=\"TurnOffOnBattery\" xml:space=\"preserve\">\n    <value>Wyłączony na baterii</value>\n  </data>\n  <data name=\"UltimateGPUTooltip\" xml:space=\"preserve\">\n    <value>Podłącza ekran laptopa bezpośrednio do dedykowanego GPU</value>\n  </data>\n  <data name=\"UltimateMode\" xml:space=\"preserve\">\n    <value>Ultimate</value>\n  </data>\n  <data name=\"UndervoltingRisky\" xml:space=\"preserve\">\n    <value>Undervolting jest funkcją eksperymentalną i ryzykowną. Jeżeli zastosowane wartości są za niskie dla Twojego urządzenia, może ono działać niestabilnie, wyłączyć się lub uszkodzić dane. Chcąc wypróbować tę funkcję, zacznij od niewielkich wartości, zastosuj je i sprawdź efekt.</value>\n  </data>\n  <data name=\"Unmuted\" xml:space=\"preserve\">\n    <value>Włączony</value>\n  </data>\n  <data name=\"Updates\" xml:space=\"preserve\">\n    <value>Aktualizacje</value>\n  </data>\n  <data name=\"VersionLabel\" xml:space=\"preserve\">\n    <value>Wersja</value>\n  </data>\n  <data name=\"VibrationStrength\" xml:space=\"preserve\">\n    <value>Siła wibracji</value>\n  </data>\n  <data name=\"VisualMode\" xml:space=\"preserve\">\n    <value>Tryb wyświetlania</value>\n  </data>\n  <data name=\"VisualModesHDR\" xml:space=\"preserve\">\n    <value>Tryby wyświetlania nie są dostępne, kiedy HDR jest włączone</value>\n  </data>\n  <data name=\"VisualModesScreen\" xml:space=\"preserve\">\n    <value>Tryby wyświetlania nie są dostępne, kiedy ekran laptopa jest wyłączony</value>\n  </data>\n  <data name=\"VolumeDown\" xml:space=\"preserve\">\n    <value>Zmniejsz głośność</value>\n  </data>\n  <data name=\"VolumeMute\" xml:space=\"preserve\">\n    <value>Wyciszenie</value>\n  </data>\n  <data name=\"VolumeUp\" xml:space=\"preserve\">\n    <value>Zwiększ głośność</value>\n  </data>\n  <data name=\"WindowTop\" xml:space=\"preserve\">\n    <value>Zachowaj okno aplikacji zawsze na wierzchu</value>\n  </data>\n  <data name=\"Zoom\" xml:space=\"preserve\">\n    <value>Przybliżenie</value>\n  </data>\n  <data name=\"Donate\" xml:space=\"preserve\">\n    <value>Wesprzyj</value>\n  </data>\n  <data name=\"Legend\" xml:space=\"preserve\">\n    <value>Legenda</value>\n  </data>\n  <data name=\"LegendGray\" xml:space=\"preserve\">\n    <value>Brak informacji</value>\n    <comment>Can't check local version</comment>\n  </data>\n  <data name=\"LegendRed\" xml:space=\"preserve\">\n    <value>Dostępna aktualizacja</value>\n    <comment>Update Available</comment>\n  </data>\n  <data name=\"LegendGreen\" xml:space=\"preserve\">\n    <value>Wersja aktualna</value>\n    <comment>Updated</comment>\n  </data>\n  <data name=\"SlashBounce\" xml:space=\"preserve\">\n    <value>Skaczący</value>\n  </data>\n  <data name=\"SlashMode\" xml:space=\"preserve\">\n    <value>Slash</value>\n  </data>\n  <data name=\"SlashLoading\" xml:space=\"preserve\">\n    <value>Ładowanie</value>\n  </data>\n  <data name=\"SlashBitStream\" xml:space=\"preserve\">\n    <value>Strumień bitów</value>\n  </data>\n  <data name=\"SlashTransmission\" xml:space=\"preserve\">\n    <value>Transmisja</value>\n  </data>\n  <data name=\"SlashFlow\" xml:space=\"preserve\">\n    <value>Płynny</value>\n  </data>\n  <data name=\"SlashFlux\" xml:space=\"preserve\">\n    <value>Strumień</value>\n  </data>\n  <data name=\"SlashPhantom\" xml:space=\"preserve\">\n    <value>Fantom</value>\n  </data>\n  <data name=\"SlashSpectrum\" xml:space=\"preserve\">\n    <value>Spektrum</value>\n  </data>\n  <data name=\"SlashHazard\" xml:space=\"preserve\">\n    <value>Zagrożenie</value>\n  </data>\n  <data name=\"SlashInterfacing\" xml:space=\"preserve\">\n    <value>Interfacing</value>\n  </data>\n  <data name=\"SlashRamp\" xml:space=\"preserve\">\n    <value>Rampa</value>\n  </data>\n  <data name=\"SlashGameOver\" xml:space=\"preserve\">\n    <value>Koniec gry</value>\n  </data>\n  <data name=\"SlashStart\" xml:space=\"preserve\">\n    <value>Start</value>\n  </data>\n  <data name=\"SlashBuzzer\" xml:space=\"preserve\">\n    <value>Buzzer</value>\n  </data>\n  <data name=\"SlashStatic\" xml:space=\"preserve\">\n    <value>Statyczny</value>\n  </data>\n  <data name=\"SlashBatteryLevel\" xml:space=\"preserve\">\n    <value>Poziom baterii</value>\n  </data>\n  <data name=\"IntervalOff\" xml:space=\"preserve\">\n    <value>Bez przerwy</value>\n  </data>\n  <data name=\"IntervalSeconds\" xml:space=\"preserve\">\n    <value>Interwał {0} s</value>\n  </data>\n  <data name=\"DisableDynamicLighting\" xml:space=\"preserve\">\n    <value>Wyłącz Windows &gt; Oświetlenie dynamiczne</value>\n  </data>\n  <data name=\"AmbientModeResources\" xml:space=\"preserve\">\n    <value>Tryb ambient może zwiększyć zużycie zasobów</value>\n  </data>\n  <data name=\"MouseMotionSync\" xml:space=\"preserve\">\n    <value>Motion Sync</value>\n  </data>\n  <data name=\"MouseZoneMode\" xml:space=\"preserve\">\n    <value>Zone Mode</value>\n  </data>\n</root>"
  },
  {
    "path": "app/Properties/Strings.pt-BR.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" id=\"root\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\"/>\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"name\" type=\"xsd:string\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\"/>\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Acceleration\" xml:space=\"preserve\">\n    <value>Aceleração</value>\n  </data>\n  <data name=\"ACPIError\" xml:space=\"preserve\">\n    <value>Não foi possível conectar ao ASUS ACPI. O aplicativo não pode funcionar sem isso. Tente instalar Asus System Controle Interface</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestart\" xml:space=\"preserve\">\n    <value>Reinicie seu dispositivo para aplicar as alterações</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestartTitle\" xml:space=\"preserve\">\n    <value>Reiniciar agora?</value>\n  </data>\n  <data name=\"AlertDGPU\" xml:space=\"preserve\">\n    <value>Parece que o GPU está em uso pesado.</value>\n  </data>\n  <data name=\"AlertDGPUTitle\" xml:space=\"preserve\">\n    <value>Modo econômico</value>\n  </data>\n  <data name=\"AlertUltimateOff\" xml:space=\"preserve\">\n    <value>Passar ao Modo Final implica na reinicialização do sistema</value>\n  </data>\n  <data name=\"AlertUltimateOn\" xml:space=\"preserve\">\n    <value>Modo Ultimado necessita de reinicialização.</value>\n  </data>\n  <data name=\"AlertUltimateTitle\" xml:space=\"preserve\">\n    <value>Reiniciar agora ?</value>\n  </data>\n  <data name=\"AllyController\" xml:space=\"preserve\">\n    <value>Controle Ally</value>\n  </data>\n  <data name=\"AnimationSpeed\" xml:space=\"preserve\">\n    <value>Velocidade da Animação</value>\n  </data>\n  <data name=\"AnimeMatrix\" xml:space=\"preserve\">\n    <value>AniMe Matrix</value>\n  </data>\n  <data name=\"AppAlreadyRunning\" xml:space=\"preserve\">\n    <value>O applicativo já está em execução</value>\n  </data>\n  <data name=\"AppAlreadyRunningText\" xml:space=\"preserve\">\n    <value>G-Helper já está em execução. Verifique a barra de sistema</value>\n  </data>\n  <data name=\"Apply\" xml:space=\"preserve\">\n    <value>Aplicar</value>\n  </data>\n  <data name=\"ApplyFanCurve\" xml:space=\"preserve\">\n    <value>Aplicar a curva personalizada</value>\n  </data>\n  <data name=\"ApplyPowerLimits\" xml:space=\"preserve\">\n    <value>Aplicar as limitações de energia</value>\n  </data>\n  <data name=\"ApplyWindowsPowerPlan\" xml:space=\"preserve\">\n    <value>Ajuste automático dos modos de energia do Windows</value>\n  </data>\n  <data name=\"APUMemory\" xml:space=\"preserve\">\n    <value>Memória Atribuída à GPU</value>\n  </data>\n  <data name=\"AsusServicesRunning\" xml:space=\"preserve\">\n    <value>Serviços da Asus em execução</value>\n  </data>\n  <data name=\"AuraBatteryState\" xml:space=\"preserve\">\n    <value>Estado da bateria</value>\n  </data>\n  <data name=\"AuraBreathe\" xml:space=\"preserve\">\n    <value>Repiração</value>\n  </data>\n  <data name=\"AuraClockwise\" xml:space=\"preserve\">\n    <value>Sentido horário</value>\n  </data>\n  <data name=\"AuraColorCycle\" xml:space=\"preserve\">\n    <value>Ciclo de cores</value>\n  </data>\n  <data name=\"AuraComet\" xml:space=\"preserve\">\n    <value>Comet</value>\n  </data>\n  <data name=\"AuraCounterClockwise\" xml:space=\"preserve\">\n    <value>Sentido anti-horário</value>\n  </data>\n  <data name=\"AuraFast\" xml:space=\"preserve\">\n    <value>Rápido</value>\n  </data>\n  <data name=\"AuraLightingMode\" xml:space=\"preserve\">\n    <value>Modo de iluminação</value>\n  </data>\n  <data name=\"AuraNormal\" xml:space=\"preserve\">\n    <value>Normal</value>\n  </data>\n  <data name=\"AuraRainbow\" xml:space=\"preserve\">\n    <value>Arco-íris</value>\n  </data>\n  <data name=\"AuraRandomColor\" xml:space=\"preserve\">\n    <value>Aleatório</value>\n  </data>\n  <data name=\"AuraReact\" xml:space=\"preserve\">\n    <value>Sensível</value>\n  </data>\n  <data name=\"AuraSlow\" xml:space=\"preserve\">\n    <value>Lento</value>\n  </data>\n  <data name=\"AuraStatic\" xml:space=\"preserve\">\n    <value>Estático</value>\n  </data>\n  <data name=\"AuraStrobe\" xml:space=\"preserve\">\n    <value>Estroboscópio</value>\n  </data>\n  <data name=\"AuraZoneAll\" xml:space=\"preserve\">\n    <value>Tudo</value>\n  </data>\n  <data name=\"AuraZoneDock\" xml:space=\"preserve\">\n    <value>Dock</value>\n  </data>\n  <data name=\"AuraZoneLogo\" xml:space=\"preserve\">\n    <value>Logo</value>\n  </data>\n  <data name=\"AuraZoneScroll\" xml:space=\"preserve\">\n    <value>Roda de Rolagem</value>\n  </data>\n  <data name=\"AuraZoneUnderglow\" xml:space=\"preserve\">\n    <value>Underglow</value>\n  </data>\n  <data name=\"AutoApply\" xml:space=\"preserve\">\n    <value>Aplicar automaticamente</value>\n  </data>\n  <data name=\"AutoMode\" xml:space=\"preserve\">\n    <value>Automático</value>\n  </data>\n  <data name=\"AutoRefreshTooltip\" xml:space=\"preserve\">\n    <value>Menor taxa de atualização quando estiver na bateria</value>\n  </data>\n  <data name=\"Awake\" xml:space=\"preserve\">\n    <value>Acordado</value>\n  </data>\n  <data name=\"BacklightLow\" xml:space=\"preserve\">\n    <value>Baixo</value>\n  </data>\n  <data name=\"BacklightMax\" xml:space=\"preserve\">\n    <value>Máximo</value>\n  </data>\n  <data name=\"BacklightMid\" xml:space=\"preserve\">\n    <value>Meio</value>\n  </data>\n  <data name=\"BacklightOff\" xml:space=\"preserve\">\n    <value>Desligado</value>\n  </data>\n  <data name=\"BacklightTimeout\" xml:space=\"preserve\">\n    <value>Tempo limite plugado / na bateria (0 - ligado)</value>\n  </data>\n  <data name=\"BacklightTimeoutBattery\" xml:space=\"preserve\">\n    <value>Tempo de retroiluminação com bateria</value>\n  </data>\n  <data name=\"BacklightTimeoutPlugged\" xml:space=\"preserve\">\n    <value>Tempo de retroiluminação ligado</value>\n  </data>\n  <data name=\"Balanced\" xml:space=\"preserve\">\n    <value>Equilibrado</value>\n  </data>\n  <data name=\"BatteryCharge\" xml:space=\"preserve\">\n    <value>Carga</value>\n  </data>\n  <data name=\"BatteryChargeLimit\" xml:space=\"preserve\">\n    <value>Limite de carga</value>\n  </data>\n  <data name=\"BatteryHealth\" xml:space=\"preserve\">\n    <value>Saúde da bateria</value>\n  </data>\n  <data name=\"BatteryLimitFull\" xml:space=\"preserve\">\n    <value>Carregar uma vez até 100%</value>\n  </data>\n  <data name=\"Binding\" xml:space=\"preserve\">\n    <value>Vinculação</value>\n  </data>\n  <data name=\"BindingPrimary\" xml:space=\"preserve\">\n    <value>Primário</value>\n  </data>\n  <data name=\"BindingSecondary\" xml:space=\"preserve\">\n    <value>Secundário</value>\n  </data>\n  <data name=\"BiosAndDriverUpdates\" xml:space=\"preserve\">\n    <value>Atualizações do BIOS e drivers</value>\n  </data>\n  <data name=\"Boot\" xml:space=\"preserve\">\n    <value>Ao ligar</value>\n  </data>\n  <data name=\"BootSound\" xml:space=\"preserve\">\n    <value>Som de inicialização</value>\n  </data>\n  <data name=\"Brightness\" xml:space=\"preserve\">\n    <value>Nível do brilho</value>\n  </data>\n  <data name=\"BrightnessDown\" xml:space=\"preserve\">\n    <value>Diminuir Brilho</value>\n  </data>\n  <data name=\"BrightnessUp\" xml:space=\"preserve\">\n    <value>Aumentar Brilho</value>\n  </data>\n  <data name=\"BWTrayIcon\" xml:space=\"preserve\">\n    <value>Ícone da bandeja preto e branco</value>\n  </data>\n  <data name=\"Calibrate\" xml:space=\"preserve\">\n    <value>Calibrar</value>\n  </data>\n  <data name=\"Charging\" xml:space=\"preserve\">\n    <value>Carregando</value>\n  </data>\n  <data name=\"Color\" xml:space=\"preserve\">\n    <value>Cor</value>\n  </data>\n  <data name=\"Contrast\" xml:space=\"preserve\">\n    <value>Contraste</value>\n  </data>\n  <data name=\"Controller\" xml:space=\"preserve\">\n    <value>Controle</value>\n  </data>\n  <data name=\"CPUBoost\" xml:space=\"preserve\">\n    <value>CPU Boost</value>\n  </data>\n  <data name=\"Custom\" xml:space=\"preserve\">\n    <value>Personalizado</value>\n  </data>\n  <data name=\"Deceleration\" xml:space=\"preserve\">\n    <value>Desaceleração</value>\n  </data>\n  <data name=\"Default\" xml:space=\"preserve\">\n    <value>Padrão</value>\n  </data>\n  <data name=\"DisableController\" xml:space=\"preserve\">\n    <value>Desativar Controle</value>\n  </data>\n  <data name=\"DisableOnLidClose\" xml:space=\"preserve\">\n    <value>Desativar ao fechar a tampa</value>\n  </data>\n  <data name=\"DisableOverdrive\" xml:space=\"preserve\">\n    <value>Desativar o overdrive da tela</value>\n  </data>\n  <data name=\"Discharging\" xml:space=\"preserve\">\n    <value>Descarregando</value>\n  </data>\n  <data name=\"DownloadColorProfiles\" xml:space=\"preserve\">\n    <value>Baixar Perfis de Cor</value>\n  </data>\n  <data name=\"DownloadUpdate\" xml:space=\"preserve\">\n    <value>Baixar</value>\n  </data>\n  <data name=\"DriverAndSoftware\" xml:space=\"preserve\">\n    <value>Drivers e Software</value>\n  </data>\n  <data name=\"EcoGPUTooltip\" xml:space=\"preserve\">\n    <value>Desativar o dGPU para economizar energia</value>\n  </data>\n  <data name=\"EcoMode\" xml:space=\"preserve\">\n    <value>Econômico</value>\n  </data>\n  <data name=\"EnableGPUOnShutdown\" xml:space=\"preserve\">\n    <value>Ativar a GPU ao desligar (impede problemas com o modo Eco)</value>\n  </data>\n  <data name=\"EnableOptimusText\" xml:space=\"preserve\">\n    <value>Desativar a dGPU entrando no modo Eco enquanto o Modo de Exibição no painel de controle da NVIDIA não está definido como Optimus pode causar problemas com os controles de brilho até a próxima reinicialização.\n\nAinda quer continuar?</value>\n  </data>\n  <data name=\"EnableOptimusTitle\" xml:space=\"preserve\">\n    <value>Modo de Exibição de NVIDIA não está definido como Optimus</value>\n  </data>\n  <data name=\"EnergySettings\" xml:space=\"preserve\">\n    <value>Configurações de Energia</value>\n  </data>\n  <data name=\"Export\" xml:space=\"preserve\">\n    <value>Exportar Perfil</value>\n  </data>\n  <data name=\"Extra\" xml:space=\"preserve\">\n    <value>Adicional</value>\n  </data>\n  <data name=\"ExtraSettings\" xml:space=\"preserve\">\n    <value>Configurações adicionais</value>\n  </data>\n  <data name=\"FactoryDefaults\" xml:space=\"preserve\">\n    <value>Padrão de fábrica</value>\n  </data>\n  <data name=\"FanCurves\" xml:space=\"preserve\">\n    <value>Curvas de ventilador</value>\n  </data>\n  <data name=\"FanProfileCPU\" xml:space=\"preserve\">\n    <value>Perfil de ventilador CPU</value>\n  </data>\n  <data name=\"FanProfileGPU\" xml:space=\"preserve\">\n    <value>Perfil de ventilador GPU</value>\n  </data>\n  <data name=\"FanProfileMid\" xml:space=\"preserve\">\n    <value>Perfil de ventilador central</value>\n  </data>\n  <data name=\"FanProfiles\" xml:space=\"preserve\">\n    <value>Perfis de ventilador</value>\n  </data>\n  <data name=\"FansAndPower\" xml:space=\"preserve\">\n    <value>Ventiladores e Energía</value>\n  </data>\n  <data name=\"FanSpeed\" xml:space=\"preserve\">\n    <value>Ventilador</value>\n  </data>\n  <data name=\"FansPower\" xml:space=\"preserve\">\n    <value>Ventiladores + Energía</value>\n  </data>\n  <data name=\"FlickerFreeDimming\" xml:space=\"preserve\">\n    <value>Atenuação sem cintilação</value>\n  </data>\n  <data name=\"FnLock\" xml:space=\"preserve\">\n    <value>Processar teclas de atalho Fn+F sem pressionar Fn</value>\n  </data>\n  <data name=\"FnLockOff\" xml:space=\"preserve\">\n    <value>Tecla Fn desbloqueada</value>\n  </data>\n  <data name=\"FnLockOn\" xml:space=\"preserve\">\n    <value>Tecla Fn bloqueada</value>\n  </data>\n  <data name=\"GPUBoost\" xml:space=\"preserve\">\n    <value>Boost dinâmico</value>\n  </data>\n  <data name=\"GPUChanging\" xml:space=\"preserve\">\n    <value>Carregando</value>\n  </data>\n  <data name=\"GPUCoreClockOffset\" xml:space=\"preserve\">\n    <value>Aumento da frequência básica</value>\n  </data>\n  <data name=\"GPUMemoryClockOffset\" xml:space=\"preserve\">\n    <value>Aumento da frequência da memória</value>\n  </data>\n  <data name=\"GPUMode\" xml:space=\"preserve\">\n    <value>Modo de GPU</value>\n  </data>\n  <data name=\"GPUModeEco\" xml:space=\"preserve\">\n    <value>Só iGPU</value>\n  </data>\n  <data name=\"GPUModeStandard\" xml:space=\"preserve\">\n    <value>iGPU + dGPU</value>\n  </data>\n  <data name=\"GPUModeUltimate\" xml:space=\"preserve\">\n    <value>Exclusivamente dGPU</value>\n  </data>\n  <data name=\"GPUPower\" xml:space=\"preserve\">\n    <value>Potência da GPU</value>\n  </data>\n  <data name=\"GPUSettings\" xml:space=\"preserve\">\n    <value>Parâmetros de GPU</value>\n  </data>\n  <data name=\"GPUTempTarget\" xml:space=\"preserve\">\n    <value>Alvo de temperatura</value>\n  </data>\n  <data name=\"HibernateAfter\" xml:space=\"preserve\">\n    <value>Minutos até Hibernação em suspensão na bateria (0 — Desligado)</value>\n  </data>\n  <data name=\"High\" xml:space=\"preserve\">\n    <value>Alto</value>\n  </data>\n  <data name=\"ImageRotation\" xml:space=\"preserve\">\n    <value>Rotação de Imagem</value>\n  </data>\n  <data name=\"Import\" xml:space=\"preserve\">\n    <value>Importar Perfil</value>\n  </data>\n  <data name=\"KeyBindings\" xml:space=\"preserve\">\n    <value>Combinações de teclas</value>\n  </data>\n  <data name=\"Keyboard\" xml:space=\"preserve\">\n    <value>Teclado</value>\n  </data>\n  <data name=\"KillGpuApps\" xml:space=\"preserve\">\n    <value>Parar todos os aplicativos que usam a GPU ao alternar para o modo Eco</value>\n  </data>\n  <data name=\"LaptopBacklight\" xml:space=\"preserve\">\n    <value>Configurações de iluminação</value>\n  </data>\n  <data name=\"LaptopKeyboard\" xml:space=\"preserve\">\n    <value>Teclado</value>\n  </data>\n  <data name=\"LaptopScreen\" xml:space=\"preserve\">\n    <value>Tela</value>\n  </data>\n  <data name=\"LEDStatusIndicators\" xml:space=\"preserve\">\n    <value>Indicadores de estado do LED</value>\n  </data>\n  <data name=\"Lid\" xml:space=\"preserve\">\n    <value>Tampa</value>\n  </data>\n  <data name=\"Lightbar\" xml:space=\"preserve\">\n    <value>Barra de luz</value>\n  </data>\n  <data name=\"Lighting\" xml:space=\"preserve\">\n    <value>Iluminação</value>\n  </data>\n  <data name=\"LockScreen\" xml:space=\"preserve\">\n    <value>Tela de bloqueio</value>\n  </data>\n  <data name=\"Logo\" xml:space=\"preserve\">\n    <value>Logo</value>\n  </data>\n  <data name=\"Low\" xml:space=\"preserve\">\n    <value>Baixo</value>\n  </data>\n  <data name=\"LSDeadzones\" xml:space=\"preserve\">\n    <value>Zona morta do analógico esquerdo</value>\n  </data>\n  <data name=\"LTDeadzones\" xml:space=\"preserve\">\n    <value>Zona morta do gatilho esquerdo</value>\n  </data>\n  <data name=\"MatrixAudio\" xml:space=\"preserve\">\n    <value>Visualizador de áudio</value>\n  </data>\n  <data name=\"MatrixBanner\" xml:space=\"preserve\">\n    <value>Bandeira Binária</value>\n  </data>\n  <data name=\"MatrixBright\" xml:space=\"preserve\">\n    <value>Brilho</value>\n  </data>\n  <data name=\"MatrixClock\" xml:space=\"preserve\">\n    <value>Relógio</value>\n  </data>\n  <data name=\"MatrixDim\" xml:space=\"preserve\">\n    <value>Escuro</value>\n  </data>\n  <data name=\"MatrixLogo\" xml:space=\"preserve\">\n    <value>Logo ROG</value>\n  </data>\n  <data name=\"MatrixMedium\" xml:space=\"preserve\">\n    <value>Médio</value>\n  </data>\n  <data name=\"MatrixOff\" xml:space=\"preserve\">\n    <value>Desligado</value>\n  </data>\n  <data name=\"MatrixPicture\" xml:space=\"preserve\">\n    <value>Imagem</value>\n  </data>\n  <data name=\"MaxRefreshTooltip\" xml:space=\"preserve\">\n    <value>Taxa de atualização máxima e menor latência</value>\n  </data>\n  <data name=\"MinRefreshTooltip\" xml:space=\"preserve\">\n    <value>Taxa de atualização à 60Hz para economizar bateria</value>\n  </data>\n  <data name=\"Minute\" xml:space=\"preserve\">\n    <value>Minuto</value>\n  </data>\n  <data name=\"Minutes\" xml:space=\"preserve\">\n    <value>Minutos</value>\n  </data>\n  <data name=\"MouseAngleSnapping\" xml:space=\"preserve\">\n    <value>Angle Snapping / Tuning</value>\n  </data>\n  <data name=\"MouseAutoPowerOff\" xml:space=\"preserve\">\n    <value>Desligamento automático após</value>\n  </data>\n  <data name=\"MouseButtonResponse\" xml:space=\"preserve\">\n    <value>Resposta do Botão</value>\n  </data>\n  <data name=\"MouseImportFailed\" xml:space=\"preserve\">\n    <value>Falha na importação. O arquivo selecionado não é um perfil de mouse válido ou está corrompido.</value>\n  </data>\n  <data name=\"MouseLiftOffDistance\" xml:space=\"preserve\">\n    <value>Distância de Decolagem (LOD)</value>\n  </data>\n  <data name=\"MouseLowBatteryWarning\" xml:space=\"preserve\">\n    <value>Aviso de bateria fraca em</value>\n  </data>\n  <data name=\"MousePerformance\" xml:space=\"preserve\">\n    <value>Desempenho</value>\n  </data>\n  <data name=\"MouseSynchronize\" xml:space=\"preserve\">\n    <value>Sincronizar com o mouse</value>\n  </data>\n  <data name=\"Multizone\" xml:space=\"preserve\">\n    <value>Multi zona</value>\n  </data>\n  <data name=\"MultizoneStrong\" xml:space=\"preserve\">\n    <value>Multi Zona Forte</value>\n  </data>\n  <data name=\"Muted\" xml:space=\"preserve\">\n    <value>Silenciado</value>\n  </data>\n  <data name=\"MuteMic\" xml:space=\"preserve\">\n    <value>Desligar microfone</value>\n  </data>\n  <data name=\"Never\" xml:space=\"preserve\">\n    <value>Nunca</value>\n  </data>\n  <data name=\"NewUpdates\" xml:space=\"preserve\">\n    <value>Novas atualizações</value>\n  </data>\n  <data name=\"NoNewUpdates\" xml:space=\"preserve\">\n    <value>Não há novas atualizações</value>\n  </data>\n  <data name=\"NotConnected\" xml:space=\"preserve\">\n    <value>Não Conectado</value>\n  </data>\n  <data name=\"Off\" xml:space=\"preserve\">\n    <value>Desligado</value>\n  </data>\n  <data name=\"On\" xml:space=\"preserve\">\n    <value>Ligado</value>\n  </data>\n  <data name=\"OneZone\" xml:space=\"preserve\">\n    <value>Uma Zona</value>\n  </data>\n  <data name=\"OpenGHelper\" xml:space=\"preserve\">\n    <value>Abrir G-Helper</value>\n  </data>\n  <data name=\"Optimized\" xml:space=\"preserve\">\n    <value>Otimizado</value>\n  </data>\n  <data name=\"OptimizedGPUTooltip\" xml:space=\"preserve\">\n    <value>Passar ao Ecônomico em bateria e voltar quando carregando</value>\n  </data>\n  <data name=\"OptimizedUSBC\" xml:space=\"preserve\">\n    <value>Manter a GPU desativada ao usar um carregador USB-C no modo Otimizado</value>\n  </data>\n  <data name=\"Other\" xml:space=\"preserve\">\n    <value>Outro</value>\n  </data>\n  <data name=\"Overdrive\" xml:space=\"preserve\">\n    <value>Overdrive</value>\n  </data>\n  <data name=\"PerformanceMode\" xml:space=\"preserve\">\n    <value>Modo</value>\n  </data>\n  <data name=\"Peripherals\" xml:space=\"preserve\">\n    <value>Periféricos</value>\n  </data>\n  <data name=\"PictureGif\" xml:space=\"preserve\">\n    <value>Imagem / Gif</value>\n  </data>\n  <data name=\"PlayPause\" xml:space=\"preserve\">\n    <value>Reproduzir / Pausar</value>\n  </data>\n  <data name=\"PollingRate\" xml:space=\"preserve\">\n    <value>Velocidade de resposta</value>\n  </data>\n  <data name=\"PowerLimits\" xml:space=\"preserve\">\n    <value>Limitações de Energia</value>\n  </data>\n  <data name=\"PPTExperimental\" xml:space=\"preserve\">\n    <value>Limitações de Energia é uma funcionalidade experimental. Use com cuidado.</value>\n  </data>\n  <data name=\"PrintScreen\" xml:space=\"preserve\">\n    <value>Captura de tela</value>\n  </data>\n  <data name=\"Profile\" xml:space=\"preserve\">\n    <value>Perfil</value>\n  </data>\n  <data name=\"Quit\" xml:space=\"preserve\">\n    <value>Sair</value>\n  </data>\n  <data name=\"Reset\" xml:space=\"preserve\">\n    <value>Redefinir</value>\n  </data>\n  <data name=\"RestartGPU\" xml:space=\"preserve\">\n    <value>Algo está usando dGPU e impedindo o modo Eco. Deixe G-Helper tentar reiniciar o dGPU no gerenciador de dispositivos? (Por favor, proceda por sua conta e risco)</value>\n  </data>\n  <data name=\"RPM\" xml:space=\"preserve\">\n    <value>RPM</value>\n  </data>\n  <data name=\"RSDeadzones\" xml:space=\"preserve\">\n    <value>Zona morta do analógico direito</value>\n  </data>\n  <data name=\"RTDeadzones\" xml:space=\"preserve\">\n    <value>Zona morta do gatilho direito</value>\n  </data>\n  <data name=\"RunOnStartup\" xml:space=\"preserve\">\n    <value>Executar ao iniciar</value>\n  </data>\n  <data name=\"ScalingQuality\" xml:space=\"preserve\">\n    <value>Qualidade de Escala</value>\n  </data>\n  <data name=\"ScreenPadDown\" xml:space=\"preserve\">\n    <value>Redução do brilho da Screenpad</value>\n  </data>\n  <data name=\"ScreenPadUp\" xml:space=\"preserve\">\n    <value>Aumento do brilho da Screenpad</value>\n  </data>\n  <data name=\"Shutdown\" xml:space=\"preserve\">\n    <value>Desligar</value>\n  </data>\n  <data name=\"Silent\" xml:space=\"preserve\">\n    <value>Silencioso</value>\n  </data>\n  <data name=\"Sleep\" xml:space=\"preserve\">\n    <value>Hibernação</value>\n  </data>\n  <data name=\"StandardGPUTooltip\" xml:space=\"preserve\">\n    <value>Liga o dGPU para uso padrão</value>\n  </data>\n  <data name=\"StandardMode\" xml:space=\"preserve\">\n    <value>Padrão</value>\n  </data>\n  <data name=\"Start\" xml:space=\"preserve\">\n    <value>Iniciar</value>\n  </data>\n  <data name=\"StartingServices\" xml:space=\"preserve\">\n    <value>Iniciando os serviços</value>\n  </data>\n  <data name=\"StartupError\" xml:space=\"preserve\">\n    <value>Erro de inicialização</value>\n  </data>\n  <data name=\"Stop\" xml:space=\"preserve\">\n    <value>Parar</value>\n  </data>\n  <data name=\"StopGPUApps\" xml:space=\"preserve\">\n    <value>Parar aplicativos GPU</value>\n  </data>\n  <data name=\"StoppingServices\" xml:space=\"preserve\">\n    <value>Parando os serviços</value>\n  </data>\n  <data name=\"ToggleAura\" xml:space=\"preserve\">\n    <value>Alternar Aura</value>\n  </data>\n  <data name=\"ToggleClamshellMode\" xml:space=\"preserve\">\n    <value>Alternar automaticamente o Modo Clamshell</value>\n  </data>\n  <data name=\"ToggleFnLock\" xml:space=\"preserve\">\n    <value>Alternar bloqueio de Fn</value>\n  </data>\n  <data name=\"ToggleMiniled\" xml:space=\"preserve\">\n    <value>Alternar Miniled (se suportado) </value>\n  </data>\n  <data name=\"ToggleScreen\" xml:space=\"preserve\">\n    <value>Alternar Tela</value>\n  </data>\n  <data name=\"ToggleTouchscreen\" xml:space=\"preserve\">\n    <value>Alternar Touchscreen</value>\n  </data>\n  <data name=\"Touchscreen\" xml:space=\"preserve\">\n    <value>Tela de toque</value>\n  </data>\n  <data name=\"Turbo\" xml:space=\"preserve\">\n    <value>Turbo</value>\n  </data>\n  <data name=\"TurnedOff\" xml:space=\"preserve\">\n    <value>Desligado</value>\n  </data>\n  <data name=\"TurnOffOnBattery\" xml:space=\"preserve\">\n    <value>Desligar em bateria</value>\n  </data>\n  <data name=\"UltimateGPUTooltip\" xml:space=\"preserve\">\n    <value>Direciona a tela do computador ao dGPU</value>\n  </data>\n  <data name=\"UltimateMode\" xml:space=\"preserve\">\n    <value>Ultimate</value>\n  </data>\n  <data name=\"UndervoltingRisky\" xml:space=\"preserve\">\n    <value>A subvoltagem é um recurso experimental e arriscado. Se os valores aplicados forem muito baixos para seu hardware, ele poderá ficar instável, ser desligado ou causar corrupção de dados. Se quiser experimentar, comece com valores pequenos primeiro, clique em Aplicar e teste o que funciona para você.</value>\n  </data>\n  <data name=\"Unmuted\" xml:space=\"preserve\">\n    <value>Não silenciado</value>\n  </data>\n  <data name=\"Updates\" xml:space=\"preserve\">\n    <value>Atualizações</value>\n  </data>\n  <data name=\"VersionLabel\" xml:space=\"preserve\">\n    <value>Versão</value>\n  </data>\n  <data name=\"VibrationStrength\" xml:space=\"preserve\">\n    <value>Intensidade da Vibração</value>\n  </data>\n  <data name=\"VisualMode\" xml:space=\"preserve\">\n    <value>Modo visual</value>\n  </data>\n  <data name=\"VisualModesHDR\" xml:space=\"preserve\">\n    <value>Modos visuais não estão disponíveis quando o HDR está ativo</value>\n  </data>\n  <data name=\"VisualModesScreen\" xml:space=\"preserve\">\n    <value>Modos Visuais não estão disponíveis quando a tela do portátil está desligada</value>\n  </data>\n  <data name=\"VolumeDown\" xml:space=\"preserve\">\n    <value>Abaixar o volume</value>\n  </data>\n  <data name=\"VolumeMute\" xml:space=\"preserve\">\n    <value>Mudo</value>\n  </data>\n  <data name=\"VolumeUp\" xml:space=\"preserve\">\n    <value>Aumentar o volume</value>\n  </data>\n  <data name=\"WindowTop\" xml:space=\"preserve\">\n    <value>Manter a janela do aplicativo sempre no topo</value>\n  </data>\n  <data name=\"Zoom\" xml:space=\"preserve\">\n    <value>Zoom</value>\n  </data>\n  <data name=\"Donate\" xml:space=\"preserve\">\n    <value>Doar</value>\n  </data>\n  <data name=\"Legend\" xml:space=\"preserve\">\n    <value>Legenda</value>\n  </data>\n  <data name=\"LegendGray\" xml:space=\"preserve\">\n    <value>Não é possível verificar a versão local</value>\n    <comment>Can't check local version</comment>\n  </data>\n  <data name=\"LegendRed\" xml:space=\"preserve\">\n    <value>Atualização disponível</value>\n    <comment>Update Available</comment>\n  </data>\n  <data name=\"LegendGreen\" xml:space=\"preserve\">\n    <value>Atualizado</value>\n    <comment>Updated</comment>\n  </data>\n  <data name=\"SlashBounce\" xml:space=\"preserve\">\n    <value>Bounce</value>\n  </data>\n  <data name=\"SlashMode\" xml:space=\"preserve\">\n    <value>Slash</value>\n  </data>\n  <data name=\"SlashLoading\" xml:space=\"preserve\">\n    <value>Loading</value>\n  </data>\n  <data name=\"SlashBitStream\" xml:space=\"preserve\">\n    <value>Bit Stream</value>\n  </data>\n  <data name=\"SlashTransmission\" xml:space=\"preserve\">\n    <value>Transmission</value>\n  </data>\n  <data name=\"SlashFlow\" xml:space=\"preserve\">\n    <value>Flow</value>\n  </data>\n  <data name=\"SlashFlux\" xml:space=\"preserve\">\n    <value>Flux</value>\n  </data>\n  <data name=\"SlashPhantom\" xml:space=\"preserve\">\n    <value>Phantom</value>\n  </data>\n  <data name=\"SlashSpectrum\" xml:space=\"preserve\">\n    <value>Spectrum</value>\n  </data>\n  <data name=\"SlashHazard\" xml:space=\"preserve\">\n    <value>Hazard</value>\n  </data>\n  <data name=\"SlashInterfacing\" xml:space=\"preserve\">\n    <value>Interfacing</value>\n  </data>\n  <data name=\"SlashRamp\" xml:space=\"preserve\">\n    <value>Ramp</value>\n  </data>\n  <data name=\"SlashGameOver\" xml:space=\"preserve\">\n    <value>Game Over</value>\n  </data>\n  <data name=\"SlashStart\" xml:space=\"preserve\">\n    <value>Start</value>\n  </data>\n  <data name=\"SlashBuzzer\" xml:space=\"preserve\">\n    <value>Buzzer</value>\n  </data>\n  <data name=\"SlashStatic\" xml:space=\"preserve\">\n    <value>Static</value>\n  </data>\n  <data name=\"SlashBatteryLevel\" xml:space=\"preserve\">\n    <value>Battery Level</value>\n  </data>\n  <data name=\"IntervalOff\" xml:space=\"preserve\">\n    <value>Interval Off</value>\n  </data>\n  <data name=\"IntervalSeconds\" xml:space=\"preserve\">\n    <value>Interval {0}s</value>\n  </data>\n  <data name=\"DisableDynamicLighting\" xml:space=\"preserve\">\n    <value>Please disable Windows &gt; Dynamic Lighting</value>\n  </data>\n  <data name=\"AmbientModeResources\" xml:space=\"preserve\">\n    <value>Ambient mode may increase resource usage</value>\n  </data>\n  <data name=\"MouseMotionSync\" xml:space=\"preserve\">\n    <value>Motion Sync</value>\n  </data>\n  <data name=\"MouseZoneMode\" xml:space=\"preserve\">\n    <value>Zone Mode</value>\n  </data>\n</root>"
  },
  {
    "path": "app/Properties/Strings.pt-PT.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" id=\"root\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\"/>\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"name\" type=\"xsd:string\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\"/>\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Acceleration\" xml:space=\"preserve\">\n    <value>Aceleração</value>\n  </data>\n  <data name=\"ACPIError\" xml:space=\"preserve\">\n    <value>Não foi possível conectar ao ASUS ACPI. O programa não funciona sem esse serviço. Tente instalar Asus System Control Interface</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestart\" xml:space=\"preserve\">\n    <value>Reinicie o dispositivo para aplicar as alterações</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestartTitle\" xml:space=\"preserve\">\n    <value>Reiniciar agora?</value>\n  </data>\n  <data name=\"AlertDGPU\" xml:space=\"preserve\">\n    <value>Parece que o GPU está em uso pesado, desativá-lo?</value>\n  </data>\n  <data name=\"AlertDGPUTitle\" xml:space=\"preserve\">\n    <value>Modo económico</value>\n  </data>\n  <data name=\"AlertUltimateOff\" xml:space=\"preserve\">\n    <value>Passar ao Modo Ultimate implica o reinício do sistema</value>\n  </data>\n  <data name=\"AlertUltimateOn\" xml:space=\"preserve\">\n    <value>Modo Ultimate implica o reinício do sistema</value>\n  </data>\n  <data name=\"AlertUltimateTitle\" xml:space=\"preserve\">\n    <value>Reiniciar agora?</value>\n  </data>\n  <data name=\"AllyController\" xml:space=\"preserve\">\n    <value>Controlador Ally</value>\n  </data>\n  <data name=\"AnimationSpeed\" xml:space=\"preserve\">\n    <value>Velocidade da Animação</value>\n  </data>\n  <data name=\"AnimeMatrix\" xml:space=\"preserve\">\n    <value>AniMe Matrix</value>\n  </data>\n  <data name=\"AppAlreadyRunning\" xml:space=\"preserve\">\n    <value>O programa já está em execução</value>\n  </data>\n  <data name=\"AppAlreadyRunningText\" xml:space=\"preserve\">\n    <value>G-Helper já está em execução. Verifique o tabuleiro do sistema pelo ícone.</value>\n  </data>\n  <data name=\"Apply\" xml:space=\"preserve\">\n    <value>Aplicar</value>\n  </data>\n  <data name=\"ApplyFanCurve\" xml:space=\"preserve\">\n    <value>Aplicar a curva personalizada</value>\n  </data>\n  <data name=\"ApplyPowerLimits\" xml:space=\"preserve\">\n    <value>Aplicar as limitações de energia</value>\n  </data>\n  <data name=\"ApplyWindowsPowerPlan\" xml:space=\"preserve\">\n    <value>Ajuste automático dos modos de energia do Windows</value>\n  </data>\n  <data name=\"APUMemory\" xml:space=\"preserve\">\n    <value>Memória Alocada à GPU</value>\n  </data>\n  <data name=\"AsusServicesRunning\" xml:space=\"preserve\">\n    <value>Serviços da Asus em execução</value>\n  </data>\n  <data name=\"AuraBatteryState\" xml:space=\"preserve\">\n    <value>Estado da bateria</value>\n  </data>\n  <data name=\"AuraBreathe\" xml:space=\"preserve\">\n    <value>Respiração</value>\n  </data>\n  <data name=\"AuraClockwise\" xml:space=\"preserve\">\n    <value>No sentido horário</value>\n  </data>\n  <data name=\"AuraColorCycle\" xml:space=\"preserve\">\n    <value>Ciclo de cores</value>\n  </data>\n  <data name=\"AuraComet\" xml:space=\"preserve\">\n    <value>Cometa</value>\n  </data>\n  <data name=\"AuraCounterClockwise\" xml:space=\"preserve\">\n    <value>No sentido anti-horário</value>\n  </data>\n  <data name=\"AuraFast\" xml:space=\"preserve\">\n    <value>Rápido</value>\n  </data>\n  <data name=\"AuraLightingMode\" xml:space=\"preserve\">\n    <value>Modo de iluminação</value>\n  </data>\n  <data name=\"AuraNormal\" xml:space=\"preserve\">\n    <value>Normal</value>\n  </data>\n  <data name=\"AuraRainbow\" xml:space=\"preserve\">\n    <value>Arco-íris</value>\n  </data>\n  <data name=\"AuraRandomColor\" xml:space=\"preserve\">\n    <value>Aleatório</value>\n  </data>\n  <data name=\"AuraReact\" xml:space=\"preserve\">\n    <value>Reagir</value>\n  </data>\n  <data name=\"AuraSlow\" xml:space=\"preserve\">\n    <value>Lento</value>\n  </data>\n  <data name=\"AuraStatic\" xml:space=\"preserve\">\n    <value>Estático</value>\n  </data>\n  <data name=\"AuraStrobe\" xml:space=\"preserve\">\n    <value>Estroboscópio</value>\n  </data>\n  <data name=\"AuraZoneAll\" xml:space=\"preserve\">\n    <value>Todos</value>\n  </data>\n  <data name=\"AuraZoneDock\" xml:space=\"preserve\">\n    <value>Dock</value>\n  </data>\n  <data name=\"AuraZoneLogo\" xml:space=\"preserve\">\n    <value>Logo</value>\n  </data>\n  <data name=\"AuraZoneScroll\" xml:space=\"preserve\">\n    <value>Roda de Deslocamento</value>\n  </data>\n  <data name=\"AuraZoneUnderglow\" xml:space=\"preserve\">\n    <value>Underglow</value>\n  </data>\n  <data name=\"AutoApply\" xml:space=\"preserve\">\n    <value>Aplicar automaticamente</value>\n  </data>\n  <data name=\"AutoMode\" xml:space=\"preserve\">\n    <value>Automático</value>\n  </data>\n  <data name=\"AutoRefreshTooltip\" xml:space=\"preserve\">\n    <value>Define a taxa de atualização automaticamente para poupar bateria</value>\n  </data>\n  <data name=\"Awake\" xml:space=\"preserve\">\n    <value>Acordado</value>\n  </data>\n  <data name=\"BacklightLow\" xml:space=\"preserve\">\n    <value>Baixo</value>\n  </data>\n  <data name=\"BacklightMax\" xml:space=\"preserve\">\n    <value>Máximo</value>\n  </data>\n  <data name=\"BacklightMid\" xml:space=\"preserve\">\n    <value>Médio</value>\n  </data>\n  <data name=\"BacklightOff\" xml:space=\"preserve\">\n    <value>Desligado</value>\n  </data>\n  <data name=\"BacklightTimeout\" xml:space=\"preserve\">\n    <value>Tempo limite ligado à corrente / na bateria (0 - ON)</value>\n  </data>\n  <data name=\"BacklightTimeoutBattery\" xml:space=\"preserve\">\n    <value>Desligar o ecrã após (em Bateria)</value>\n  </data>\n  <data name=\"BacklightTimeoutPlugged\" xml:space=\"preserve\">\n    <value>Desligar o ecrã após (ligado à corrente)</value>\n  </data>\n  <data name=\"Balanced\" xml:space=\"preserve\">\n    <value>Equilibrado</value>\n  </data>\n  <data name=\"BatteryCharge\" xml:space=\"preserve\">\n    <value>Carga</value>\n  </data>\n  <data name=\"BatteryChargeLimit\" xml:space=\"preserve\">\n    <value>Limite de carga</value>\n  </data>\n  <data name=\"BatteryHealth\" xml:space=\"preserve\">\n    <value>Estado da bateria</value>\n  </data>\n  <data name=\"BatteryLimitFull\" xml:space=\"preserve\">\n    <value>Carregamento único até 100%</value>\n  </data>\n  <data name=\"Binding\" xml:space=\"preserve\">\n    <value>Vinculação</value>\n  </data>\n  <data name=\"BindingPrimary\" xml:space=\"preserve\">\n    <value>Primário</value>\n  </data>\n  <data name=\"BindingSecondary\" xml:space=\"preserve\">\n    <value>Secundário</value>\n  </data>\n  <data name=\"BiosAndDriverUpdates\" xml:space=\"preserve\">\n    <value>Atualizações de Drivers e da BIOS</value>\n  </data>\n  <data name=\"Boot\" xml:space=\"preserve\">\n    <value>Ao ligar</value>\n  </data>\n  <data name=\"BootSound\" xml:space=\"preserve\">\n    <value>Som de ligar</value>\n  </data>\n  <data name=\"Brightness\" xml:space=\"preserve\">\n    <value>Nível do brilho</value>\n  </data>\n  <data name=\"BrightnessDown\" xml:space=\"preserve\">\n    <value>Diminuir o brilho</value>\n  </data>\n  <data name=\"BrightnessUp\" xml:space=\"preserve\">\n    <value>Aumentar o brilho</value>\n  </data>\n  <data name=\"BWTrayIcon\" xml:space=\"preserve\">\n    <value>Ícone da bandeja a preto e branco</value>\n  </data>\n  <data name=\"Calibrate\" xml:space=\"preserve\">\n    <value>Calibrar</value>\n  </data>\n  <data name=\"Charging\" xml:space=\"preserve\">\n    <value>Carregando</value>\n  </data>\n  <data name=\"Color\" xml:space=\"preserve\">\n    <value>Cor</value>\n  </data>\n  <data name=\"Contrast\" xml:space=\"preserve\">\n    <value>Contraste</value>\n  </data>\n  <data name=\"Controller\" xml:space=\"preserve\">\n    <value>Controlador</value>\n  </data>\n  <data name=\"CPUBoost\" xml:space=\"preserve\">\n    <value>Turbo do CPU</value>\n  </data>\n  <data name=\"Custom\" xml:space=\"preserve\">\n    <value>Personalizado</value>\n  </data>\n  <data name=\"Deceleration\" xml:space=\"preserve\">\n    <value>Desaceleração</value>\n  </data>\n  <data name=\"Default\" xml:space=\"preserve\">\n    <value>Padrão</value>\n  </data>\n  <data name=\"DisableController\" xml:space=\"preserve\">\n    <value>Desativar Controlador</value>\n  </data>\n  <data name=\"DisableOnLidClose\" xml:space=\"preserve\">\n    <value>Desativar ao fechar a tampa</value>\n  </data>\n  <data name=\"DisableOverdrive\" xml:space=\"preserve\">\n    <value>Desativar o overdrive do ecrã</value>\n  </data>\n  <data name=\"Discharging\" xml:space=\"preserve\">\n    <value>Descarregando</value>\n  </data>\n  <data name=\"DownloadColorProfiles\" xml:space=\"preserve\">\n    <value>Descarregar Perfis de Cor</value>\n  </data>\n  <data name=\"DownloadUpdate\" xml:space=\"preserve\">\n    <value>Transferir</value>\n  </data>\n  <data name=\"DriverAndSoftware\" xml:space=\"preserve\">\n    <value>Drivers e Software</value>\n  </data>\n  <data name=\"EcoGPUTooltip\" xml:space=\"preserve\">\n    <value>Desativar o dGPU para poupar energia</value>\n  </data>\n  <data name=\"EcoMode\" xml:space=\"preserve\">\n    <value>Económico</value>\n  </data>\n  <data name=\"EnableGPUOnShutdown\" xml:space=\"preserve\">\n    <value>Ativar a GPU no encerramento (previne o problema do modo Eco)</value>\n  </data>\n  <data name=\"EnableOptimusText\" xml:space=\"preserve\">\n    <value>Desativar a dGPU por ativar o modo Eco enquanto o Modo de Ecrã no Painel de Controlo da NVIDIA não está definido para Optimus pode causar problemas com os controlos do brilho do painel até ao próximo reinício.\n\nQuer prosseguir?</value>\n  </data>\n  <data name=\"EnableOptimusTitle\" xml:space=\"preserve\">\n    <value>O Modo de Ecrã da NVIDIA não está definido para Optimus</value>\n  </data>\n  <data name=\"EnergySettings\" xml:space=\"preserve\">\n    <value>Configurações de Energia</value>\n  </data>\n  <data name=\"Export\" xml:space=\"preserve\">\n    <value>Exportar Perfil</value>\n  </data>\n  <data name=\"Extra\" xml:space=\"preserve\">\n    <value>Adicional</value>\n  </data>\n  <data name=\"ExtraSettings\" xml:space=\"preserve\">\n    <value>Configurações adicionais</value>\n  </data>\n  <data name=\"FactoryDefaults\" xml:space=\"preserve\">\n    <value>Padrão de fábrica</value>\n  </data>\n  <data name=\"FanCurves\" xml:space=\"preserve\">\n    <value>Curvas das Ventoinhas</value>\n  </data>\n  <data name=\"FanProfileCPU\" xml:space=\"preserve\">\n    <value>Perfil da Ventoinha do CPU</value>\n  </data>\n  <data name=\"FanProfileGPU\" xml:space=\"preserve\">\n    <value>Perfil da Ventoinha da GPU</value>\n  </data>\n  <data name=\"FanProfileMid\" xml:space=\"preserve\">\n    <value>Perfil da Ventoinha Central</value>\n  </data>\n  <data name=\"FanProfiles\" xml:space=\"preserve\">\n    <value>Perfis das Ventoinhas</value>\n  </data>\n  <data name=\"FansAndPower\" xml:space=\"preserve\">\n    <value>Ventoinhas e Potência</value>\n  </data>\n  <data name=\"FanSpeed\" xml:space=\"preserve\">\n    <value>Fan</value>\n  </data>\n  <data name=\"FansPower\" xml:space=\"preserve\">\n    <value>Ventoinhas + Potência</value>\n  </data>\n  <data name=\"FlickerFreeDimming\" xml:space=\"preserve\">\n    <value>Atenuação sem cintilação</value>\n  </data>\n  <data name=\"FnLock\" xml:space=\"preserve\">\n    <value>Processar teclas de atalho Fn+F sem pressionar Fn</value>\n  </data>\n  <data name=\"FnLockOff\" xml:space=\"preserve\">\n    <value>Tecla FN desbloqueada</value>\n  </data>\n  <data name=\"FnLockOn\" xml:space=\"preserve\">\n    <value>Tecla FN bloqueada</value>\n  </data>\n  <data name=\"GPUBoost\" xml:space=\"preserve\">\n    <value>Boost dinâmico</value>\n  </data>\n  <data name=\"GPUChanging\" xml:space=\"preserve\">\n    <value>Carregando</value>\n  </data>\n  <data name=\"GPUCoreClockOffset\" xml:space=\"preserve\">\n    <value>Frequência da GPU</value>\n  </data>\n  <data name=\"GPUMemoryClockOffset\" xml:space=\"preserve\">\n    <value>Frequência da Memória</value>\n  </data>\n  <data name=\"GPUMode\" xml:space=\"preserve\">\n    <value>Modo da GPU</value>\n  </data>\n  <data name=\"GPUModeEco\" xml:space=\"preserve\">\n    <value>Só iGPU</value>\n  </data>\n  <data name=\"GPUModeStandard\" xml:space=\"preserve\">\n    <value>iGPU + dGPU</value>\n  </data>\n  <data name=\"GPUModeUltimate\" xml:space=\"preserve\">\n    <value>Exclusivamente dGPU</value>\n  </data>\n  <data name=\"GPUPower\" xml:space=\"preserve\">\n    <value>Potência da GPU</value>\n  </data>\n  <data name=\"GPUSettings\" xml:space=\"preserve\">\n    <value>Parâmetros de GPU</value>\n  </data>\n  <data name=\"GPUTempTarget\" xml:space=\"preserve\">\n    <value>Temperatura limite</value>\n  </data>\n  <data name=\"HibernateAfter\" xml:space=\"preserve\">\n    <value>Minutos para a hibernação em suspensão, na bateria (0 - OFF)</value>\n  </data>\n  <data name=\"High\" xml:space=\"preserve\">\n    <value>Alto</value>\n  </data>\n  <data name=\"ImageRotation\" xml:space=\"preserve\">\n    <value>Rotação de imagem</value>\n  </data>\n  <data name=\"Import\" xml:space=\"preserve\">\n    <value>Importar perfil</value>\n  </data>\n  <data name=\"KeyBindings\" xml:space=\"preserve\">\n    <value>Combinações de teclas</value>\n  </data>\n  <data name=\"Keyboard\" xml:space=\"preserve\">\n    <value>Teclado</value>\n  </data>\n  <data name=\"KillGpuApps\" xml:space=\"preserve\">\n    <value>Parar todos os programas que usam a GPU ao alternar para o modo Eco</value>\n  </data>\n  <data name=\"LaptopBacklight\" xml:space=\"preserve\">\n    <value>Configurações de iluminação</value>\n  </data>\n  <data name=\"LaptopKeyboard\" xml:space=\"preserve\">\n    <value>Teclado</value>\n  </data>\n  <data name=\"LaptopScreen\" xml:space=\"preserve\">\n    <value>Ecrã</value>\n  </data>\n  <data name=\"LEDStatusIndicators\" xml:space=\"preserve\">\n    <value>Indicadores de Estado LED</value>\n  </data>\n  <data name=\"Lid\" xml:space=\"preserve\">\n    <value>Tampa</value>\n  </data>\n  <data name=\"Lightbar\" xml:space=\"preserve\">\n    <value>Barra de Luz</value>\n  </data>\n  <data name=\"Lighting\" xml:space=\"preserve\">\n    <value>Iluminação</value>\n  </data>\n  <data name=\"LockScreen\" xml:space=\"preserve\">\n    <value>Ecrã de bloqueio</value>\n  </data>\n  <data name=\"Logo\" xml:space=\"preserve\">\n    <value>Logo</value>\n  </data>\n  <data name=\"Low\" xml:space=\"preserve\">\n    <value>Baixo</value>\n  </data>\n  <data name=\"LSDeadzones\" xml:space=\"preserve\">\n    <value>Zonas Mortas do Manípulo Esquerdo</value>\n  </data>\n  <data name=\"LTDeadzones\" xml:space=\"preserve\">\n    <value>Zonas Mortas do Gatilho Esquerdo</value>\n  </data>\n  <data name=\"MatrixAudio\" xml:space=\"preserve\">\n    <value>Visualizador de áudio</value>\n  </data>\n  <data name=\"MatrixBanner\" xml:space=\"preserve\">\n    <value>Bandeira Binária</value>\n  </data>\n  <data name=\"MatrixBright\" xml:space=\"preserve\">\n    <value>Brilho</value>\n  </data>\n  <data name=\"MatrixClock\" xml:space=\"preserve\">\n    <value>Relógio</value>\n  </data>\n  <data name=\"MatrixDim\" xml:space=\"preserve\">\n    <value>Escuro</value>\n  </data>\n  <data name=\"MatrixLogo\" xml:space=\"preserve\">\n    <value>Logo ROG</value>\n  </data>\n  <data name=\"MatrixMedium\" xml:space=\"preserve\">\n    <value>Médio</value>\n  </data>\n  <data name=\"MatrixOff\" xml:space=\"preserve\">\n    <value>Desligado</value>\n  </data>\n  <data name=\"MatrixPicture\" xml:space=\"preserve\">\n    <value>Imagem</value>\n  </data>\n  <data name=\"MaxRefreshTooltip\" xml:space=\"preserve\">\n    <value>Taxa de atualização máxima e menor latência</value>\n  </data>\n  <data name=\"MinRefreshTooltip\" xml:space=\"preserve\">\n    <value>Taxa de atualização de 60Hz para poupar bateria</value>\n  </data>\n  <data name=\"Minute\" xml:space=\"preserve\">\n    <value>Minuto</value>\n  </data>\n  <data name=\"Minutes\" xml:space=\"preserve\">\n    <value>Minutos</value>\n  </data>\n  <data name=\"MouseAngleSnapping\" xml:space=\"preserve\">\n    <value>Angle Snapping / Tuning</value>\n  </data>\n  <data name=\"MouseAutoPowerOff\" xml:space=\"preserve\">\n    <value>Desligar automaticamente após</value>\n  </data>\n  <data name=\"MouseButtonResponse\" xml:space=\"preserve\">\n    <value>Resposta do botão</value>\n  </data>\n  <data name=\"MouseImportFailed\" xml:space=\"preserve\">\n    <value>A importação falhou. O ficheiro selecionado não é um perfil de rato válido ou está corrompido.</value>\n  </data>\n  <data name=\"MouseLiftOffDistance\" xml:space=\"preserve\">\n    <value>Distância de Lift Off</value>\n  </data>\n  <data name=\"MouseLowBatteryWarning\" xml:space=\"preserve\">\n    <value>Aviso de bateria fraca</value>\n  </data>\n  <data name=\"MousePerformance\" xml:space=\"preserve\">\n    <value>Desempenho do rato</value>\n  </data>\n  <data name=\"MouseSynchronize\" xml:space=\"preserve\">\n    <value>Sincronizar com o rato</value>\n  </data>\n  <data name=\"Multizone\" xml:space=\"preserve\">\n    <value>Múltipla Zona</value>\n  </data>\n  <data name=\"MultizoneStrong\" xml:space=\"preserve\">\n    <value>Múltipla Zona Forte</value>\n  </data>\n  <data name=\"Muted\" xml:space=\"preserve\">\n    <value>Silenciado</value>\n  </data>\n  <data name=\"MuteMic\" xml:space=\"preserve\">\n    <value>Desligar microfone</value>\n  </data>\n  <data name=\"Never\" xml:space=\"preserve\">\n    <value>Nunca</value>\n  </data>\n  <data name=\"NewUpdates\" xml:space=\"preserve\">\n    <value>Novas atualizações</value>\n  </data>\n  <data name=\"NoNewUpdates\" xml:space=\"preserve\">\n    <value>Sem novas atualizações</value>\n  </data>\n  <data name=\"NotConnected\" xml:space=\"preserve\">\n    <value>Não conectado</value>\n  </data>\n  <data name=\"Off\" xml:space=\"preserve\">\n    <value>Desligado</value>\n  </data>\n  <data name=\"On\" xml:space=\"preserve\">\n    <value>Ligado</value>\n  </data>\n  <data name=\"OneZone\" xml:space=\"preserve\">\n    <value>Uma Zona</value>\n  </data>\n  <data name=\"OpenGHelper\" xml:space=\"preserve\">\n    <value>Abrir G-Helper</value>\n  </data>\n  <data name=\"Optimized\" xml:space=\"preserve\">\n    <value>Otimizado</value>\n  </data>\n  <data name=\"OptimizedGPUTooltip\" xml:space=\"preserve\">\n    <value>Mudar para Eco em bateria, e mudar para Standard quando ligado à corrente</value>\n  </data>\n  <data name=\"OptimizedUSBC\" xml:space=\"preserve\">\n    <value>Manter a GPU desativada ao usar um carregador USB-C no modo Otimizado</value>\n  </data>\n  <data name=\"Other\" xml:space=\"preserve\">\n    <value>Outro</value>\n  </data>\n  <data name=\"Overdrive\" xml:space=\"preserve\">\n    <value>Overdrive</value>\n  </data>\n  <data name=\"PerformanceMode\" xml:space=\"preserve\">\n    <value>Modo</value>\n  </data>\n  <data name=\"Peripherals\" xml:space=\"preserve\">\n    <value>Periféricos</value>\n  </data>\n  <data name=\"PictureGif\" xml:space=\"preserve\">\n    <value>Imagem / Gif</value>\n  </data>\n  <data name=\"PlayPause\" xml:space=\"preserve\">\n    <value>Reproduzir / Pausar</value>\n  </data>\n  <data name=\"PollingRate\" xml:space=\"preserve\">\n    <value>Taxa de Amostragem</value>\n  </data>\n  <data name=\"PowerLimits\" xml:space=\"preserve\">\n    <value>Limites de Potência</value>\n  </data>\n  <data name=\"PPTExperimental\" xml:space=\"preserve\">\n    <value>Os Limites de Potência são uma funcionalidade experimental. Use com cuidado!</value>\n  </data>\n  <data name=\"PrintScreen\" xml:space=\"preserve\">\n    <value>Captura de ecrã</value>\n  </data>\n  <data name=\"Profile\" xml:space=\"preserve\">\n    <value>Perfil</value>\n  </data>\n  <data name=\"Quit\" xml:space=\"preserve\">\n    <value>Sair</value>\n  </data>\n  <data name=\"Reset\" xml:space=\"preserve\">\n    <value>Redefinir</value>\n  </data>\n  <data name=\"RestartGPU\" xml:space=\"preserve\">\n    <value>Algum processo está a utilizar a dGPU, impedindo o modo Eco. Deixar o G-Helper tentar reiniciar a dGPU no gestor de dispositivos? (Proceda por sua conta e risco)</value>\n  </data>\n  <data name=\"RPM\" xml:space=\"preserve\">\n    <value>RPM</value>\n  </data>\n  <data name=\"RSDeadzones\" xml:space=\"preserve\">\n    <value>Zonas Mortas do Manípulo Direito</value>\n  </data>\n  <data name=\"RTDeadzones\" xml:space=\"preserve\">\n    <value>Zonas Mortas do Gatilho Direito</value>\n  </data>\n  <data name=\"RunOnStartup\" xml:space=\"preserve\">\n    <value>Executar ao iniciar</value>\n  </data>\n  <data name=\"ScalingQuality\" xml:space=\"preserve\">\n    <value>Qualidade de Escala</value>\n  </data>\n  <data name=\"ScreenPadDown\" xml:space=\"preserve\">\n    <value>Diminuir o brilho do ScreenPad</value>\n  </data>\n  <data name=\"ScreenPadUp\" xml:space=\"preserve\">\n    <value>Aumentar o brilho do ScreenPad</value>\n  </data>\n  <data name=\"Shutdown\" xml:space=\"preserve\">\n    <value>Desligar</value>\n  </data>\n  <data name=\"Silent\" xml:space=\"preserve\">\n    <value>Silencioso</value>\n  </data>\n  <data name=\"Sleep\" xml:space=\"preserve\">\n    <value>Hibernação</value>\n  </data>\n  <data name=\"StandardGPUTooltip\" xml:space=\"preserve\">\n    <value>Liga o dGPU para uso padrão</value>\n  </data>\n  <data name=\"StandardMode\" xml:space=\"preserve\">\n    <value>Padrão</value>\n  </data>\n  <data name=\"Start\" xml:space=\"preserve\">\n    <value>Iniciar</value>\n  </data>\n  <data name=\"StartingServices\" xml:space=\"preserve\">\n    <value>Iniciando os serviços</value>\n  </data>\n  <data name=\"StartupError\" xml:space=\"preserve\">\n    <value>Erro de inicialização</value>\n  </data>\n  <data name=\"Stop\" xml:space=\"preserve\">\n    <value>Parar</value>\n  </data>\n  <data name=\"StopGPUApps\" xml:space=\"preserve\">\n    <value>Parar programas que usem a GPU</value>\n  </data>\n  <data name=\"StoppingServices\" xml:space=\"preserve\">\n    <value>Parando os serviços</value>\n  </data>\n  <data name=\"ToggleAura\" xml:space=\"preserve\">\n    <value>Alternar Aura</value>\n  </data>\n  <data name=\"ToggleClamshellMode\" xml:space=\"preserve\">\n    <value>Alternar automaticamente o Modo Clamshell</value>\n  </data>\n  <data name=\"ToggleFnLock\" xml:space=\"preserve\">\n    <value>Alternar Fn-Lock</value>\n  </data>\n  <data name=\"ToggleMiniled\" xml:space=\"preserve\">\n    <value>Alternar MiniLED (se suportado)</value>\n  </data>\n  <data name=\"ToggleScreen\" xml:space=\"preserve\">\n    <value>Alternar Ecrã</value>\n  </data>\n  <data name=\"ToggleTouchscreen\" xml:space=\"preserve\">\n    <value>Alternar Ecrã Tátil</value>\n  </data>\n  <data name=\"Touchscreen\" xml:space=\"preserve\">\n    <value>Ecrã Tátil</value>\n  </data>\n  <data name=\"Turbo\" xml:space=\"preserve\">\n    <value>Turbo</value>\n  </data>\n  <data name=\"TurnedOff\" xml:space=\"preserve\">\n    <value>Desligado</value>\n  </data>\n  <data name=\"TurnOffOnBattery\" xml:space=\"preserve\">\n    <value>Desligar em bateria</value>\n  </data>\n  <data name=\"UltimateGPUTooltip\" xml:space=\"preserve\">\n    <value>O ecrã do portátil está ligado diretamente à dGPU, maximizando FPS</value>\n  </data>\n  <data name=\"UltimateMode\" xml:space=\"preserve\">\n    <value>Ultimate</value>\n  </data>\n  <data name=\"UndervoltingRisky\" xml:space=\"preserve\">\n    <value>Undervolting é uma funcionalidade experimental e arriscada. Se os valores aplicados foram baixos para o hardware, podem existir instabilidades, desligar e causar corrupção de dados. Caso queira, comece por valores pequenos no início, clique em Aplicar e teste o que funciona para o hardware.</value>\n  </data>\n  <data name=\"Unmuted\" xml:space=\"preserve\">\n    <value>Não silenciado</value>\n  </data>\n  <data name=\"Updates\" xml:space=\"preserve\">\n    <value>Atualizações</value>\n  </data>\n  <data name=\"VersionLabel\" xml:space=\"preserve\">\n    <value>Versão</value>\n  </data>\n  <data name=\"VibrationStrength\" xml:space=\"preserve\">\n    <value>Intensidade da Vibração</value>\n  </data>\n  <data name=\"VisualMode\" xml:space=\"preserve\">\n    <value>Modo Visual</value>\n  </data>\n  <data name=\"VisualModesHDR\" xml:space=\"preserve\">\n    <value>Os Modos Visuais não estão disponíveis quando o HDR está ativo</value>\n  </data>\n  <data name=\"VisualModesScreen\" xml:space=\"preserve\">\n    <value>Os Modos Visuais não estão disponíveis quando o ecrã do portátil está desligado</value>\n  </data>\n  <data name=\"VolumeDown\" xml:space=\"preserve\">\n    <value>Diminuir o volume</value>\n  </data>\n  <data name=\"VolumeMute\" xml:space=\"preserve\">\n    <value>Sem som</value>\n  </data>\n  <data name=\"VolumeUp\" xml:space=\"preserve\">\n    <value>Aumentar o volume</value>\n  </data>\n  <data name=\"WindowTop\" xml:space=\"preserve\">\n    <value>Manter a janela do aplicativo sempre no topo</value>\n  </data>\n  <data name=\"Zoom\" xml:space=\"preserve\">\n    <value>Ampliar</value>\n  </data>\n  <data name=\"Donate\" xml:space=\"preserve\">\n    <value>Doar</value>\n  </data>\n  <data name=\"Legend\" xml:space=\"preserve\">\n    <value>Legenda</value>\n  </data>\n  <data name=\"LegendGray\" xml:space=\"preserve\">\n    <value>Não é possível verificar a versão local</value>\n    <comment>Can't check local version</comment>\n  </data>\n  <data name=\"LegendRed\" xml:space=\"preserve\">\n    <value>Atualização disponível</value>\n    <comment>Update Available</comment>\n  </data>\n  <data name=\"LegendGreen\" xml:space=\"preserve\">\n    <value>Atualizado</value>\n    <comment>Updated</comment>\n  </data>\n  <data name=\"SlashBounce\" xml:space=\"preserve\">\n    <value>Saltar</value>\n  </data>\n  <data name=\"SlashMode\" xml:space=\"preserve\">\n    <value>Barra</value>\n  </data>\n  <data name=\"SlashLoading\" xml:space=\"preserve\">\n    <value>A carregar</value>\n  </data>\n  <data name=\"SlashBitStream\" xml:space=\"preserve\">\n    <value>Fluxo de Bits</value>\n  </data>\n  <data name=\"SlashTransmission\" xml:space=\"preserve\">\n    <value>Transmissão</value>\n  </data>\n  <data name=\"SlashFlow\" xml:space=\"preserve\">\n    <value>Fluxo</value>\n  </data>\n  <data name=\"SlashFlux\" xml:space=\"preserve\">\n    <value>Fluxo</value>\n  </data>\n  <data name=\"SlashPhantom\" xml:space=\"preserve\">\n    <value>Fantasma</value>\n  </data>\n  <data name=\"SlashSpectrum\" xml:space=\"preserve\">\n    <value>Espectro</value>\n  </data>\n  <data name=\"SlashHazard\" xml:space=\"preserve\">\n    <value>Perigo</value>\n  </data>\n  <data name=\"SlashInterfacing\" xml:space=\"preserve\">\n    <value>Interligação</value>\n  </data>\n  <data name=\"SlashRamp\" xml:space=\"preserve\">\n    <value>Rampa</value>\n  </data>\n  <data name=\"SlashGameOver\" xml:space=\"preserve\">\n    <value>Fim do Jogo</value>\n  </data>\n  <data name=\"SlashStart\" xml:space=\"preserve\">\n    <value>Começar</value>\n  </data>\n  <data name=\"SlashBuzzer\" xml:space=\"preserve\">\n    <value>Campainha</value>\n  </data>\n  <data name=\"SlashStatic\" xml:space=\"preserve\">\n    <value>Estático</value>\n  </data>\n  <data name=\"SlashBatteryLevel\" xml:space=\"preserve\">\n    <value>Nível da Bateria</value>\n  </data>\n  <data name=\"IntervalOff\" xml:space=\"preserve\">\n    <value>Intervalo Desligado</value>\n  </data>\n  <data name=\"IntervalSeconds\" xml:space=\"preserve\">\n    <value>Intervalo {0}s</value>\n  </data>\n  <data name=\"DisableDynamicLighting\" xml:space=\"preserve\">\n    <value>Por favor, desative o Windows &gt; Iluminação Dinâmica</value>\n  </data>\n  <data name=\"AmbientModeResources\" xml:space=\"preserve\">\n    <value>O modo ambiente pode aumentar o uso de recursos</value>\n  </data>\n  <data name=\"MouseMotionSync\" xml:space=\"preserve\">\n    <value>Motion Sync</value>\n  </data>\n  <data name=\"MouseZoneMode\" xml:space=\"preserve\">\n    <value>Zone Mode</value>\n  </data>\n</root>"
  },
  {
    "path": "app/Properties/Strings.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Acceleration\" xml:space=\"preserve\">\n    <value>Acceleration</value>\n  </data>\n  <data name=\"ACPIError\" xml:space=\"preserve\">\n    <value>Can't connect to ASUS ACPI. Application can't function without it. Try to install Asus System Control Interface</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestart\" xml:space=\"preserve\">\n    <value>Restart your device to apply changes</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestartTitle\" xml:space=\"preserve\">\n    <value>Restart now?</value>\n  </data>\n  <data name=\"AlertDGPU\" xml:space=\"preserve\">\n    <value>Looks like GPU is in heavy use, disable it?</value>\n  </data>\n  <data name=\"AlertDGPUTitle\" xml:space=\"preserve\">\n    <value>Eco Mode</value>\n  </data>\n  <data name=\"AlertUltimateOff\" xml:space=\"preserve\">\n    <value>Switching off Ultimate Mode requires restart</value>\n  </data>\n  <data name=\"AlertUltimateOn\" xml:space=\"preserve\">\n    <value>Ultimate Mode requires restart</value>\n  </data>\n  <data name=\"AlertUltimateTitle\" xml:space=\"preserve\">\n    <value>Reboot now?</value>\n  </data>\n  <data name=\"AllyController\" xml:space=\"preserve\">\n    <value>Ally Controller</value>\n  </data>\n  <data name=\"AnimationSpeed\" xml:space=\"preserve\">\n    <value>Animation Speed</value>\n  </data>\n  <data name=\"AnimeMatrix\" xml:space=\"preserve\">\n    <value>Anime Matrix</value>\n  </data>\n  <data name=\"AppAlreadyRunning\" xml:space=\"preserve\">\n    <value>App already running</value>\n  </data>\n  <data name=\"AppAlreadyRunningText\" xml:space=\"preserve\">\n    <value>G-Helper is already running. Check system tray for an icon.</value>\n  </data>\n  <data name=\"Apply\" xml:space=\"preserve\">\n    <value>Apply</value>\n  </data>\n  <data name=\"ApplyFanCurve\" xml:space=\"preserve\">\n    <value>Apply Custom Fan Curve</value>\n  </data>\n  <data name=\"ApplyPowerLimits\" xml:space=\"preserve\">\n    <value>Apply Power Limits</value>\n  </data>\n  <data name=\"ApplyWindowsPowerPlan\" xml:space=\"preserve\">\n    <value>Auto adjust Windows Power Modes</value>\n  </data>\n  <data name=\"APUMemory\" xml:space=\"preserve\">\n    <value>Memory Assigned to GPU</value>\n  </data>\n  <data name=\"AsusServicesRunning\" xml:space=\"preserve\">\n    <value>Asus Services Running</value>\n  </data>\n  <data name=\"AuraBatteryState\" xml:space=\"preserve\">\n    <value>Battery State</value>\n  </data>\n  <data name=\"AuraBreathe\" xml:space=\"preserve\">\n    <value>Breathe</value>\n  </data>\n  <data name=\"AuraClockwise\" xml:space=\"preserve\">\n    <value>Clockwise</value>\n  </data>\n  <data name=\"AuraColorCycle\" xml:space=\"preserve\">\n    <value>Color Cycle</value>\n  </data>\n  <data name=\"AuraComet\" xml:space=\"preserve\">\n    <value>Comet</value>\n  </data>\n  <data name=\"AuraCounterClockwise\" xml:space=\"preserve\">\n    <value>Counterclockwise</value>\n  </data>\n  <data name=\"AuraFast\" xml:space=\"preserve\">\n    <value>Fast</value>\n  </data>\n  <data name=\"AuraLightingMode\" xml:space=\"preserve\">\n    <value>Lighting Mode</value>\n  </data>\n  <data name=\"AuraNormal\" xml:space=\"preserve\">\n    <value>Normal</value>\n  </data>\n  <data name=\"AuraRainbow\" xml:space=\"preserve\">\n    <value>Rainbow</value>\n  </data>\n  <data name=\"AuraRandomColor\" xml:space=\"preserve\">\n    <value>Random</value>\n  </data>\n  <data name=\"AuraReact\" xml:space=\"preserve\">\n    <value>React</value>\n  </data>\n  <data name=\"AuraSlow\" xml:space=\"preserve\">\n    <value>Slow</value>\n  </data>\n  <data name=\"AuraStatic\" xml:space=\"preserve\">\n    <value>Static</value>\n  </data>\n  <data name=\"AuraStrobe\" xml:space=\"preserve\">\n    <value>Strobe</value>\n  </data>\n  <data name=\"AuraZoneAll\" xml:space=\"preserve\">\n    <value>All</value>\n  </data>\n  <data name=\"AuraZoneDock\" xml:space=\"preserve\">\n    <value>Dock</value>\n  </data>\n  <data name=\"AuraZoneLogo\" xml:space=\"preserve\">\n    <value>Logo</value>\n  </data>\n  <data name=\"AuraZoneScroll\" xml:space=\"preserve\">\n    <value>Scrollwheel</value>\n  </data>\n  <data name=\"AuraZoneUnderglow\" xml:space=\"preserve\">\n    <value>Underglow</value>\n  </data>\n  <data name=\"AutoApply\" xml:space=\"preserve\">\n    <value>Auto Apply</value>\n  </data>\n  <data name=\"AutoMode\" xml:space=\"preserve\">\n    <value>Auto</value>\n  </data>\n  <data name=\"AutoRefreshTooltip\" xml:space=\"preserve\">\n    <value>Sets 60Hz to save battery, and back when plugged</value>\n  </data>\n  <data name=\"Awake\" xml:space=\"preserve\">\n    <value>Awake</value>\n  </data>\n  <data name=\"BacklightLow\" xml:space=\"preserve\">\n    <value>Low</value>\n  </data>\n  <data name=\"BacklightMax\" xml:space=\"preserve\">\n    <value>Max</value>\n  </data>\n  <data name=\"BacklightMid\" xml:space=\"preserve\">\n    <value>Mid</value>\n  </data>\n  <data name=\"BacklightOff\" xml:space=\"preserve\">\n    <value>Off</value>\n  </data>\n  <data name=\"BacklightTimeout\" xml:space=\"preserve\">\n    <value>Timeout plugged / on battery (0 - ON)</value>\n  </data>\n  <data name=\"BacklightTimeoutBattery\" xml:space=\"preserve\">\n    <value>Backlight Timeout when on battery</value>\n  </data>\n  <data name=\"BacklightTimeoutPlugged\" xml:space=\"preserve\">\n    <value>Backlight Timeout when plugged</value>\n  </data>\n  <data name=\"Balanced\" xml:space=\"preserve\">\n    <value>Balanced</value>\n  </data>\n  <data name=\"BatteryCharge\" xml:space=\"preserve\">\n    <value>Charge</value>\n  </data>\n  <data name=\"BatteryChargeLimit\" xml:space=\"preserve\">\n    <value>Battery Charge Limit</value>\n  </data>\n  <data name=\"BatteryHealth\" xml:space=\"preserve\">\n    <value>Battery Health</value>\n  </data>\n  <data name=\"BatteryLimitFull\" xml:space=\"preserve\">\n    <value>One time charge to 100%</value>\n  </data>\n  <data name=\"Binding\" xml:space=\"preserve\">\n    <value>Binding</value>\n  </data>\n  <data name=\"BindingPrimary\" xml:space=\"preserve\">\n    <value>Primary</value>\n  </data>\n  <data name=\"BindingSecondary\" xml:space=\"preserve\">\n    <value>Secondary</value>\n  </data>\n  <data name=\"BiosAndDriverUpdates\" xml:space=\"preserve\">\n    <value>BIOS and Driver Updates</value>\n  </data>\n  <data name=\"Boot\" xml:space=\"preserve\">\n    <value>Boot</value>\n  </data>\n  <data name=\"BootSound\" xml:space=\"preserve\">\n    <value>Boot Sound</value>\n  </data>\n  <data name=\"Brightness\" xml:space=\"preserve\">\n    <value>Brightness</value>\n  </data>\n  <data name=\"BrightnessDown\" xml:space=\"preserve\">\n    <value>Brightness Down</value>\n  </data>\n  <data name=\"BrightnessUp\" xml:space=\"preserve\">\n    <value>Brightness Up</value>\n  </data>\n  <data name=\"BWTrayIcon\" xml:space=\"preserve\">\n    <value>Black and white tray icon</value>\n  </data>\n  <data name=\"Calibrate\" xml:space=\"preserve\">\n    <value>Calibrate</value>\n  </data>\n  <data name=\"Charging\" xml:space=\"preserve\">\n    <value>Charging</value>\n  </data>\n  <data name=\"Color\" xml:space=\"preserve\">\n    <value>Color</value>\n  </data>\n  <data name=\"Contrast\" xml:space=\"preserve\">\n    <value>Contrast</value>\n  </data>\n  <data name=\"Controller\" xml:space=\"preserve\">\n    <value>Controller</value>\n  </data>\n  <data name=\"CPUBoost\" xml:space=\"preserve\">\n    <value>CPU Boost</value>\n  </data>\n  <data name=\"Custom\" xml:space=\"preserve\">\n    <value>Custom</value>\n  </data>\n  <data name=\"Deceleration\" xml:space=\"preserve\">\n    <value>Deceleration</value>\n  </data>\n  <data name=\"Default\" xml:space=\"preserve\">\n    <value>Default</value>\n  </data>\n  <data name=\"DisableController\" xml:space=\"preserve\">\n    <value>Disable Controller</value>\n  </data>\n  <data name=\"DisableOnLidClose\" xml:space=\"preserve\">\n    <value>Disable on lid close</value>\n  </data>\n  <data name=\"DisableOverdrive\" xml:space=\"preserve\">\n    <value>Disable screen overdrive</value>\n  </data>\n  <data name=\"Discharging\" xml:space=\"preserve\">\n    <value>Discharging</value>\n  </data>\n  <data name=\"DownloadColorProfiles\" xml:space=\"preserve\">\n    <value>Download Color Profiles</value>\n  </data>\n  <data name=\"DownloadUpdate\" xml:space=\"preserve\">\n    <value>Download</value>\n  </data>\n  <data name=\"DriverAndSoftware\" xml:space=\"preserve\">\n    <value>Drivers and Software</value>\n  </data>\n  <data name=\"EcoGPUTooltip\" xml:space=\"preserve\">\n    <value>Disables dGPU to save battery</value>\n  </data>\n  <data name=\"EcoMode\" xml:space=\"preserve\">\n    <value>Eco</value>\n  </data>\n  <data name=\"EnableGPUOnShutdown\" xml:space=\"preserve\">\n    <value>Enable GPU on shutdown (prevents issue with Eco mode)</value>\n  </data>\n  <data name=\"EnableOptimusText\" xml:space=\"preserve\">\n    <value>Disabling the dGPU by going into Eco mode while Display Mode in NVIDIA Control Panel is not set to Optimus might cause problems with brightness controls until after the next reboot. \n\nDo you still want to continue?</value>\n  </data>\n  <data name=\"EnableOptimusTitle\" xml:space=\"preserve\">\n    <value>NVIDIA Display Mode is not set to Optimus</value>\n  </data>\n  <data name=\"EnergySettings\" xml:space=\"preserve\">\n    <value>Energy Settings</value>\n  </data>\n  <data name=\"Export\" xml:space=\"preserve\">\n    <value>Export Profile</value>\n  </data>\n  <data name=\"Extra\" xml:space=\"preserve\">\n    <value>Extra</value>\n  </data>\n  <data name=\"ExtraSettings\" xml:space=\"preserve\">\n    <value>Extra Settings</value>\n  </data>\n  <data name=\"FactoryDefaults\" xml:space=\"preserve\">\n    <value>Factory Defaults</value>\n  </data>\n  <data name=\"FanCurves\" xml:space=\"preserve\">\n    <value>Fan Curves</value>\n  </data>\n  <data name=\"FanProfileCPU\" xml:space=\"preserve\">\n    <value>CPU Fan Profile</value>\n  </data>\n  <data name=\"FanProfileGPU\" xml:space=\"preserve\">\n    <value>GPU Fan Profile</value>\n  </data>\n  <data name=\"FanProfileMid\" xml:space=\"preserve\">\n    <value>Mid Fan Profile</value>\n  </data>\n  <data name=\"FanProfiles\" xml:space=\"preserve\">\n    <value>Fan Profiles</value>\n  </data>\n  <data name=\"FansAndPower\" xml:space=\"preserve\">\n    <value>Fans and Power</value>\n  </data>\n  <data name=\"FanSpeed\" xml:space=\"preserve\">\n    <value>Fan</value>\n  </data>\n  <data name=\"FansPower\" xml:space=\"preserve\">\n    <value>Fans + Power</value>\n  </data>\n  <data name=\"FlickerFreeDimming\" xml:space=\"preserve\">\n    <value>Flicker-free Dimming</value>\n  </data>\n  <data name=\"FnLock\" xml:space=\"preserve\">\n    <value>Process Fn+F hotkeys without Fn</value>\n  </data>\n  <data name=\"FnLockOff\" xml:space=\"preserve\">\n    <value>FN-Lock Off</value>\n  </data>\n  <data name=\"FnLockOn\" xml:space=\"preserve\">\n    <value>FN-Lock On</value>\n  </data>\n  <data name=\"GPUBoost\" xml:space=\"preserve\">\n    <value>Dynamic Boost</value>\n  </data>\n  <data name=\"GPUChanging\" xml:space=\"preserve\">\n    <value>Changing</value>\n  </data>\n  <data name=\"GPUCoreClockOffset\" xml:space=\"preserve\">\n    <value>Core Clock Offset</value>\n  </data>\n  <data name=\"GPUMemoryClockOffset\" xml:space=\"preserve\">\n    <value>Memory Clock Offset</value>\n  </data>\n  <data name=\"GPUMode\" xml:space=\"preserve\">\n    <value>GPU Mode</value>\n  </data>\n  <data name=\"GPUModeEco\" xml:space=\"preserve\">\n    <value>iGPU only</value>\n  </data>\n  <data name=\"GPUModeStandard\" xml:space=\"preserve\">\n    <value>iGPU + dGPU</value>\n  </data>\n  <data name=\"GPUModeUltimate\" xml:space=\"preserve\">\n    <value>dGPU exclusive</value>\n  </data>\n  <data name=\"GPUPower\" xml:space=\"preserve\">\n    <value>GPU Power</value>\n  </data>\n  <data name=\"GPUSettings\" xml:space=\"preserve\">\n    <value>GPU Settings</value>\n  </data>\n  <data name=\"GPUTempTarget\" xml:space=\"preserve\">\n    <value>Temperature Target</value>\n  </data>\n  <data name=\"HibernateAfter\" xml:space=\"preserve\">\n    <value>Minutes till Hibernation in sleep on battery (0 - OFF)</value>\n  </data>\n  <data name=\"High\" xml:space=\"preserve\">\n    <value>High</value>\n  </data>\n  <data name=\"ImageRotation\" xml:space=\"preserve\">\n    <value>Image Rotation</value>\n  </data>\n  <data name=\"Import\" xml:space=\"preserve\">\n    <value>Import Profile</value>\n  </data>\n  <data name=\"KeyBindings\" xml:space=\"preserve\">\n    <value>Key Bindings</value>\n  </data>\n  <data name=\"Keyboard\" xml:space=\"preserve\">\n    <value>Keyboard</value>\n  </data>\n  <data name=\"KillGpuApps\" xml:space=\"preserve\">\n    <value>Stop all apps using GPU when switching to Eco</value>\n  </data>\n  <data name=\"LaptopBacklight\" xml:space=\"preserve\">\n    <value>Laptop Backlight</value>\n  </data>\n  <data name=\"LaptopKeyboard\" xml:space=\"preserve\">\n    <value>Laptop Keyboard</value>\n  </data>\n  <data name=\"LaptopScreen\" xml:space=\"preserve\">\n    <value>Laptop Screen</value>\n  </data>\n  <data name=\"LEDStatusIndicators\" xml:space=\"preserve\">\n    <value>LED Status Indicators</value>\n  </data>\n  <data name=\"Lid\" xml:space=\"preserve\">\n    <value>Lid</value>\n  </data>\n  <data name=\"Lightbar\" xml:space=\"preserve\">\n    <value>Lightbar</value>\n  </data>\n  <data name=\"Lighting\" xml:space=\"preserve\">\n    <value>Lighting</value>\n  </data>\n  <data name=\"LockScreen\" xml:space=\"preserve\">\n    <value>Lock Screen</value>\n  </data>\n  <data name=\"Logo\" xml:space=\"preserve\">\n    <value>Logo</value>\n  </data>\n  <data name=\"Low\" xml:space=\"preserve\">\n    <value>Low</value>\n  </data>\n  <data name=\"LSDeadzones\" xml:space=\"preserve\">\n    <value>Left Stick Deadzones</value>\n  </data>\n  <data name=\"LTDeadzones\" xml:space=\"preserve\">\n    <value>Left Trigger Deadzones</value>\n  </data>\n  <data name=\"MatrixAudio\" xml:space=\"preserve\">\n    <value>Audio Visualizer</value>\n  </data>\n  <data name=\"MatrixBanner\" xml:space=\"preserve\">\n    <value>Binary Banner</value>\n  </data>\n  <data name=\"MatrixBright\" xml:space=\"preserve\">\n    <value>Bright</value>\n  </data>\n  <data name=\"MatrixClock\" xml:space=\"preserve\">\n    <value>Clock</value>\n  </data>\n  <data name=\"MatrixDim\" xml:space=\"preserve\">\n    <value>Dim</value>\n  </data>\n  <data name=\"MatrixLogo\" xml:space=\"preserve\">\n    <value>Rog Logo</value>\n  </data>\n  <data name=\"MatrixMedium\" xml:space=\"preserve\">\n    <value>Medium</value>\n  </data>\n  <data name=\"MatrixOff\" xml:space=\"preserve\">\n    <value>Off</value>\n  </data>\n  <data name=\"MatrixPicture\" xml:space=\"preserve\">\n    <value>Picture</value>\n  </data>\n  <data name=\"MaxRefreshTooltip\" xml:space=\"preserve\">\n    <value>Max refresh rate for lower latency</value>\n  </data>\n  <data name=\"MinRefreshTooltip\" xml:space=\"preserve\">\n    <value>60Hz refresh rate to save battery</value>\n  </data>\n  <data name=\"Minute\" xml:space=\"preserve\">\n    <value>Minute</value>\n  </data>\n  <data name=\"Minutes\" xml:space=\"preserve\">\n    <value>Minutes</value>\n  </data>\n  <data name=\"MouseAngleSnapping\" xml:space=\"preserve\">\n    <value>Angle Snapping / Tuning</value>\n  </data>\n  <data name=\"MouseAutoPowerOff\" xml:space=\"preserve\">\n    <value>Auto Power Off After</value>\n  </data>\n  <data name=\"MouseButtonResponse\" xml:space=\"preserve\">\n    <value>Button Response</value>\n  </data>\n  <data name=\"MouseImportFailed\" xml:space=\"preserve\">\n    <value>Import failed. Selected file is not a valid mouse profile or corrutpted.</value>\n  </data>\n  <data name=\"MouseLiftOffDistance\" xml:space=\"preserve\">\n    <value>Lift Off Distance</value>\n  </data>\n  <data name=\"MouseLowBatteryWarning\" xml:space=\"preserve\">\n    <value>Low Battery Warning at</value>\n  </data>\n  <data name=\"MousePerformance\" xml:space=\"preserve\">\n    <value>Performance</value>\n  </data>\n  <data name=\"MouseSynchronize\" xml:space=\"preserve\">\n    <value>Synchronize with mouse</value>\n  </data>\n  <data name=\"Multizone\" xml:space=\"preserve\">\n    <value>Multi Zone</value>\n  </data>\n  <data name=\"MultizoneStrong\" xml:space=\"preserve\">\n    <value>Multi Zone Strong</value>\n  </data>\n  <data name=\"Muted\" xml:space=\"preserve\">\n    <value>Muted</value>\n  </data>\n  <data name=\"MuteMic\" xml:space=\"preserve\">\n    <value>Mute Mic</value>\n  </data>\n  <data name=\"Never\" xml:space=\"preserve\">\n    <value>Never</value>\n  </data>\n  <data name=\"NewUpdates\" xml:space=\"preserve\">\n    <value>New updates</value>\n  </data>\n  <data name=\"NoNewUpdates\" xml:space=\"preserve\">\n    <value>No new updates</value>\n  </data>\n  <data name=\"NotConnected\" xml:space=\"preserve\">\n    <value>Not Connected</value>\n  </data>\n  <data name=\"Off\" xml:space=\"preserve\">\n    <value>Off</value>\n  </data>\n  <data name=\"On\" xml:space=\"preserve\">\n    <value>On</value>\n  </data>\n  <data name=\"OneZone\" xml:space=\"preserve\">\n    <value>One Zone</value>\n  </data>\n  <data name=\"OpenGHelper\" xml:space=\"preserve\">\n    <value>Open G-Helper window</value>\n  </data>\n  <data name=\"Optimized\" xml:space=\"preserve\">\n    <value>Optimized</value>\n  </data>\n  <data name=\"OptimizedGPUTooltip\" xml:space=\"preserve\">\n    <value>Switch to Eco on battery and to Standard when plugged in</value>\n  </data>\n  <data name=\"OptimizedUSBC\" xml:space=\"preserve\">\n    <value>Keep GPU disabled on USB-C charger in Optimized mode</value>\n  </data>\n  <data name=\"Other\" xml:space=\"preserve\">\n    <value>Other</value>\n  </data>\n  <data name=\"Overdrive\" xml:space=\"preserve\">\n    <value>Overdrive</value>\n  </data>\n  <data name=\"PerformanceMode\" xml:space=\"preserve\">\n    <value>Mode</value>\n  </data>\n  <data name=\"Peripherals\" xml:space=\"preserve\">\n    <value>Peripherals</value>\n  </data>\n  <data name=\"PictureGif\" xml:space=\"preserve\">\n    <value>Picture / Gif</value>\n  </data>\n  <data name=\"PlayPause\" xml:space=\"preserve\">\n    <value>Play / Pause</value>\n  </data>\n  <data name=\"PollingRate\" xml:space=\"preserve\">\n    <value>Polling Rate</value>\n  </data>\n  <data name=\"PowerLimits\" xml:space=\"preserve\">\n    <value>Power Limits</value>\n  </data>\n  <data name=\"PPTExperimental\" xml:space=\"preserve\">\n    <value>Power Limits is an experimental feature. Use carefully and at your own risk!</value>\n  </data>\n  <data name=\"PrintScreen\" xml:space=\"preserve\">\n    <value>PrintScreen</value>\n  </data>\n  <data name=\"Profile\" xml:space=\"preserve\">\n    <value>Profile</value>\n  </data>\n  <data name=\"Quit\" xml:space=\"preserve\">\n    <value>Quit</value>\n  </data>\n  <data name=\"Reset\" xml:space=\"preserve\">\n    <value>Reset</value>\n  </data>\n  <data name=\"RestartGPU\" xml:space=\"preserve\">\n    <value>Something is using dGPU and preventing Eco mode. Let G-Helper try to restart dGPU in device manager? (Please proceed at your own risk)</value>\n  </data>\n  <data name=\"RPM\" xml:space=\"preserve\">\n    <value>RPM</value>\n  </data>\n  <data name=\"RSDeadzones\" xml:space=\"preserve\">\n    <value>Right Stick Deadzones</value>\n  </data>\n  <data name=\"RTDeadzones\" xml:space=\"preserve\">\n    <value>Right Trigger Deadzones</value>\n  </data>\n  <data name=\"RunOnStartup\" xml:space=\"preserve\">\n    <value>Run on Startup</value>\n  </data>\n  <data name=\"ScalingQuality\" xml:space=\"preserve\">\n    <value>Scaling Quality</value>\n  </data>\n  <data name=\"ScreenPadDown\" xml:space=\"preserve\">\n    <value>Screenpad Brightness Down</value>\n  </data>\n  <data name=\"ScreenPadUp\" xml:space=\"preserve\">\n    <value>Screenpad Brightness Up</value>\n  </data>\n  <data name=\"Shutdown\" xml:space=\"preserve\">\n    <value>Shutdown</value>\n  </data>\n  <data name=\"Silent\" xml:space=\"preserve\">\n    <value>Silent</value>\n  </data>\n  <data name=\"Sleep\" xml:space=\"preserve\">\n    <value>Sleep</value>\n  </data>\n  <data name=\"StandardGPUTooltip\" xml:space=\"preserve\">\n    <value>Enables dGPU for standard use</value>\n  </data>\n  <data name=\"StandardMode\" xml:space=\"preserve\">\n    <value>Standard</value>\n  </data>\n  <data name=\"Start\" xml:space=\"preserve\">\n    <value>Start</value>\n  </data>\n  <data name=\"StartingServices\" xml:space=\"preserve\">\n    <value>Starting Services</value>\n  </data>\n  <data name=\"StartupError\" xml:space=\"preserve\">\n    <value>Startup Error</value>\n  </data>\n  <data name=\"Stop\" xml:space=\"preserve\">\n    <value>Stop</value>\n  </data>\n  <data name=\"StopGPUApps\" xml:space=\"preserve\">\n    <value>Stop GPU Applications</value>\n  </data>\n  <data name=\"StoppingServices\" xml:space=\"preserve\">\n    <value>Stopping Services</value>\n  </data>\n  <data name=\"ToggleAura\" xml:space=\"preserve\">\n    <value>Toggle Aura</value>\n  </data>\n  <data name=\"ToggleClamshellMode\" xml:space=\"preserve\">\n    <value>Auto Toggle Clamshell Mode</value>\n  </data>\n  <data name=\"ToggleFnLock\" xml:space=\"preserve\">\n    <value>Toggle Fn-Lock</value>\n  </data>\n  <data name=\"ToggleMiniled\" xml:space=\"preserve\">\n    <value>Toggle Miniled (if supported)</value>\n  </data>\n  <data name=\"ToggleScreen\" xml:space=\"preserve\">\n    <value>Toggle Screen</value>\n  </data>\n  <data name=\"ToggleTouchscreen\" xml:space=\"preserve\">\n    <value>Toggle Touchscreen</value>\n  </data>\n  <data name=\"Touchscreen\" xml:space=\"preserve\">\n    <value>Touchscreen</value>\n  </data>\n  <data name=\"Turbo\" xml:space=\"preserve\">\n    <value>Turbo</value>\n  </data>\n  <data name=\"TurnedOff\" xml:space=\"preserve\">\n    <value>Turned off</value>\n  </data>\n  <data name=\"TurnOffOnBattery\" xml:space=\"preserve\">\n    <value>Disable on battery</value>\n  </data>\n  <data name=\"UltimateGPUTooltip\" xml:space=\"preserve\">\n    <value>Routes laptop screen to dGPU, maximizing FPS</value>\n  </data>\n  <data name=\"UltimateMode\" xml:space=\"preserve\">\n    <value>Ultimate</value>\n  </data>\n  <data name=\"UndervoltingRisky\" xml:space=\"preserve\">\n    <value>Undervolting is an experimental and risky feature. If applied values are too low for your hardware, it can become unstable, shut down or cause data corruption. If you want to try - start from small values first, click Apply and test what works for you.</value>\n  </data>\n  <data name=\"Unmuted\" xml:space=\"preserve\">\n    <value>Unmuted</value>\n  </data>\n  <data name=\"Updates\" xml:space=\"preserve\">\n    <value>Updates</value>\n  </data>\n  <data name=\"VersionLabel\" xml:space=\"preserve\">\n    <value>Version</value>\n  </data>\n  <data name=\"VibrationStrength\" xml:space=\"preserve\">\n    <value>Vibration Strength</value>\n  </data>\n  <data name=\"VisualMode\" xml:space=\"preserve\">\n    <value>Visual Mode</value>\n  </data>\n  <data name=\"VisualModesHDR\" xml:space=\"preserve\">\n    <value>Visual Modes are not available when HDR is active</value>\n  </data>\n  <data name=\"VisualModesScreen\" xml:space=\"preserve\">\n    <value>Visual Modes are not available when laptop screen is off</value>\n  </data>\n  <data name=\"VolumeDown\" xml:space=\"preserve\">\n    <value>Volume Down</value>\n  </data>\n  <data name=\"VolumeMute\" xml:space=\"preserve\">\n    <value>Volume Mute</value>\n  </data>\n  <data name=\"VolumeUp\" xml:space=\"preserve\">\n    <value>Volume Up</value>\n  </data>\n  <data name=\"WindowTop\" xml:space=\"preserve\">\n    <value>Keep app window always on top</value>\n  </data>\n  <data name=\"Zoom\" xml:space=\"preserve\">\n    <value>Zoom</value>\n  </data>\n  <data name=\"Donate\" xml:space=\"preserve\">\n    <value>Donate</value>\n  </data>\n  <data name=\"Legend\" xml:space=\"preserve\">\n    <value>Legend</value>\n  </data>\n  <data name=\"LegendGray\" xml:space=\"preserve\">\n    <value>Can't check local version</value>\n    <comment>Can't check local version</comment>\n  </data>\n  <data name=\"LegendRed\" xml:space=\"preserve\">\n    <value>Update Available</value>\n    <comment>Update Available</comment>\n  </data>\n  <data name=\"LegendGreen\" xml:space=\"preserve\">\n    <value>Updated</value>\n    <comment>Updated</comment>\n  </data>\n  <data name=\"SlashBounce\" xml:space=\"preserve\">\n    <value>Bounce</value>\n  </data>\n  <data name=\"SlashMode\" xml:space=\"preserve\">\n    <value>Slash</value>\n  </data>\n  <data name=\"SlashLoading\" xml:space=\"preserve\">\n    <value>Loading</value>\n  </data>\n  <data name=\"SlashBitStream\" xml:space=\"preserve\">\n    <value>Bit Stream</value>\n  </data>\n  <data name=\"SlashTransmission\" xml:space=\"preserve\">\n    <value>Transmission</value>\n  </data>\n  <data name=\"SlashFlow\" xml:space=\"preserve\">\n    <value>Flow</value>\n  </data>\n  <data name=\"SlashFlux\" xml:space=\"preserve\">\n    <value>Flux</value>\n  </data>\n  <data name=\"SlashPhantom\" xml:space=\"preserve\">\n    <value>Phantom</value>\n  </data>\n  <data name=\"SlashSpectrum\" xml:space=\"preserve\">\n    <value>Spectrum</value>\n  </data>\n  <data name=\"SlashHazard\" xml:space=\"preserve\">\n    <value>Hazard</value>\n  </data>\n  <data name=\"SlashInterfacing\" xml:space=\"preserve\">\n    <value>Interfacing</value>\n  </data>\n  <data name=\"SlashRamp\" xml:space=\"preserve\">\n    <value>Ramp</value>\n  </data>\n  <data name=\"SlashGameOver\" xml:space=\"preserve\">\n    <value>Game Over</value>\n  </data>\n  <data name=\"SlashStart\" xml:space=\"preserve\">\n    <value>Start</value>\n  </data>\n  <data name=\"SlashBuzzer\" xml:space=\"preserve\">\n    <value>Buzzer</value>\n  </data>\n  <data name=\"SlashStatic\" xml:space=\"preserve\">\n    <value>Static</value>\n  </data>\n  <data name=\"SlashBatteryLevel\" xml:space=\"preserve\">\n    <value>Battery Level</value>\n  </data>\n  <data name=\"IntervalOff\" xml:space=\"preserve\">\n    <value>Interval Off</value>\n  </data>\n  <data name=\"IntervalSeconds\" xml:space=\"preserve\">\n    <value>Interval {0}s</value>\n  </data>\n  <data name=\"DisableDynamicLighting\" xml:space=\"preserve\">\n    <value>Please disable Windows &gt; Dynamic Lighting</value>\n  </data>\n  <data name=\"AmbientModeResources\" xml:space=\"preserve\">\n    <value>Ambient mode may increase resource usage</value>\n  </data>\n  <data name=\"MouseMotionSync\" xml:space=\"preserve\">\n    <value>Motion Sync</value>\n  </data>\n  <data name=\"MouseZoneMode\" xml:space=\"preserve\">\n    <value>Zone Mode</value>\n  </data>\n</root>"
  },
  {
    "path": "app/Properties/Strings.ro.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" id=\"root\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\"/>\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"name\" type=\"xsd:string\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\"/>\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Acceleration\" xml:space=\"preserve\">\n    <value>Accelerare</value>\n  </data>\n  <data name=\"ACPIError\" xml:space=\"preserve\">\n    <value>Nu se poate conecta la ASUS ACPI. Aplicația nu poate funcționa fără aceasta. Încercați să instalați Asus System Control Interface</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestart\" xml:space=\"preserve\">\n    <value>Reporniți dispozitivul pentru a aplica modificările</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestartTitle\" xml:space=\"preserve\">\n    <value>Reporniți acum?</value>\n  </data>\n  <data name=\"AlertDGPU\" xml:space=\"preserve\">\n    <value>Se pare că GPU-ul este folosit intens, dezactivați?</value>\n  </data>\n  <data name=\"AlertDGPUTitle\" xml:space=\"preserve\">\n    <value>Modul Eco</value>\n  </data>\n  <data name=\"AlertUltimateOff\" xml:space=\"preserve\">\n    <value>Oprirea modului Ultimate necesită o repornire de sistem</value>\n  </data>\n  <data name=\"AlertUltimateOn\" xml:space=\"preserve\">\n    <value>Modul Ultimate necesită o repornire a sistemului</value>\n  </data>\n  <data name=\"AlertUltimateTitle\" xml:space=\"preserve\">\n    <value>Reporniți acum?</value>\n  </data>\n  <data name=\"AllyController\" xml:space=\"preserve\">\n    <value>Ally Controller</value>\n  </data>\n  <data name=\"AnimationSpeed\" xml:space=\"preserve\">\n    <value>Viteza animației</value>\n  </data>\n  <data name=\"AnimeMatrix\" xml:space=\"preserve\">\n    <value>Matricea Anime</value>\n  </data>\n  <data name=\"AppAlreadyRunning\" xml:space=\"preserve\">\n    <value>Aplicația rulează deja</value>\n  </data>\n  <data name=\"AppAlreadyRunningText\" xml:space=\"preserve\">\n    <value>G-Helper deja rulează. Verificați bara de sistem pentru o iconiță.</value>\n  </data>\n  <data name=\"Apply\" xml:space=\"preserve\">\n    <value>Aplică</value>\n  </data>\n  <data name=\"ApplyFanCurve\" xml:space=\"preserve\">\n    <value>Aplicați curba personalizată</value>\n  </data>\n  <data name=\"ApplyPowerLimits\" xml:space=\"preserve\">\n    <value>Aplică limitele de putere</value>\n  </data>\n  <data name=\"ApplyWindowsPowerPlan\" xml:space=\"preserve\">\n    <value>Reglare automată a modului de alimentare Windows</value>\n  </data>\n  <data name=\"APUMemory\" xml:space=\"preserve\">\n    <value>Memorie alocată GPU-ului</value>\n  </data>\n  <data name=\"AsusServicesRunning\" xml:space=\"preserve\">\n    <value>Servicii Asus în derulare</value>\n  </data>\n  <data name=\"AuraBatteryState\" xml:space=\"preserve\">\n    <value>Starea bateriei</value>\n  </data>\n  <data name=\"AuraBreathe\" xml:space=\"preserve\">\n    <value>Respirație</value>\n  </data>\n  <data name=\"AuraClockwise\" xml:space=\"preserve\">\n    <value>În sensul acelor de ceas</value>\n  </data>\n  <data name=\"AuraColorCycle\" xml:space=\"preserve\">\n    <value>Ciclu de culori</value>\n  </data>\n  <data name=\"AuraComet\" xml:space=\"preserve\">\n    <value>Cometă</value>\n  </data>\n  <data name=\"AuraCounterClockwise\" xml:space=\"preserve\">\n    <value>În sens invers acelor de ceas</value>\n  </data>\n  <data name=\"AuraFast\" xml:space=\"preserve\">\n    <value>Rapid</value>\n  </data>\n  <data name=\"AuraLightingMode\" xml:space=\"preserve\">\n    <value>Mod iluminare</value>\n  </data>\n  <data name=\"AuraNormal\" xml:space=\"preserve\">\n    <value>Normal</value>\n  </data>\n  <data name=\"AuraRainbow\" xml:space=\"preserve\">\n    <value>Curcubeu</value>\n  </data>\n  <data name=\"AuraRandomColor\" xml:space=\"preserve\">\n    <value>Aleatoriu</value>\n  </data>\n  <data name=\"AuraReact\" xml:space=\"preserve\">\n    <value>Reacție</value>\n  </data>\n  <data name=\"AuraSlow\" xml:space=\"preserve\">\n    <value>Încet</value>\n  </data>\n  <data name=\"AuraStatic\" xml:space=\"preserve\">\n    <value>Static</value>\n  </data>\n  <data name=\"AuraStrobe\" xml:space=\"preserve\">\n    <value>Stroboscop</value>\n  </data>\n  <data name=\"AuraZoneAll\" xml:space=\"preserve\">\n    <value>Toate</value>\n  </data>\n  <data name=\"AuraZoneDock\" xml:space=\"preserve\">\n    <value>Dock</value>\n  </data>\n  <data name=\"AuraZoneLogo\" xml:space=\"preserve\">\n    <value>Logo</value>\n  </data>\n  <data name=\"AuraZoneScroll\" xml:space=\"preserve\">\n    <value>Rotiță scroll</value>\n  </data>\n  <data name=\"AuraZoneUnderglow\" xml:space=\"preserve\">\n    <value>Iluminare de jos</value>\n  </data>\n  <data name=\"AutoApply\" xml:space=\"preserve\">\n    <value>Aplicare automată</value>\n  </data>\n  <data name=\"AutoMode\" xml:space=\"preserve\">\n    <value>Automat</value>\n  </data>\n  <data name=\"AutoRefreshTooltip\" xml:space=\"preserve\">\n    <value>Setează ecranul la 60Hz pentru a economisi bateria, și înapoi cât se încarcă</value>\n  </data>\n  <data name=\"Awake\" xml:space=\"preserve\">\n    <value>Treaz</value>\n  </data>\n  <data name=\"BacklightLow\" xml:space=\"preserve\">\n    <value>Low</value>\n  </data>\n  <data name=\"BacklightMax\" xml:space=\"preserve\">\n    <value>Max</value>\n  </data>\n  <data name=\"BacklightMid\" xml:space=\"preserve\">\n    <value>Mid</value>\n  </data>\n  <data name=\"BacklightOff\" xml:space=\"preserve\">\n    <value>Off</value>\n  </data>\n  <data name=\"BacklightTimeout\" xml:space=\"preserve\">\n    <value>Timeout conectat / folosind bateria (0 - ON)</value>\n  </data>\n  <data name=\"BacklightTimeoutBattery\" xml:space=\"preserve\">\n    <value>Timp oprire iluminare pe baterie</value>\n  </data>\n  <data name=\"BacklightTimeoutPlugged\" xml:space=\"preserve\">\n    <value>Timp oprire iluminare când e conectat</value>\n  </data>\n  <data name=\"Balanced\" xml:space=\"preserve\">\n    <value>Echilibrat</value>\n  </data>\n  <data name=\"BatteryCharge\" xml:space=\"preserve\">\n    <value>Încărcare</value>\n  </data>\n  <data name=\"BatteryChargeLimit\" xml:space=\"preserve\">\n    <value>Limita de încărcare a bateriei</value>\n  </data>\n  <data name=\"BatteryHealth\" xml:space=\"preserve\">\n    <value>Sănătatea bateriei</value>\n  </data>\n  <data name=\"BatteryLimitFull\" xml:space=\"preserve\">\n    <value>Încarcă o dată la 100%</value>\n  </data>\n  <data name=\"Binding\" xml:space=\"preserve\">\n    <value>Binding</value>\n  </data>\n  <data name=\"BindingPrimary\" xml:space=\"preserve\">\n    <value>Primary</value>\n  </data>\n  <data name=\"BindingSecondary\" xml:space=\"preserve\">\n    <value>Secondary</value>\n  </data>\n  <data name=\"BiosAndDriverUpdates\" xml:space=\"preserve\">\n    <value>Actualizări BIOS și Driver</value>\n  </data>\n  <data name=\"Boot\" xml:space=\"preserve\">\n    <value>Pornire</value>\n  </data>\n  <data name=\"BootSound\" xml:space=\"preserve\">\n    <value>Sunet la pornire</value>\n  </data>\n  <data name=\"Brightness\" xml:space=\"preserve\">\n    <value>Luminozitate</value>\n  </data>\n  <data name=\"BrightnessDown\" xml:space=\"preserve\">\n    <value>Scăderea luminozității</value>\n  </data>\n  <data name=\"BrightnessUp\" xml:space=\"preserve\">\n    <value>Mărirea luminozității</value>\n  </data>\n  <data name=\"BWTrayIcon\" xml:space=\"preserve\">\n    <value>Black and white tray icon</value>\n  </data>\n  <data name=\"Calibrate\" xml:space=\"preserve\">\n    <value>Calibrează</value>\n  </data>\n  <data name=\"Charging\" xml:space=\"preserve\">\n    <value>Se încarcă</value>\n  </data>\n  <data name=\"Color\" xml:space=\"preserve\">\n    <value>Culoare</value>\n  </data>\n  <data name=\"Contrast\" xml:space=\"preserve\">\n    <value>Contrast</value>\n  </data>\n  <data name=\"Controller\" xml:space=\"preserve\">\n    <value>Controller</value>\n  </data>\n  <data name=\"CPUBoost\" xml:space=\"preserve\">\n    <value>Accelerare CPU</value>\n  </data>\n  <data name=\"Custom\" xml:space=\"preserve\">\n    <value>Personalizat</value>\n  </data>\n  <data name=\"Deceleration\" xml:space=\"preserve\">\n    <value>Decelerare</value>\n  </data>\n  <data name=\"Default\" xml:space=\"preserve\">\n    <value>Implicit</value>\n  </data>\n  <data name=\"DisableController\" xml:space=\"preserve\">\n    <value>Disable Controller</value>\n  </data>\n  <data name=\"DisableOnLidClose\" xml:space=\"preserve\">\n    <value>Disable on lid close</value>\n  </data>\n  <data name=\"DisableOverdrive\" xml:space=\"preserve\">\n    <value>Dezactivează screen overdrive</value>\n  </data>\n  <data name=\"Discharging\" xml:space=\"preserve\">\n    <value>Se descarcă</value>\n  </data>\n  <data name=\"DownloadColorProfiles\" xml:space=\"preserve\">\n    <value>Download Color Profiles</value>\n  </data>\n  <data name=\"DownloadUpdate\" xml:space=\"preserve\">\n    <value>Descarcă</value>\n  </data>\n  <data name=\"DriverAndSoftware\" xml:space=\"preserve\">\n    <value>Drivers și Aplicații</value>\n  </data>\n  <data name=\"EcoGPUTooltip\" xml:space=\"preserve\">\n    <value>Dezactivează dGPU pentru a economisi bateria</value>\n  </data>\n  <data name=\"EcoMode\" xml:space=\"preserve\">\n    <value>Eco</value>\n  </data>\n  <data name=\"EnableGPUOnShutdown\" xml:space=\"preserve\">\n    <value>Enable GPU on shutdown (prevents issue with Eco mode)</value>\n  </data>\n  <data name=\"EnableOptimusText\" xml:space=\"preserve\">\n    <value>Dezactivarea dGPU pentru a utiliza modul Eco, în timp ce Display Mode în NVIDIA Control Panel nu este setat la modul Optimus, poate cauza probleme cu controalele de luminozitate până la următoarea repornire. \n\nÎncă mai vrei să continui?</value>\n  </data>\n  <data name=\"EnableOptimusTitle\" xml:space=\"preserve\">\n    <value>NVIDIA Display Mode nu este setat la modul Optimus</value>\n  </data>\n  <data name=\"EnergySettings\" xml:space=\"preserve\">\n    <value>Setări energie</value>\n  </data>\n  <data name=\"Export\" xml:space=\"preserve\">\n    <value>Export Profile</value>\n  </data>\n  <data name=\"Extra\" xml:space=\"preserve\">\n    <value>Extra</value>\n  </data>\n  <data name=\"ExtraSettings\" xml:space=\"preserve\">\n    <value>Setări suplimentare</value>\n  </data>\n  <data name=\"FactoryDefaults\" xml:space=\"preserve\">\n    <value>Setările implicite ale fabricii</value>\n  </data>\n  <data name=\"FanCurves\" xml:space=\"preserve\">\n    <value>Curbe ventilator</value>\n  </data>\n  <data name=\"FanProfileCPU\" xml:space=\"preserve\">\n    <value>Profil ventilator CPU</value>\n  </data>\n  <data name=\"FanProfileGPU\" xml:space=\"preserve\">\n    <value>Profil ventilator GPU</value>\n  </data>\n  <data name=\"FanProfileMid\" xml:space=\"preserve\">\n    <value>Profil mediu ventilator</value>\n  </data>\n  <data name=\"FanProfiles\" xml:space=\"preserve\">\n    <value>Profiluri ventilatoare</value>\n  </data>\n  <data name=\"FansAndPower\" xml:space=\"preserve\">\n    <value>Vent. și putere</value>\n  </data>\n  <data name=\"FanSpeed\" xml:space=\"preserve\">\n    <value>Vent</value>\n  </data>\n  <data name=\"FansPower\" xml:space=\"preserve\">\n    <value>Fans + Power</value>\n  </data>\n  <data name=\"FlickerFreeDimming\" xml:space=\"preserve\">\n    <value>Flicker-free Dimming</value>\n  </data>\n  <data name=\"FnLock\" xml:space=\"preserve\">\n    <value>Procesează tastele Fn+F fără Fn</value>\n  </data>\n  <data name=\"FnLockOff\" xml:space=\"preserve\">\n    <value>FN-Lock Off</value>\n  </data>\n  <data name=\"FnLockOn\" xml:space=\"preserve\">\n    <value>FN-Lock On</value>\n  </data>\n  <data name=\"GPUBoost\" xml:space=\"preserve\">\n    <value>Dynamic Boost</value>\n  </data>\n  <data name=\"GPUChanging\" xml:space=\"preserve\">\n    <value>Modificare</value>\n  </data>\n  <data name=\"GPUCoreClockOffset\" xml:space=\"preserve\">\n    <value>Core Clock Offset</value>\n  </data>\n  <data name=\"GPUMemoryClockOffset\" xml:space=\"preserve\">\n    <value>Memory Clock Offset</value>\n  </data>\n  <data name=\"GPUMode\" xml:space=\"preserve\">\n    <value>Modul GPU</value>\n  </data>\n  <data name=\"GPUModeEco\" xml:space=\"preserve\">\n    <value>Doar iGPU</value>\n  </data>\n  <data name=\"GPUModeStandard\" xml:space=\"preserve\">\n    <value>iGPU + dGPU</value>\n  </data>\n  <data name=\"GPUModeUltimate\" xml:space=\"preserve\">\n    <value>exclusiv dGPU</value>\n  </data>\n  <data name=\"GPUPower\" xml:space=\"preserve\">\n    <value>GPU Power</value>\n  </data>\n  <data name=\"GPUSettings\" xml:space=\"preserve\">\n    <value>Setări GPU</value>\n  </data>\n  <data name=\"GPUTempTarget\" xml:space=\"preserve\">\n    <value>Temperatura țintă</value>\n  </data>\n  <data name=\"HibernateAfter\" xml:space=\"preserve\">\n    <value>Minute până la Hibernare în mod repaus pe baterie (0 - Oprit)</value>\n  </data>\n  <data name=\"High\" xml:space=\"preserve\">\n    <value>Ridicat</value>\n  </data>\n  <data name=\"ImageRotation\" xml:space=\"preserve\">\n    <value>Image Rotation</value>\n  </data>\n  <data name=\"Import\" xml:space=\"preserve\">\n    <value>Import Profile</value>\n  </data>\n  <data name=\"KeyBindings\" xml:space=\"preserve\">\n    <value>Asocieri taste</value>\n  </data>\n  <data name=\"Keyboard\" xml:space=\"preserve\">\n    <value>Tastatură</value>\n  </data>\n  <data name=\"KillGpuApps\" xml:space=\"preserve\">\n    <value>Opriți toate aplicațiile care folosesc GPU când treceți în modul Eco</value>\n  </data>\n  <data name=\"LaptopBacklight\" xml:space=\"preserve\">\n    <value>Lumina de fundal</value>\n  </data>\n  <data name=\"LaptopKeyboard\" xml:space=\"preserve\">\n    <value>Tastatură Laptop</value>\n  </data>\n  <data name=\"LaptopScreen\" xml:space=\"preserve\">\n    <value>Ecran Laptop</value>\n  </data>\n  <data name=\"LEDStatusIndicators\" xml:space=\"preserve\">\n    <value>LED Status Indicators</value>\n  </data>\n  <data name=\"Lid\" xml:space=\"preserve\">\n    <value>Capac</value>\n  </data>\n  <data name=\"Lightbar\" xml:space=\"preserve\">\n    <value>Lightbar</value>\n  </data>\n  <data name=\"Lighting\" xml:space=\"preserve\">\n    <value>Iluminare</value>\n  </data>\n  <data name=\"LockScreen\" xml:space=\"preserve\">\n    <value>Lock Screen</value>\n  </data>\n  <data name=\"Logo\" xml:space=\"preserve\">\n    <value>Logo-ul</value>\n  </data>\n  <data name=\"Low\" xml:space=\"preserve\">\n    <value>Scăzut</value>\n  </data>\n  <data name=\"LSDeadzones\" xml:space=\"preserve\">\n    <value>Left Stick Deadzones</value>\n  </data>\n  <data name=\"LTDeadzones\" xml:space=\"preserve\">\n    <value>Left Trigger Deadzones</value>\n  </data>\n  <data name=\"MatrixAudio\" xml:space=\"preserve\">\n    <value>Vizualizator audio</value>\n  </data>\n  <data name=\"MatrixBanner\" xml:space=\"preserve\">\n    <value>Binary Banner</value>\n  </data>\n  <data name=\"MatrixBright\" xml:space=\"preserve\">\n    <value>Luminos</value>\n  </data>\n  <data name=\"MatrixClock\" xml:space=\"preserve\">\n    <value>Ceas</value>\n  </data>\n  <data name=\"MatrixDim\" xml:space=\"preserve\">\n    <value>Dim</value>\n  </data>\n  <data name=\"MatrixLogo\" xml:space=\"preserve\">\n    <value>Logo-ul ROG</value>\n  </data>\n  <data name=\"MatrixMedium\" xml:space=\"preserve\">\n    <value>Mediu</value>\n  </data>\n  <data name=\"MatrixOff\" xml:space=\"preserve\">\n    <value>Oprit</value>\n  </data>\n  <data name=\"MatrixPicture\" xml:space=\"preserve\">\n    <value>Imagine</value>\n  </data>\n  <data name=\"MaxRefreshTooltip\" xml:space=\"preserve\">\n    <value>Rata maximă de reîmprospătare pentru latență mai mică</value>\n  </data>\n  <data name=\"MinRefreshTooltip\" xml:space=\"preserve\">\n    <value>60Hz rată de reîmprospătare pentru a economisi bateria</value>\n  </data>\n  <data name=\"Minute\" xml:space=\"preserve\">\n    <value>Minut</value>\n  </data>\n  <data name=\"Minutes\" xml:space=\"preserve\">\n    <value>Minute</value>\n  </data>\n  <data name=\"MouseAngleSnapping\" xml:space=\"preserve\">\n    <value>Angle Snapping / Tuning</value>\n  </data>\n  <data name=\"MouseAutoPowerOff\" xml:space=\"preserve\">\n    <value>Oprire automată după</value>\n  </data>\n  <data name=\"MouseButtonResponse\" xml:space=\"preserve\">\n    <value>Răspuns buton</value>\n  </data>\n  <data name=\"MouseImportFailed\" xml:space=\"preserve\">\n    <value>Import failed. Selected file is not a valid mouse profile or corrutpted.</value>\n  </data>\n  <data name=\"MouseLiftOffDistance\" xml:space=\"preserve\">\n    <value>Distanța de oprire</value>\n  </data>\n  <data name=\"MouseLowBatteryWarning\" xml:space=\"preserve\">\n    <value>Avertizare baterie scăzută la</value>\n  </data>\n  <data name=\"MousePerformance\" xml:space=\"preserve\">\n    <value>Performanță</value>\n  </data>\n  <data name=\"MouseSynchronize\" xml:space=\"preserve\">\n    <value>Sincronizare cu mouse-ul</value>\n  </data>\n  <data name=\"Multizone\" xml:space=\"preserve\">\n    <value>Multi Zone</value>\n  </data>\n  <data name=\"MultizoneStrong\" xml:space=\"preserve\">\n    <value>Multi Zone Strong</value>\n  </data>\n  <data name=\"Muted\" xml:space=\"preserve\">\n    <value>Muted</value>\n  </data>\n  <data name=\"MuteMic\" xml:space=\"preserve\">\n    <value>Oprire microfon</value>\n  </data>\n  <data name=\"Never\" xml:space=\"preserve\">\n    <value>Niciodată</value>\n  </data>\n  <data name=\"NewUpdates\" xml:space=\"preserve\">\n    <value>Actualizări noi</value>\n  </data>\n  <data name=\"NoNewUpdates\" xml:space=\"preserve\">\n    <value>Nu există actualizări noi</value>\n  </data>\n  <data name=\"NotConnected\" xml:space=\"preserve\">\n    <value>Neconectat</value>\n  </data>\n  <data name=\"Off\" xml:space=\"preserve\">\n    <value>Off</value>\n  </data>\n  <data name=\"On\" xml:space=\"preserve\">\n    <value>On</value>\n  </data>\n  <data name=\"OneZone\" xml:space=\"preserve\">\n    <value>One Zone</value>\n  </data>\n  <data name=\"OpenGHelper\" xml:space=\"preserve\">\n    <value>Deschide fereastra G-Helper</value>\n  </data>\n  <data name=\"Optimized\" xml:space=\"preserve\">\n    <value>Optimizat</value>\n  </data>\n  <data name=\"OptimizedGPUTooltip\" xml:space=\"preserve\">\n    <value>Schimbă la modul Eco pe baterie și la Standard când este conectat</value>\n  </data>\n  <data name=\"OptimizedUSBC\" xml:space=\"preserve\">\n    <value>Păstraţi GPU dezactivat când încărcătorul USB-C e folosit în modul Optimized</value>\n  </data>\n  <data name=\"Other\" xml:space=\"preserve\">\n    <value>Altele</value>\n  </data>\n  <data name=\"Overdrive\" xml:space=\"preserve\">\n    <value>Overdrive</value>\n  </data>\n  <data name=\"PerformanceMode\" xml:space=\"preserve\">\n    <value>Mod</value>\n  </data>\n  <data name=\"Peripherals\" xml:space=\"preserve\">\n    <value>Periferice</value>\n  </data>\n  <data name=\"PictureGif\" xml:space=\"preserve\">\n    <value>Poză / Gif</value>\n  </data>\n  <data name=\"PlayPause\" xml:space=\"preserve\">\n    <value>Redare / Pauză</value>\n  </data>\n  <data name=\"PollingRate\" xml:space=\"preserve\">\n    <value>Rată sondaj</value>\n  </data>\n  <data name=\"PowerLimits\" xml:space=\"preserve\">\n    <value>Limite de putere</value>\n  </data>\n  <data name=\"PPTExperimental\" xml:space=\"preserve\">\n    <value>Limitele de putere sunt o funcție experimentală. Folosiți cu atenție și pe propriul risc!</value>\n  </data>\n  <data name=\"PrintScreen\" xml:space=\"preserve\">\n    <value>PrintScreen</value>\n  </data>\n  <data name=\"Profile\" xml:space=\"preserve\">\n    <value>Profil</value>\n  </data>\n  <data name=\"Quit\" xml:space=\"preserve\">\n    <value>Închide</value>\n  </data>\n  <data name=\"Reset\" xml:space=\"preserve\">\n    <value>Reset</value>\n  </data>\n  <data name=\"RestartGPU\" xml:space=\"preserve\">\n    <value>Ceva folosește dGPU și previne modul Eco. Permiteți G-Helper să repornească dGPU în managerul de dispozitive? (Continuați pe propriul risc)</value>\n  </data>\n  <data name=\"RPM\" xml:space=\"preserve\">\n    <value>RPM</value>\n  </data>\n  <data name=\"RSDeadzones\" xml:space=\"preserve\">\n    <value>Right Stick Deadzones</value>\n  </data>\n  <data name=\"RTDeadzones\" xml:space=\"preserve\">\n    <value>Right Trigger Deadzones</value>\n  </data>\n  <data name=\"RunOnStartup\" xml:space=\"preserve\">\n    <value>Rulează la pornirea sistemului</value>\n  </data>\n  <data name=\"ScalingQuality\" xml:space=\"preserve\">\n    <value>Scaling Quality</value>\n  </data>\n  <data name=\"ScreenPadDown\" xml:space=\"preserve\">\n    <value>Scade luminozitate Screenpad</value>\n  </data>\n  <data name=\"ScreenPadUp\" xml:space=\"preserve\">\n    <value>Mărește luminozitate Screenpad</value>\n  </data>\n  <data name=\"Shutdown\" xml:space=\"preserve\">\n    <value>Oprire</value>\n  </data>\n  <data name=\"Silent\" xml:space=\"preserve\">\n    <value>Silențios</value>\n  </data>\n  <data name=\"Sleep\" xml:space=\"preserve\">\n    <value>Somn</value>\n  </data>\n  <data name=\"StandardGPUTooltip\" xml:space=\"preserve\">\n    <value>Activează dGPU pentru uz standard</value>\n  </data>\n  <data name=\"StandardMode\" xml:space=\"preserve\">\n    <value>Standard</value>\n  </data>\n  <data name=\"Start\" xml:space=\"preserve\">\n    <value>Start</value>\n  </data>\n  <data name=\"StartingServices\" xml:space=\"preserve\">\n    <value>Se pornesc serviciile</value>\n  </data>\n  <data name=\"StartupError\" xml:space=\"preserve\">\n    <value>Eroare la Pornire</value>\n  </data>\n  <data name=\"Stop\" xml:space=\"preserve\">\n    <value>Stop</value>\n  </data>\n  <data name=\"StopGPUApps\" xml:space=\"preserve\">\n    <value>Oprește aplicațiile care folosesc GPU</value>\n  </data>\n  <data name=\"StoppingServices\" xml:space=\"preserve\">\n    <value>Se opresc serviciile</value>\n  </data>\n  <data name=\"ToggleAura\" xml:space=\"preserve\">\n    <value>Toggle Aura</value>\n  </data>\n  <data name=\"ToggleClamshellMode\" xml:space=\"preserve\">\n    <value>Auto Toggle Mod Clamshell</value>\n  </data>\n  <data name=\"ToggleFnLock\" xml:space=\"preserve\">\n    <value>Toggle Fn-Lock</value>\n  </data>\n  <data name=\"ToggleMiniled\" xml:space=\"preserve\">\n    <value>Toggle Miniled (dacă e suportat)</value>\n  </data>\n  <data name=\"ToggleScreen\" xml:space=\"preserve\">\n    <value>Toggle Ecran</value>\n  </data>\n  <data name=\"ToggleTouchscreen\" xml:space=\"preserve\">\n    <value>Toggle Touchscreen</value>\n  </data>\n  <data name=\"Touchscreen\" xml:space=\"preserve\">\n    <value>Touchscreen</value>\n  </data>\n  <data name=\"Turbo\" xml:space=\"preserve\">\n    <value>Turbo</value>\n  </data>\n  <data name=\"TurnedOff\" xml:space=\"preserve\">\n    <value>Dezactivat</value>\n  </data>\n  <data name=\"TurnOffOnBattery\" xml:space=\"preserve\">\n    <value>Dezactivează când bateria e folosită</value>\n  </data>\n  <data name=\"UltimateGPUTooltip\" xml:space=\"preserve\">\n    <value>Rutează ecranul laptop-ului spre dGPU, maximizând FPS</value>\n  </data>\n  <data name=\"UltimateMode\" xml:space=\"preserve\">\n    <value>Ultimate</value>\n  </data>\n  <data name=\"UndervoltingRisky\" xml:space=\"preserve\">\n    <value>Undervolting este o funcțiune experimentală și riscantă. Dacă valorile aplicate sunt prea mici pentru hardware-ul dumneavoastră, acesta poate deveni instabil, a se opri sau să corupă datele. Dacă vrei să încerci - mai întâi începe de la valori mici, apasă Aplică și testează ce funcționează pentru tine.</value>\n  </data>\n  <data name=\"Unmuted\" xml:space=\"preserve\">\n    <value>Unmuted</value>\n  </data>\n  <data name=\"Updates\" xml:space=\"preserve\">\n    <value>Actualizări</value>\n  </data>\n  <data name=\"VersionLabel\" xml:space=\"preserve\">\n    <value>Versiune</value>\n  </data>\n  <data name=\"VibrationStrength\" xml:space=\"preserve\">\n    <value>Vibration Strength</value>\n  </data>\n  <data name=\"VisualMode\" xml:space=\"preserve\">\n    <value>Visual Mode</value>\n  </data>\n  <data name=\"VisualModesHDR\" xml:space=\"preserve\">\n    <value>Visual Modes are not available when HDR is active</value>\n  </data>\n  <data name=\"VisualModesScreen\" xml:space=\"preserve\">\n    <value>Visual Modes are not available when laptop screen is off</value>\n  </data>\n  <data name=\"VolumeDown\" xml:space=\"preserve\">\n    <value>Buton scădere volum</value>\n  </data>\n  <data name=\"VolumeMute\" xml:space=\"preserve\">\n    <value>Buton dezactivare sunet</value>\n  </data>\n  <data name=\"VolumeUp\" xml:space=\"preserve\">\n    <value>Buton mărire volum</value>\n  </data>\n  <data name=\"WindowTop\" xml:space=\"preserve\">\n    <value>Păstrează aplicația mereu deasupra</value>\n  </data>\n  <data name=\"Zoom\" xml:space=\"preserve\">\n    <value>Zoom</value>\n  </data>\n  <data name=\"Donate\" xml:space=\"preserve\">\n    <value>Donate</value>\n  </data>\n  <data name=\"Legend\" xml:space=\"preserve\">\n    <value>Legend</value>\n  </data>\n  <data name=\"LegendGray\" xml:space=\"preserve\">\n    <value>Can't check local version</value>\n    <comment>Can't check local version</comment>\n  </data>\n  <data name=\"LegendRed\" xml:space=\"preserve\">\n    <value>Update Available</value>\n    <comment>Update Available</comment>\n  </data>\n  <data name=\"LegendGreen\" xml:space=\"preserve\">\n    <value>Updated</value>\n    <comment>Updated</comment>\n  </data>\n  <data name=\"SlashBounce\" xml:space=\"preserve\">\n    <value>Bounce</value>\n  </data>\n  <data name=\"SlashMode\" xml:space=\"preserve\">\n    <value>Slash</value>\n  </data>\n  <data name=\"SlashLoading\" xml:space=\"preserve\">\n    <value>Loading</value>\n  </data>\n  <data name=\"SlashBitStream\" xml:space=\"preserve\">\n    <value>Bit Stream</value>\n  </data>\n  <data name=\"SlashTransmission\" xml:space=\"preserve\">\n    <value>Transmission</value>\n  </data>\n  <data name=\"SlashFlow\" xml:space=\"preserve\">\n    <value>Flow</value>\n  </data>\n  <data name=\"SlashFlux\" xml:space=\"preserve\">\n    <value>Flux</value>\n  </data>\n  <data name=\"SlashPhantom\" xml:space=\"preserve\">\n    <value>Phantom</value>\n  </data>\n  <data name=\"SlashSpectrum\" xml:space=\"preserve\">\n    <value>Spectrum</value>\n  </data>\n  <data name=\"SlashHazard\" xml:space=\"preserve\">\n    <value>Hazard</value>\n  </data>\n  <data name=\"SlashInterfacing\" xml:space=\"preserve\">\n    <value>Interfacing</value>\n  </data>\n  <data name=\"SlashRamp\" xml:space=\"preserve\">\n    <value>Ramp</value>\n  </data>\n  <data name=\"SlashGameOver\" xml:space=\"preserve\">\n    <value>Game Over</value>\n  </data>\n  <data name=\"SlashStart\" xml:space=\"preserve\">\n    <value>Start</value>\n  </data>\n  <data name=\"SlashBuzzer\" xml:space=\"preserve\">\n    <value>Buzzer</value>\n  </data>\n  <data name=\"SlashStatic\" xml:space=\"preserve\">\n    <value>Static</value>\n  </data>\n  <data name=\"SlashBatteryLevel\" xml:space=\"preserve\">\n    <value>Battery Level</value>\n  </data>\n  <data name=\"IntervalOff\" xml:space=\"preserve\">\n    <value>Interval Off</value>\n  </data>\n  <data name=\"IntervalSeconds\" xml:space=\"preserve\">\n    <value>Interval {0}s</value>\n  </data>\n  <data name=\"DisableDynamicLighting\" xml:space=\"preserve\">\n    <value>Please disable Windows &gt; Dynamic Lighting</value>\n  </data>\n  <data name=\"AmbientModeResources\" xml:space=\"preserve\">\n    <value>Ambient mode may increase resource usage</value>\n  </data>\n  <data name=\"MouseMotionSync\" xml:space=\"preserve\">\n    <value>Motion Sync</value>\n  </data>\n  <data name=\"MouseZoneMode\" xml:space=\"preserve\">\n    <value>Zone Mode</value>\n  </data>\n</root>"
  },
  {
    "path": "app/Properties/Strings.tr.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" id=\"root\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\"/>\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"name\" type=\"xsd:string\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\"/>\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Acceleration\" xml:space=\"preserve\">\n    <value>Hızlandırma</value>\n  </data>\n  <data name=\"ACPIError\" xml:space=\"preserve\">\n    <value>ASUS ACPI bağlanılamıyor. Uygulama onsuz çalışamaz. Asus Sistem Kontrol Arayüzünü kurmayı deneyin</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestart\" xml:space=\"preserve\">\n    <value>Değişiklikleri uygulamak için cihazınızı yeniden başlatın</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestartTitle\" xml:space=\"preserve\">\n    <value>Şimdi yeniden başlatılsın mı?</value>\n  </data>\n  <data name=\"AlertDGPU\" xml:space=\"preserve\">\n    <value>GPU yoğun kullanımda gibi, devre dışı bırakılsın mı?</value>\n  </data>\n  <data name=\"AlertDGPUTitle\" xml:space=\"preserve\">\n    <value>Eko Modu</value>\n  </data>\n  <data name=\"AlertUltimateOff\" xml:space=\"preserve\">\n    <value>Ultimate Modu kapatmak yeniden başlatmayı gerektirir</value>\n  </data>\n  <data name=\"AlertUltimateOn\" xml:space=\"preserve\">\n    <value>Ultimate Mod için yeniden başlatılmalı</value>\n  </data>\n  <data name=\"AlertUltimateTitle\" xml:space=\"preserve\">\n    <value>Şimdi yeniden başlatılsın mı?</value>\n  </data>\n  <data name=\"AllyController\" xml:space=\"preserve\">\n    <value>Ally Kontrolcüsü</value>\n  </data>\n  <data name=\"AnimationSpeed\" xml:space=\"preserve\">\n    <value>Animasyon Hızı</value>\n  </data>\n  <data name=\"AnimeMatrix\" xml:space=\"preserve\">\n    <value>Anime Matrix</value>\n  </data>\n  <data name=\"AppAlreadyRunning\" xml:space=\"preserve\">\n    <value>Uygulama zaten çalışıyor</value>\n  </data>\n  <data name=\"AppAlreadyRunningText\" xml:space=\"preserve\">\n    <value>G-Helper zaten çalışıyor. Simge için görev çubuğunu kontrol edin.</value>\n  </data>\n  <data name=\"Apply\" xml:space=\"preserve\">\n    <value>Uygula</value>\n  </data>\n  <data name=\"ApplyFanCurve\" xml:space=\"preserve\">\n    <value>Özel Fan Eğrisini Uygula</value>\n  </data>\n  <data name=\"ApplyPowerLimits\" xml:space=\"preserve\">\n    <value>Güç Sınırlarını Uygula</value>\n  </data>\n  <data name=\"ApplyWindowsPowerPlan\" xml:space=\"preserve\">\n    <value>Windows Güç Modlarını otomatik ayarla</value>\n  </data>\n  <data name=\"APUMemory\" xml:space=\"preserve\">\n    <value>GPU için Atanan Bellek</value>\n  </data>\n  <data name=\"AsusServicesRunning\" xml:space=\"preserve\">\n    <value>Çalışan Asus Hizmetleri</value>\n  </data>\n  <data name=\"AuraBatteryState\" xml:space=\"preserve\">\n    <value>Pil Durumu</value>\n  </data>\n  <data name=\"AuraBreathe\" xml:space=\"preserve\">\n    <value>Nefes</value>\n  </data>\n  <data name=\"AuraClockwise\" xml:space=\"preserve\">\n    <value>Saat Yönünde</value>\n  </data>\n  <data name=\"AuraColorCycle\" xml:space=\"preserve\">\n    <value>Renk Döngüsü</value>\n  </data>\n  <data name=\"AuraComet\" xml:space=\"preserve\">\n    <value>Kuyruklu Yıldız</value>\n  </data>\n  <data name=\"AuraCounterClockwise\" xml:space=\"preserve\">\n    <value>Saat Yönünün Tersine</value>\n  </data>\n  <data name=\"AuraFast\" xml:space=\"preserve\">\n    <value>Hızlı</value>\n  </data>\n  <data name=\"AuraLightingMode\" xml:space=\"preserve\">\n    <value>Işıklandırma Modu</value>\n  </data>\n  <data name=\"AuraNormal\" xml:space=\"preserve\">\n    <value>Normal</value>\n  </data>\n  <data name=\"AuraRainbow\" xml:space=\"preserve\">\n    <value>Gökkuşağı</value>\n  </data>\n  <data name=\"AuraRandomColor\" xml:space=\"preserve\">\n    <value>Rastgele</value>\n  </data>\n  <data name=\"AuraReact\" xml:space=\"preserve\">\n    <value>Reaksiyon</value>\n  </data>\n  <data name=\"AuraSlow\" xml:space=\"preserve\">\n    <value>Yavaş</value>\n  </data>\n  <data name=\"AuraStatic\" xml:space=\"preserve\">\n    <value>Sabit</value>\n  </data>\n  <data name=\"AuraStrobe\" xml:space=\"preserve\">\n    <value>Flaş</value>\n  </data>\n  <data name=\"AuraZoneAll\" xml:space=\"preserve\">\n    <value>Tümü</value>\n  </data>\n  <data name=\"AuraZoneDock\" xml:space=\"preserve\">\n    <value>Yuva</value>\n  </data>\n  <data name=\"AuraZoneLogo\" xml:space=\"preserve\">\n    <value>Logo</value>\n  </data>\n  <data name=\"AuraZoneScroll\" xml:space=\"preserve\">\n    <value>Kaydırma Tekerleği</value>\n  </data>\n  <data name=\"AuraZoneUnderglow\" xml:space=\"preserve\">\n    <value>Alttan Aydınlatma</value>\n  </data>\n  <data name=\"AutoApply\" xml:space=\"preserve\">\n    <value>Otomatik Uygula</value>\n  </data>\n  <data name=\"AutoMode\" xml:space=\"preserve\">\n    <value>Otomatik</value>\n  </data>\n  <data name=\"AutoRefreshTooltip\" xml:space=\"preserve\">\n    <value>Pil tasarrufu için 60Hz kullanılır, şarja takıldığında eski haline gelir</value>\n  </data>\n  <data name=\"Awake\" xml:space=\"preserve\">\n    <value>Uyanış</value>\n  </data>\n  <data name=\"BacklightLow\" xml:space=\"preserve\">\n    <value>Düşük</value>\n  </data>\n  <data name=\"BacklightMax\" xml:space=\"preserve\">\n    <value>Yüksek</value>\n  </data>\n  <data name=\"BacklightMid\" xml:space=\"preserve\">\n    <value>Orta</value>\n  </data>\n  <data name=\"BacklightOff\" xml:space=\"preserve\">\n    <value>Kapalı</value>\n  </data>\n  <data name=\"BacklightTimeout\" xml:space=\"preserve\">\n    <value>Pilde klavye ışığı kapanma süresi</value>\n  </data>\n  <data name=\"BacklightTimeoutBattery\" xml:space=\"preserve\">\n    <value>Pildeyken Arka Işık Zaman Aşımı</value>\n  </data>\n  <data name=\"BacklightTimeoutPlugged\" xml:space=\"preserve\">\n    <value>Fişe takılıyken Arka Işık Zaman Aşımı</value>\n  </data>\n  <data name=\"Balanced\" xml:space=\"preserve\">\n    <value>Dengeli</value>\n  </data>\n  <data name=\"BatteryCharge\" xml:space=\"preserve\">\n    <value>Şarj</value>\n  </data>\n  <data name=\"BatteryChargeLimit\" xml:space=\"preserve\">\n    <value>Pil Şarj Limiti</value>\n  </data>\n  <data name=\"BatteryHealth\" xml:space=\"preserve\">\n    <value>Pil Sağlığı</value>\n  </data>\n  <data name=\"BatteryLimitFull\" xml:space=\"preserve\">\n    <value>Tek seferlik %100'e kadar şarj</value>\n  </data>\n  <data name=\"Binding\" xml:space=\"preserve\">\n    <value>Tuş Atamaları</value>\n  </data>\n  <data name=\"BindingPrimary\" xml:space=\"preserve\">\n    <value>Birincil</value>\n  </data>\n  <data name=\"BindingSecondary\" xml:space=\"preserve\">\n    <value>İkincil</value>\n  </data>\n  <data name=\"BiosAndDriverUpdates\" xml:space=\"preserve\">\n    <value>BIOS ve Sürücü Güncellemeleri</value>\n  </data>\n  <data name=\"Boot\" xml:space=\"preserve\">\n    <value>Açılış</value>\n  </data>\n  <data name=\"BootSound\" xml:space=\"preserve\">\n    <value>Açılış sesi</value>\n  </data>\n  <data name=\"Brightness\" xml:space=\"preserve\">\n    <value>Parlaklık</value>\n  </data>\n  <data name=\"BrightnessDown\" xml:space=\"preserve\">\n    <value>Parlaklığı Azalt</value>\n  </data>\n  <data name=\"BrightnessUp\" xml:space=\"preserve\">\n    <value>Parlaklığı Artır</value>\n  </data>\n  <data name=\"BWTrayIcon\" xml:space=\"preserve\">\n    <value>Siyah ve beyaz tepsi simgesi</value>\n  </data>\n  <data name=\"Calibrate\" xml:space=\"preserve\">\n    <value>Kalibrasyon</value>\n  </data>\n  <data name=\"Charging\" xml:space=\"preserve\">\n    <value>Şarj oluyor</value>\n  </data>\n  <data name=\"Color\" xml:space=\"preserve\">\n    <value>Renk</value>\n  </data>\n  <data name=\"Contrast\" xml:space=\"preserve\">\n    <value>Kontrast</value>\n  </data>\n  <data name=\"Controller\" xml:space=\"preserve\">\n    <value>Kontrolcü</value>\n  </data>\n  <data name=\"CPUBoost\" xml:space=\"preserve\">\n    <value>CPU Artışı</value>\n  </data>\n  <data name=\"Custom\" xml:space=\"preserve\">\n    <value>Özel</value>\n  </data>\n  <data name=\"Deceleration\" xml:space=\"preserve\">\n    <value>Yavaşlama</value>\n  </data>\n  <data name=\"Default\" xml:space=\"preserve\">\n    <value>Varsayılan</value>\n  </data>\n  <data name=\"DisableController\" xml:space=\"preserve\">\n    <value>Kontrolcüyü Devre Dışı Bırak</value>\n  </data>\n  <data name=\"DisableOnLidClose\" xml:space=\"preserve\">\n    <value>Kapak kapandığında devre dışı bırak</value>\n  </data>\n  <data name=\"DisableOverdrive\" xml:space=\"preserve\">\n    <value>Ekran overdrive özelliğini devre dışı bırak</value>\n  </data>\n  <data name=\"Discharging\" xml:space=\"preserve\">\n    <value>Şarj Azalıyor</value>\n  </data>\n  <data name=\"DownloadColorProfiles\" xml:space=\"preserve\">\n    <value>Renk Profillerini İndir</value>\n  </data>\n  <data name=\"DownloadUpdate\" xml:space=\"preserve\">\n    <value>İndir</value>\n  </data>\n  <data name=\"DriverAndSoftware\" xml:space=\"preserve\">\n    <value>Sürücüler ve Yazılımlar</value>\n  </data>\n  <data name=\"EcoGPUTooltip\" xml:space=\"preserve\">\n    <value>Pil tasarrufu için dGPU devre dışı bırakılır</value>\n  </data>\n  <data name=\"EcoMode\" xml:space=\"preserve\">\n    <value>Eko</value>\n  </data>\n  <data name=\"EnableGPUOnShutdown\" xml:space=\"preserve\">\n    <value>Kapatma sırasında GPU'yu etkinleştir (Eco modundaki sorunları önler)</value>\n  </data>\n  <data name=\"EnableOptimusText\" xml:space=\"preserve\">\n    <value>NVIDIA Denetim Masası'ndaki Görüntü Modu Optimus olarak ayarlı değilken Eko moduna geçilerek harici GPU'nun devre dışı bırakılması, bir sonraki yeniden başlatmaya kadar parlaklık ayarlarında sorunlara neden olabilir. \n\nYine de devam etmek istiyor musunuz?</value>\n  </data>\n  <data name=\"EnableOptimusTitle\" xml:space=\"preserve\">\n    <value>NVIDIA Görüntü Modu Optimus olarak ayarlanmamış</value>\n  </data>\n  <data name=\"EnergySettings\" xml:space=\"preserve\">\n    <value>Enerji Ayarları</value>\n  </data>\n  <data name=\"Export\" xml:space=\"preserve\">\n    <value>Profili Dışa Aktar</value>\n  </data>\n  <data name=\"Extra\" xml:space=\"preserve\">\n    <value>Ek Özellikler</value>\n  </data>\n  <data name=\"ExtraSettings\" xml:space=\"preserve\">\n    <value>Ek Ayarlar</value>\n  </data>\n  <data name=\"FactoryDefaults\" xml:space=\"preserve\">\n    <value>Fabrika Ayarları</value>\n  </data>\n  <data name=\"FanCurves\" xml:space=\"preserve\">\n    <value>Fan Eğrileri</value>\n  </data>\n  <data name=\"FanProfileCPU\" xml:space=\"preserve\">\n    <value>CPU Fan Profili</value>\n  </data>\n  <data name=\"FanProfileGPU\" xml:space=\"preserve\">\n    <value>GPU Fan Profili</value>\n  </data>\n  <data name=\"FanProfileMid\" xml:space=\"preserve\">\n    <value>Orta Fan Profili</value>\n  </data>\n  <data name=\"FanProfiles\" xml:space=\"preserve\">\n    <value>Fan Profilleri</value>\n  </data>\n  <data name=\"FansAndPower\" xml:space=\"preserve\">\n    <value>Fanlar ve Güç</value>\n  </data>\n  <data name=\"FanSpeed\" xml:space=\"preserve\">\n    <value>Fan</value>\n  </data>\n  <data name=\"FansPower\" xml:space=\"preserve\">\n    <value>Fanlar + Güç</value>\n  </data>\n  <data name=\"FlickerFreeDimming\" xml:space=\"preserve\">\n    <value>Titreşimsiz Karartma</value>\n  </data>\n  <data name=\"FnLock\" xml:space=\"preserve\">\n    <value>Fn+F kısayolunu Fn tuşuna basmadan çalıştır</value>\n  </data>\n  <data name=\"FnLockOff\" xml:space=\"preserve\">\n    <value>FN-Lock Kapalı</value>\n  </data>\n  <data name=\"FnLockOn\" xml:space=\"preserve\">\n    <value>FN-Lock Açık</value>\n  </data>\n  <data name=\"GPUBoost\" xml:space=\"preserve\">\n    <value>Dynamic Boost</value>\n  </data>\n  <data name=\"GPUChanging\" xml:space=\"preserve\">\n    <value>Değiştiriliyor</value>\n  </data>\n  <data name=\"GPUCoreClockOffset\" xml:space=\"preserve\">\n    <value>Çekirdek Frekans Dengesi</value>\n  </data>\n  <data name=\"GPUMemoryClockOffset\" xml:space=\"preserve\">\n    <value>Bellek Frekans Dengesi</value>\n  </data>\n  <data name=\"GPUMode\" xml:space=\"preserve\">\n    <value>GPU Modu</value>\n  </data>\n  <data name=\"GPUModeEco\" xml:space=\"preserve\">\n    <value>Sadece iGPU</value>\n  </data>\n  <data name=\"GPUModeStandard\" xml:space=\"preserve\">\n    <value>iGPU + dGPU</value>\n  </data>\n  <data name=\"GPUModeUltimate\" xml:space=\"preserve\">\n    <value>Ayrıcalıklı dGPU</value>\n  </data>\n  <data name=\"GPUPower\" xml:space=\"preserve\">\n    <value>GPU Gücü</value>\n  </data>\n  <data name=\"GPUSettings\" xml:space=\"preserve\">\n    <value>GPU Ayarları</value>\n  </data>\n  <data name=\"GPUTempTarget\" xml:space=\"preserve\">\n    <value>Sıcaklık Hedefi</value>\n  </data>\n  <data name=\"HibernateAfter\" xml:space=\"preserve\">\n    <value>Uyku modunda, Hazırda Bekleme Moduna geçiş dakikası (0 - KAPALI)</value>\n  </data>\n  <data name=\"High\" xml:space=\"preserve\">\n    <value>Yüksek</value>\n  </data>\n  <data name=\"ImageRotation\" xml:space=\"preserve\">\n    <value>Görüntü Döndürme</value>\n  </data>\n  <data name=\"Import\" xml:space=\"preserve\">\n    <value>Profili İçe Aktar</value>\n  </data>\n  <data name=\"KeyBindings\" xml:space=\"preserve\">\n    <value>Tuş Atamaları</value>\n  </data>\n  <data name=\"Keyboard\" xml:space=\"preserve\">\n    <value>Klavye</value>\n  </data>\n  <data name=\"KillGpuApps\" xml:space=\"preserve\">\n    <value>Eco moda geçerken GPU kullanan tüm uygulamaları durdur</value>\n  </data>\n  <data name=\"LaptopBacklight\" xml:space=\"preserve\">\n    <value>Laptop Aydınlatması</value>\n  </data>\n  <data name=\"LaptopKeyboard\" xml:space=\"preserve\">\n    <value>Laptop Klavyesi</value>\n  </data>\n  <data name=\"LaptopScreen\" xml:space=\"preserve\">\n    <value>Laptop Ekranı</value>\n  </data>\n  <data name=\"LEDStatusIndicators\" xml:space=\"preserve\">\n    <value>LED Durum Göstergeleri</value>\n  </data>\n  <data name=\"Lid\" xml:space=\"preserve\">\n    <value>Kapak</value>\n  </data>\n  <data name=\"Lightbar\" xml:space=\"preserve\">\n    <value>Işık Çubuğu</value>\n  </data>\n  <data name=\"Lighting\" xml:space=\"preserve\">\n    <value>Işıklandırma</value>\n  </data>\n  <data name=\"LockScreen\" xml:space=\"preserve\">\n    <value>Kilit Ekranı</value>\n  </data>\n  <data name=\"Logo\" xml:space=\"preserve\">\n    <value>Logo</value>\n  </data>\n  <data name=\"Low\" xml:space=\"preserve\">\n    <value>Düşük</value>\n  </data>\n  <data name=\"LSDeadzones\" xml:space=\"preserve\">\n    <value>Sol Çubuk Ölü Bölgeleri</value>\n  </data>\n  <data name=\"LTDeadzones\" xml:space=\"preserve\">\n    <value>Sol Tetik Ölü Bölgeleri</value>\n  </data>\n  <data name=\"MatrixAudio\" xml:space=\"preserve\">\n    <value>Ses Görselleştirici</value>\n  </data>\n  <data name=\"MatrixBanner\" xml:space=\"preserve\">\n    <value>İkili Afiş</value>\n  </data>\n  <data name=\"MatrixBright\" xml:space=\"preserve\">\n    <value>Parlak</value>\n  </data>\n  <data name=\"MatrixClock\" xml:space=\"preserve\">\n    <value>Saat</value>\n  </data>\n  <data name=\"MatrixDim\" xml:space=\"preserve\">\n    <value>Mat</value>\n  </data>\n  <data name=\"MatrixLogo\" xml:space=\"preserve\">\n    <value>Rog Logosu</value>\n  </data>\n  <data name=\"MatrixMedium\" xml:space=\"preserve\">\n    <value>Orta</value>\n  </data>\n  <data name=\"MatrixOff\" xml:space=\"preserve\">\n    <value>Kapalı</value>\n  </data>\n  <data name=\"MatrixPicture\" xml:space=\"preserve\">\n    <value>Resim</value>\n  </data>\n  <data name=\"MaxRefreshTooltip\" xml:space=\"preserve\">\n    <value>En düşük gecikme için en yüksek yenileme hızı</value>\n  </data>\n  <data name=\"MinRefreshTooltip\" xml:space=\"preserve\">\n    <value>Pil tasarrufu için 60Hz yenileme hızı</value>\n  </data>\n  <data name=\"Minute\" xml:space=\"preserve\">\n    <value>Dakika</value>\n  </data>\n  <data name=\"Minutes\" xml:space=\"preserve\">\n    <value>Dakika</value>\n  </data>\n  <data name=\"MouseAngleSnapping\" xml:space=\"preserve\">\n    <value>Angle Snapping / Tuning</value>\n  </data>\n  <data name=\"MouseAutoPowerOff\" xml:space=\"preserve\">\n    <value>Sonrasında Otomatik Kapat</value>\n  </data>\n  <data name=\"MouseButtonResponse\" xml:space=\"preserve\">\n    <value>Tuş Tepkisi</value>\n  </data>\n  <data name=\"MouseImportFailed\" xml:space=\"preserve\">\n    <value>İçe aktarma başarısız oldu. Seçilen dosya geçerli bir fare profili değil veya bozuk.</value>\n  </data>\n  <data name=\"MouseLiftOffDistance\" xml:space=\"preserve\">\n    <value>Havalanma Mesafesi</value>\n  </data>\n  <data name=\"MouseLowBatteryWarning\" xml:space=\"preserve\">\n    <value>Düşük Pil Uyarısı seviyesi</value>\n  </data>\n  <data name=\"MousePerformance\" xml:space=\"preserve\">\n    <value>Performans</value>\n  </data>\n  <data name=\"MouseSynchronize\" xml:space=\"preserve\">\n    <value>Fare ile eşitle</value>\n  </data>\n  <data name=\"Multizone\" xml:space=\"preserve\">\n    <value>Çoklu Bölge</value>\n  </data>\n  <data name=\"MultizoneStrong\" xml:space=\"preserve\">\n    <value>Çoklu Bölge Güçlü</value>\n  </data>\n  <data name=\"Muted\" xml:space=\"preserve\">\n    <value>Susturuldu</value>\n  </data>\n  <data name=\"MuteMic\" xml:space=\"preserve\">\n    <value>Mikrofonu Sustur</value>\n  </data>\n  <data name=\"Never\" xml:space=\"preserve\">\n    <value>Asla</value>\n  </data>\n  <data name=\"NewUpdates\" xml:space=\"preserve\">\n    <value>Yeni güncellemeler</value>\n  </data>\n  <data name=\"NoNewUpdates\" xml:space=\"preserve\">\n    <value>Yeni güncelleme yok</value>\n  </data>\n  <data name=\"NotConnected\" xml:space=\"preserve\">\n    <value>Bağlı Değil</value>\n  </data>\n  <data name=\"Off\" xml:space=\"preserve\">\n    <value>Kapalı</value>\n  </data>\n  <data name=\"On\" xml:space=\"preserve\">\n    <value>Açık</value>\n  </data>\n  <data name=\"OneZone\" xml:space=\"preserve\">\n    <value>Tek Bölge</value>\n  </data>\n  <data name=\"OpenGHelper\" xml:space=\"preserve\">\n    <value>G-Helper penceresini aç</value>\n  </data>\n  <data name=\"Optimized\" xml:space=\"preserve\">\n    <value>İyileştirilmiş</value>\n  </data>\n  <data name=\"OptimizedGPUTooltip\" xml:space=\"preserve\">\n    <value>Pil ile çalışırken Eco moda, Elektrik ile Standart moda geçilir</value>\n  </data>\n  <data name=\"OptimizedUSBC\" xml:space=\"preserve\">\n    <value>İyileştirilmiş modda USB-C şarj cihazı bağlıyken, GPU devre dışı kalsın</value>\n  </data>\n  <data name=\"Other\" xml:space=\"preserve\">\n    <value>Diğer</value>\n  </data>\n  <data name=\"Overdrive\" xml:space=\"preserve\">\n    <value>Overdrive</value>\n  </data>\n  <data name=\"PerformanceMode\" xml:space=\"preserve\">\n    <value>Performans Modu</value>\n  </data>\n  <data name=\"Peripherals\" xml:space=\"preserve\">\n    <value>Çevre Birimleri</value>\n  </data>\n  <data name=\"PictureGif\" xml:space=\"preserve\">\n    <value>Resim / Gif</value>\n  </data>\n  <data name=\"PlayPause\" xml:space=\"preserve\">\n    <value>Oynat / Duraklat</value>\n  </data>\n  <data name=\"PollingRate\" xml:space=\"preserve\">\n    <value>Yoklama Sıklığı</value>\n  </data>\n  <data name=\"PowerLimits\" xml:space=\"preserve\">\n    <value>Güç Sınırları</value>\n  </data>\n  <data name=\"PPTExperimental\" xml:space=\"preserve\">\n    <value>Güç Sınırları deneysel bir özelliktir. Riski göze alarak dikkatli kullanın!</value>\n  </data>\n  <data name=\"PrintScreen\" xml:space=\"preserve\">\n    <value>PrintScreen</value>\n  </data>\n  <data name=\"Profile\" xml:space=\"preserve\">\n    <value>Profil</value>\n  </data>\n  <data name=\"Quit\" xml:space=\"preserve\">\n    <value>Çıkış</value>\n  </data>\n  <data name=\"Reset\" xml:space=\"preserve\">\n    <value>Sıfırla</value>\n  </data>\n  <data name=\"RestartGPU\" xml:space=\"preserve\">\n    <value>Bir şey harici GPU'yu kullanıyor ve Eco modunu engelliyor. G-Helper aygıt yöneticisinde harici GPU'yu yeniden başlatmayı denesin mi? (Kendi sorumluluğunuzdadır)</value>\n  </data>\n  <data name=\"RPM\" xml:space=\"preserve\">\n    <value>RPM</value>\n  </data>\n  <data name=\"RSDeadzones\" xml:space=\"preserve\">\n    <value>Sağ Çubuk Ölü Bölgeleri</value>\n  </data>\n  <data name=\"RTDeadzones\" xml:space=\"preserve\">\n    <value>Sağ Tetik Ölü Bölgeleri</value>\n  </data>\n  <data name=\"RunOnStartup\" xml:space=\"preserve\">\n    <value>Başlangıçta Çalıştır</value>\n  </data>\n  <data name=\"ScalingQuality\" xml:space=\"preserve\">\n    <value>Ölçeklendirme Kalitesi</value>\n  </data>\n  <data name=\"ScreenPadDown\" xml:space=\"preserve\">\n    <value>Screenpad Parlaklığını Azalt</value>\n  </data>\n  <data name=\"ScreenPadUp\" xml:space=\"preserve\">\n    <value>Screenpad Parlaklığını Artır</value>\n  </data>\n  <data name=\"Shutdown\" xml:space=\"preserve\">\n    <value>Kapanış</value>\n  </data>\n  <data name=\"Silent\" xml:space=\"preserve\">\n    <value>Sessiz</value>\n  </data>\n  <data name=\"Sleep\" xml:space=\"preserve\">\n    <value>Uyku</value>\n  </data>\n  <data name=\"StandardGPUTooltip\" xml:space=\"preserve\">\n    <value>Standart kullanım için dGPU etkinleştirilir</value>\n  </data>\n  <data name=\"StandardMode\" xml:space=\"preserve\">\n    <value>Standart</value>\n  </data>\n  <data name=\"Start\" xml:space=\"preserve\">\n    <value>Başlat</value>\n  </data>\n  <data name=\"StartingServices\" xml:space=\"preserve\">\n    <value>Hizmetler Başlatılıyor</value>\n  </data>\n  <data name=\"StartupError\" xml:space=\"preserve\">\n    <value>Başlatma Hatası</value>\n  </data>\n  <data name=\"Stop\" xml:space=\"preserve\">\n    <value>Durdur</value>\n  </data>\n  <data name=\"StopGPUApps\" xml:space=\"preserve\">\n    <value>GPU Uygulamalarını Durdur</value>\n  </data>\n  <data name=\"StoppingServices\" xml:space=\"preserve\">\n    <value>Hizmetler Durduruluyor</value>\n  </data>\n  <data name=\"ToggleAura\" xml:space=\"preserve\">\n    <value>Aura Değiştir</value>\n  </data>\n  <data name=\"ToggleClamshellMode\" xml:space=\"preserve\">\n    <value>Otomatik Clamshell Modunu Aç</value>\n  </data>\n  <data name=\"ToggleFnLock\" xml:space=\"preserve\">\n    <value>Fn-Lock Değiştir</value>\n  </data>\n  <data name=\"ToggleMiniled\" xml:space=\"preserve\">\n    <value>Miniled Değiştir (destekleniyorsa)</value>\n  </data>\n  <data name=\"ToggleScreen\" xml:space=\"preserve\">\n    <value>Ekranı Değiştir</value>\n  </data>\n  <data name=\"ToggleTouchscreen\" xml:space=\"preserve\">\n    <value>Dokunmatik Ekranı Değiştir</value>\n  </data>\n  <data name=\"Touchscreen\" xml:space=\"preserve\">\n    <value>Dokunmatik ekran</value>\n  </data>\n  <data name=\"Turbo\" xml:space=\"preserve\">\n    <value>Turbo</value>\n  </data>\n  <data name=\"TurnedOff\" xml:space=\"preserve\">\n    <value>Kapatıldı</value>\n  </data>\n  <data name=\"TurnOffOnBattery\" xml:space=\"preserve\">\n    <value>Pille çalışırken kapat</value>\n  </data>\n  <data name=\"UltimateGPUTooltip\" xml:space=\"preserve\">\n    <value>Dizüstü ekranı doğrudan dGPU üstünden çalışır FPS artar</value>\n  </data>\n  <data name=\"UltimateMode\" xml:space=\"preserve\">\n    <value>Ultimate</value>\n  </data>\n  <data name=\"UndervoltingRisky\" xml:space=\"preserve\">\n    <value>Düşük voltaj deneysel ve riskli bir özelliktir. Uygulanan değerler cihaz için çok düşükse, cihazı stabil çalışmayabilir, kapanabilir veya veri kaybına uğrayabilir. Yine de denemek istiyorsanız, önce küçük değerlerden başlayın ve sizin için uygun olanı test edin.</value>\n  </data>\n  <data name=\"Unmuted\" xml:space=\"preserve\">\n    <value>Ses açık</value>\n  </data>\n  <data name=\"Updates\" xml:space=\"preserve\">\n    <value>Güncellemeler</value>\n  </data>\n  <data name=\"VersionLabel\" xml:space=\"preserve\">\n    <value>Sürüm</value>\n  </data>\n  <data name=\"VibrationStrength\" xml:space=\"preserve\">\n    <value>Titreşim Yoğunluğu</value>\n  </data>\n  <data name=\"VisualMode\" xml:space=\"preserve\">\n    <value>Görsel Mod</value>\n  </data>\n  <data name=\"VisualModesHDR\" xml:space=\"preserve\">\n    <value>HDR etkin olduğunda Görsel Modlar kullanılamaz</value>\n  </data>\n  <data name=\"VisualModesScreen\" xml:space=\"preserve\">\n    <value>Bilgisayar ekranı kapalı olduğunda Görsel Modlar kullanılamaz</value>\n  </data>\n  <data name=\"VolumeDown\" xml:space=\"preserve\">\n    <value>Sesi Azalt</value>\n  </data>\n  <data name=\"VolumeMute\" xml:space=\"preserve\">\n    <value>Sesi Kapat</value>\n  </data>\n  <data name=\"VolumeUp\" xml:space=\"preserve\">\n    <value>Sesi Artır</value>\n  </data>\n  <data name=\"WindowTop\" xml:space=\"preserve\">\n    <value>Uygulama penceresini her zaman en üstte tut</value>\n  </data>\n  <data name=\"Zoom\" xml:space=\"preserve\">\n    <value>Yakınlaştır</value>\n  </data>\n  <data name=\"Donate\" xml:space=\"preserve\">\n    <value>Bağış</value>\n  </data>\n  <data name=\"Legend\" xml:space=\"preserve\">\n    <value>Gösterge</value>\n  </data>\n  <data name=\"LegendGray\" xml:space=\"preserve\">\n    <value>Yerel sürüm denetlenemiyor</value>\n    <comment>Can't check local version</comment>\n  </data>\n  <data name=\"LegendRed\" xml:space=\"preserve\">\n    <value>Güncelleme Mevcut</value>\n    <comment>Update Available</comment>\n  </data>\n  <data name=\"LegendGreen\" xml:space=\"preserve\">\n    <value>Güncellendi</value>\n    <comment>Updated</comment>\n  </data>\n  <data name=\"SlashBounce\" xml:space=\"preserve\">\n    <value>Sıçrama</value>\n  </data>\n  <data name=\"SlashMode\" xml:space=\"preserve\">\n    <value>Kesik</value>\n  </data>\n  <data name=\"SlashLoading\" xml:space=\"preserve\">\n    <value>Yükleniyor</value>\n  </data>\n  <data name=\"SlashBitStream\" xml:space=\"preserve\">\n    <value>Bit Akışı</value>\n  </data>\n  <data name=\"SlashTransmission\" xml:space=\"preserve\">\n    <value>İletim</value>\n  </data>\n  <data name=\"SlashFlow\" xml:space=\"preserve\">\n    <value>Akış</value>\n  </data>\n  <data name=\"SlashFlux\" xml:space=\"preserve\">\n    <value>Akıntı</value>\n  </data>\n  <data name=\"SlashPhantom\" xml:space=\"preserve\">\n    <value>Hayalet</value>\n  </data>\n  <data name=\"SlashSpectrum\" xml:space=\"preserve\">\n    <value>Spektrum</value>\n  </data>\n  <data name=\"SlashHazard\" xml:space=\"preserve\">\n    <value>Tehlike</value>\n  </data>\n  <data name=\"SlashInterfacing\" xml:space=\"preserve\">\n    <value>Arayüz</value>\n  </data>\n  <data name=\"SlashRamp\" xml:space=\"preserve\">\n    <value>Rampa</value>\n  </data>\n  <data name=\"SlashGameOver\" xml:space=\"preserve\">\n    <value>Oyun Bitti</value>\n  </data>\n  <data name=\"SlashStart\" xml:space=\"preserve\">\n    <value>Başlat</value>\n  </data>\n  <data name=\"SlashBuzzer\" xml:space=\"preserve\">\n    <value>Zil</value>\n  </data>\n  <data name=\"SlashStatic\" xml:space=\"preserve\">\n    <value>Statik</value>\n  </data>\n  <data name=\"SlashBatteryLevel\" xml:space=\"preserve\">\n    <value>Pil Seviyesi</value>\n  </data>\n  <data name=\"IntervalOff\" xml:space=\"preserve\">\n    <value>Aralık Kapalı</value>\n  </data>\n  <data name=\"IntervalSeconds\" xml:space=\"preserve\">\n    <value>Aralık {0}</value>\n  </data>\n  <data name=\"DisableDynamicLighting\" xml:space=\"preserve\">\n    <value>Lütfen Windows &gt; Dinamik Aydınlatma'yı devre dışı bırakın</value>\n  </data>\n  <data name=\"AmbientModeResources\" xml:space=\"preserve\">\n    <value>Ambians modu kaynak kullanımını artırabilir</value>\n  </data>\n  <data name=\"MouseMotionSync\" xml:space=\"preserve\">\n    <value>Motion Sync</value>\n  </data>\n  <data name=\"MouseZoneMode\" xml:space=\"preserve\">\n    <value>Zone Mode</value>\n  </data>\n</root>"
  },
  {
    "path": "app/Properties/Strings.uk.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" id=\"root\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\"/>\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"name\" type=\"xsd:string\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\"/>\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Acceleration\" xml:space=\"preserve\">\n    <value>Прискорення</value>\n  </data>\n  <data name=\"ACPIError\" xml:space=\"preserve\">\n    <value>Не вдається під'єднатися до ASUS ACPI. Програма не може працювати без нього. Спробуйте встановити Asus System Control Interface</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestart\" xml:space=\"preserve\">\n    <value>Перезавантажте ваш пристрій, щоб зміни набули чинності</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestartTitle\" xml:space=\"preserve\">\n    <value>Перезавантажити зараз?</value>\n  </data>\n  <data name=\"AlertDGPU\" xml:space=\"preserve\">\n    <value>Здається, що GPU використовується, вимкнути її?</value>\n  </data>\n  <data name=\"AlertDGPUTitle\" xml:space=\"preserve\">\n    <value>Еко Режим</value>\n  </data>\n  <data name=\"AlertUltimateOff\" xml:space=\"preserve\">\n    <value>Вимкнення ультимативного режиму потребує перезавантаження</value>\n  </data>\n  <data name=\"AlertUltimateOn\" xml:space=\"preserve\">\n    <value>Ультимативний режим потребує перезавантаження</value>\n  </data>\n  <data name=\"AlertUltimateTitle\" xml:space=\"preserve\">\n    <value>Перезавантажити зараз?</value>\n  </data>\n  <data name=\"AllyController\" xml:space=\"preserve\">\n    <value>Ally Контролер</value>\n  </data>\n  <data name=\"AnimationSpeed\" xml:space=\"preserve\">\n    <value>Швидкість Анімації</value>\n  </data>\n  <data name=\"AnimeMatrix\" xml:space=\"preserve\">\n    <value>Аніме Матриця</value>\n  </data>\n  <data name=\"AppAlreadyRunning\" xml:space=\"preserve\">\n    <value>Програма вже запущена</value>\n  </data>\n  <data name=\"AppAlreadyRunningText\" xml:space=\"preserve\">\n    <value>G-Helper вже запущено. Перевірте значок у системному лотку.</value>\n  </data>\n  <data name=\"Apply\" xml:space=\"preserve\">\n    <value>Застосувати</value>\n  </data>\n  <data name=\"ApplyFanCurve\" xml:space=\"preserve\">\n    <value>Застосувати профілі кулерів</value>\n  </data>\n  <data name=\"ApplyPowerLimits\" xml:space=\"preserve\">\n    <value>Застосувати потужність</value>\n  </data>\n  <data name=\"ApplyWindowsPowerPlan\" xml:space=\"preserve\">\n    <value>Автоматично застосовувати Windows Power Modes</value>\n  </data>\n  <data name=\"APUMemory\" xml:space=\"preserve\">\n    <value>Пам'ять призначена на GPU</value>\n  </data>\n  <data name=\"AsusServicesRunning\" xml:space=\"preserve\">\n    <value>Кількість запущених сервісів Asus</value>\n  </data>\n  <data name=\"AuraBatteryState\" xml:space=\"preserve\">\n    <value>Стан батареї</value>\n  </data>\n  <data name=\"AuraBreathe\" xml:space=\"preserve\">\n    <value>Дихання</value>\n  </data>\n  <data name=\"AuraClockwise\" xml:space=\"preserve\">\n    <value>Направо</value>\n  </data>\n  <data name=\"AuraColorCycle\" xml:space=\"preserve\">\n    <value>Зміна Кольорів</value>\n  </data>\n  <data name=\"AuraComet\" xml:space=\"preserve\">\n    <value>Комета</value>\n  </data>\n  <data name=\"AuraCounterClockwise\" xml:space=\"preserve\">\n    <value>Наліво</value>\n  </data>\n  <data name=\"AuraFast\" xml:space=\"preserve\">\n    <value>Швидка</value>\n  </data>\n  <data name=\"AuraLightingMode\" xml:space=\"preserve\">\n    <value>Підсвітка</value>\n  </data>\n  <data name=\"AuraNormal\" xml:space=\"preserve\">\n    <value>Нормальна</value>\n  </data>\n  <data name=\"AuraRainbow\" xml:space=\"preserve\">\n    <value>Веселка</value>\n  </data>\n  <data name=\"AuraRandomColor\" xml:space=\"preserve\">\n    <value>Випадкова</value>\n  </data>\n  <data name=\"AuraReact\" xml:space=\"preserve\">\n    <value>Реактивна</value>\n  </data>\n  <data name=\"AuraSlow\" xml:space=\"preserve\">\n    <value>Повільна</value>\n  </data>\n  <data name=\"AuraStatic\" xml:space=\"preserve\">\n    <value>Статична</value>\n  </data>\n  <data name=\"AuraStrobe\" xml:space=\"preserve\">\n    <value>Стробоскоп</value>\n  </data>\n  <data name=\"AuraZoneAll\" xml:space=\"preserve\">\n    <value>Все</value>\n  </data>\n  <data name=\"AuraZoneDock\" xml:space=\"preserve\">\n    <value>Док</value>\n  </data>\n  <data name=\"AuraZoneLogo\" xml:space=\"preserve\">\n    <value>Лого</value>\n  </data>\n  <data name=\"AuraZoneScroll\" xml:space=\"preserve\">\n    <value>Колесо</value>\n  </data>\n  <data name=\"AuraZoneUnderglow\" xml:space=\"preserve\">\n    <value>Низ</value>\n  </data>\n  <data name=\"AutoApply\" xml:space=\"preserve\">\n    <value>Автоматично</value>\n  </data>\n  <data name=\"AutoMode\" xml:space=\"preserve\">\n    <value>Авто</value>\n  </data>\n  <data name=\"AutoRefreshTooltip\" xml:space=\"preserve\">\n    <value>Частота 60Гц на батареї та максимальна на зарядці</value>\n  </data>\n  <data name=\"Awake\" xml:space=\"preserve\">\n    <value>Робота</value>\n  </data>\n  <data name=\"BacklightLow\" xml:space=\"preserve\">\n    <value>Низька</value>\n  </data>\n  <data name=\"BacklightMax\" xml:space=\"preserve\">\n    <value>Максимальна</value>\n  </data>\n  <data name=\"BacklightMid\" xml:space=\"preserve\">\n    <value>Середня</value>\n  </data>\n  <data name=\"BacklightOff\" xml:space=\"preserve\">\n    <value>Вимкнена</value>\n  </data>\n  <data name=\"BacklightTimeout\" xml:space=\"preserve\">\n    <value>Тайм-аут на зарядці / на батареї (0 - УВІМК)</value>\n  </data>\n  <data name=\"BacklightTimeoutBattery\" xml:space=\"preserve\">\n    <value>Тайм-аут підсвітки на батареї</value>\n  </data>\n  <data name=\"BacklightTimeoutPlugged\" xml:space=\"preserve\">\n    <value>Тайм-аут підсвітки на зарядці</value>\n  </data>\n  <data name=\"Balanced\" xml:space=\"preserve\">\n    <value>Баланс</value>\n  </data>\n  <data name=\"BatteryCharge\" xml:space=\"preserve\">\n    <value>Заряд</value>\n  </data>\n  <data name=\"BatteryChargeLimit\" xml:space=\"preserve\">\n    <value>Ліміт заряду батареї</value>\n  </data>\n  <data name=\"BatteryHealth\" xml:space=\"preserve\">\n    <value>Стан батареї</value>\n  </data>\n  <data name=\"BatteryLimitFull\" xml:space=\"preserve\">\n    <value>Одноразовий заряд до 100%</value>\n  </data>\n  <data name=\"Binding\" xml:space=\"preserve\">\n    <value>Прив'язка</value>\n  </data>\n  <data name=\"BindingPrimary\" xml:space=\"preserve\">\n    <value>Первинна</value>\n  </data>\n  <data name=\"BindingSecondary\" xml:space=\"preserve\">\n    <value>Додаткова</value>\n  </data>\n  <data name=\"BiosAndDriverUpdates\" xml:space=\"preserve\">\n    <value>Оновлення BIOS та драйверів</value>\n  </data>\n  <data name=\"Boot\" xml:space=\"preserve\">\n    <value>Старт</value>\n  </data>\n  <data name=\"BootSound\" xml:space=\"preserve\">\n    <value>Звук завантаження</value>\n  </data>\n  <data name=\"Brightness\" xml:space=\"preserve\">\n    <value>Яскравість</value>\n  </data>\n  <data name=\"BrightnessDown\" xml:space=\"preserve\">\n    <value>Зменшити яскравість</value>\n  </data>\n  <data name=\"BrightnessUp\" xml:space=\"preserve\">\n    <value>Підвищити яскравість</value>\n  </data>\n  <data name=\"BWTrayIcon\" xml:space=\"preserve\">\n    <value>Чорно-біла іконка трею</value>\n  </data>\n  <data name=\"Calibrate\" xml:space=\"preserve\">\n    <value>Калібр.</value>\n  </data>\n  <data name=\"Charging\" xml:space=\"preserve\">\n    <value>Зарядка</value>\n  </data>\n  <data name=\"Color\" xml:space=\"preserve\">\n    <value>Колір</value>\n  </data>\n  <data name=\"Contrast\" xml:space=\"preserve\">\n    <value>Контраст</value>\n  </data>\n  <data name=\"Controller\" xml:space=\"preserve\">\n    <value>Контролер</value>\n  </data>\n  <data name=\"CPUBoost\" xml:space=\"preserve\">\n    <value>CPU Boost</value>\n  </data>\n  <data name=\"Custom\" xml:space=\"preserve\">\n    <value>Своє</value>\n  </data>\n  <data name=\"Deceleration\" xml:space=\"preserve\">\n    <value>Уповільнення</value>\n  </data>\n  <data name=\"Default\" xml:space=\"preserve\">\n    <value>За замовчуванням</value>\n  </data>\n  <data name=\"DisableController\" xml:space=\"preserve\">\n    <value>Вимкнути контролер</value>\n  </data>\n  <data name=\"DisableOnLidClose\" xml:space=\"preserve\">\n    <value>Вимкнути при закритті</value>\n  </data>\n  <data name=\"DisableOverdrive\" xml:space=\"preserve\">\n    <value>Вимкнути овердрайв дисплею</value>\n  </data>\n  <data name=\"Discharging\" xml:space=\"preserve\">\n    <value>Розрядка</value>\n  </data>\n  <data name=\"DownloadColorProfiles\" xml:space=\"preserve\">\n    <value>Завантажити Колірні Профілі</value>\n  </data>\n  <data name=\"DownloadUpdate\" xml:space=\"preserve\">\n    <value>Завантажити</value>\n  </data>\n  <data name=\"DriverAndSoftware\" xml:space=\"preserve\">\n    <value>Драйвери та програми</value>\n  </data>\n  <data name=\"EcoGPUTooltip\" xml:space=\"preserve\">\n    <value>Вимикає dGPU, щоб зберегти заряд</value>\n  </data>\n  <data name=\"EcoMode\" xml:space=\"preserve\">\n    <value>Еко</value>\n  </data>\n  <data name=\"EnableGPUOnShutdown\" xml:space=\"preserve\">\n    <value>Увімкнути GPU при вимиканні лептопу</value>\n  </data>\n  <data name=\"EnableOptimusText\" xml:space=\"preserve\">\n    <value>Вимкнення dGPU коли NVIDIA Display Mode не встановлено в режим Optimus може спричинити проблеми з управлінням яскравістю до наступного перезавантаження. \n\nВи все ще хочете продовжити?</value>\n  </data>\n  <data name=\"EnableOptimusTitle\" xml:space=\"preserve\">\n    <value>NVIDIA Display Mode не в режимі Optimus</value>\n  </data>\n  <data name=\"EnergySettings\" xml:space=\"preserve\">\n    <value>Налаштування Енергії</value>\n  </data>\n  <data name=\"Export\" xml:space=\"preserve\">\n    <value>Експортувати Профіль</value>\n  </data>\n  <data name=\"Extra\" xml:space=\"preserve\">\n    <value>Додатково</value>\n  </data>\n  <data name=\"ExtraSettings\" xml:space=\"preserve\">\n    <value>Додаткові Налаштування</value>\n  </data>\n  <data name=\"FactoryDefaults\" xml:space=\"preserve\">\n    <value>Скинути</value>\n  </data>\n  <data name=\"FanCurves\" xml:space=\"preserve\">\n    <value>Профілі кулерів</value>\n  </data>\n  <data name=\"FanProfileCPU\" xml:space=\"preserve\">\n    <value>Профіль кулеру CPU</value>\n  </data>\n  <data name=\"FanProfileGPU\" xml:space=\"preserve\">\n    <value>Профіль кулеру GPU</value>\n  </data>\n  <data name=\"FanProfileMid\" xml:space=\"preserve\">\n    <value>Профіль додаткового кулеру</value>\n  </data>\n  <data name=\"FanProfiles\" xml:space=\"preserve\">\n    <value>Профілі кулерів</value>\n  </data>\n  <data name=\"FansAndPower\" xml:space=\"preserve\">\n    <value>Кулери та Потужність</value>\n  </data>\n  <data name=\"FanSpeed\" xml:space=\"preserve\">\n    <value>Fan</value>\n  </data>\n  <data name=\"FansPower\" xml:space=\"preserve\">\n    <value>Кулери та Потужність</value>\n  </data>\n  <data name=\"FlickerFreeDimming\" xml:space=\"preserve\">\n    <value>Безмерехтливе Затемнення</value>\n  </data>\n  <data name=\"FnLock\" xml:space=\"preserve\">\n    <value>Гарячі клавіші Fn+F працюють без натискання Fn</value>\n  </data>\n  <data name=\"FnLockOff\" xml:space=\"preserve\">\n    <value>FN-Lock Вимк.</value>\n  </data>\n  <data name=\"FnLockOn\" xml:space=\"preserve\">\n    <value>FN-Lock Увімк.</value>\n  </data>\n  <data name=\"GPUBoost\" xml:space=\"preserve\">\n    <value>Dynamic Boost</value>\n  </data>\n  <data name=\"GPUChanging\" xml:space=\"preserve\">\n    <value>Зміна</value>\n  </data>\n  <data name=\"GPUCoreClockOffset\" xml:space=\"preserve\">\n    <value>Core Clock Offset</value>\n  </data>\n  <data name=\"GPUMemoryClockOffset\" xml:space=\"preserve\">\n    <value>Memory Clock Offset</value>\n  </data>\n  <data name=\"GPUMode\" xml:space=\"preserve\">\n    <value>Режим Графіки</value>\n  </data>\n  <data name=\"GPUModeEco\" xml:space=\"preserve\">\n    <value>Тільки iGPU</value>\n  </data>\n  <data name=\"GPUModeStandard\" xml:space=\"preserve\">\n    <value>iGPU + dGPU</value>\n  </data>\n  <data name=\"GPUModeUltimate\" xml:space=\"preserve\">\n    <value>Ексклюзивний dGPU</value>\n  </data>\n  <data name=\"GPUPower\" xml:space=\"preserve\">\n    <value>Потужність GPU</value>\n  </data>\n  <data name=\"GPUSettings\" xml:space=\"preserve\">\n    <value>Параметри GPU</value>\n  </data>\n  <data name=\"GPUTempTarget\" xml:space=\"preserve\">\n    <value>Temperature Target</value>\n  </data>\n  <data name=\"HibernateAfter\" xml:space=\"preserve\">\n    <value>Хвилин до режиму глибокого сну з акумулятором (0 - Вимкнено)</value>\n  </data>\n  <data name=\"High\" xml:space=\"preserve\">\n    <value>Висока</value>\n  </data>\n  <data name=\"ImageRotation\" xml:space=\"preserve\">\n    <value>Поворот</value>\n  </data>\n  <data name=\"Import\" xml:space=\"preserve\">\n    <value>Імпорт Профілю</value>\n  </data>\n  <data name=\"KeyBindings\" xml:space=\"preserve\">\n    <value>Прив'язки клавіш</value>\n  </data>\n  <data name=\"Keyboard\" xml:space=\"preserve\">\n    <value>Клавіатура</value>\n  </data>\n  <data name=\"KillGpuApps\" xml:space=\"preserve\">\n    <value>Закривати додатки, що використовують GPU, під час переходу в режим Eco</value>\n  </data>\n  <data name=\"LaptopBacklight\" xml:space=\"preserve\">\n    <value>Підсвітка</value>\n  </data>\n  <data name=\"LaptopKeyboard\" xml:space=\"preserve\">\n    <value>Клавіатура</value>\n  </data>\n  <data name=\"LaptopScreen\" xml:space=\"preserve\">\n    <value>Дисплей</value>\n  </data>\n  <data name=\"LEDStatusIndicators\" xml:space=\"preserve\">\n    <value>LED-Індикатори стану</value>\n  </data>\n  <data name=\"Lid\" xml:space=\"preserve\">\n    <value>Кришка</value>\n  </data>\n  <data name=\"Lightbar\" xml:space=\"preserve\">\n    <value>Лайтбар</value>\n  </data>\n  <data name=\"Lighting\" xml:space=\"preserve\">\n    <value>Ілюмінація</value>\n  </data>\n  <data name=\"LockScreen\" xml:space=\"preserve\">\n    <value>Блокування екрану</value>\n  </data>\n  <data name=\"Logo\" xml:space=\"preserve\">\n    <value>Лого</value>\n  </data>\n  <data name=\"Low\" xml:space=\"preserve\">\n    <value>Низька</value>\n  </data>\n  <data name=\"LSDeadzones\" xml:space=\"preserve\">\n    <value>Лівий стік - Deadzone</value>\n  </data>\n  <data name=\"LTDeadzones\" xml:space=\"preserve\">\n    <value>Лівий тригер - Deadzone</value>\n  </data>\n  <data name=\"MatrixAudio\" xml:space=\"preserve\">\n    <value>Аудіо візуалізатор</value>\n  </data>\n  <data name=\"MatrixBanner\" xml:space=\"preserve\">\n    <value>Бінарний банер</value>\n  </data>\n  <data name=\"MatrixBright\" xml:space=\"preserve\">\n    <value>Яскрава</value>\n  </data>\n  <data name=\"MatrixClock\" xml:space=\"preserve\">\n    <value>Годинник</value>\n  </data>\n  <data name=\"MatrixDim\" xml:space=\"preserve\">\n    <value>Слабка</value>\n  </data>\n  <data name=\"MatrixLogo\" xml:space=\"preserve\">\n    <value>Логотип Rog</value>\n  </data>\n  <data name=\"MatrixMedium\" xml:space=\"preserve\">\n    <value>Середня</value>\n  </data>\n  <data name=\"MatrixOff\" xml:space=\"preserve\">\n    <value>Вимкнена</value>\n  </data>\n  <data name=\"MatrixPicture\" xml:space=\"preserve\">\n    <value>Картинка</value>\n  </data>\n  <data name=\"MaxRefreshTooltip\" xml:space=\"preserve\">\n    <value>Максимальна частота оновлення для мінімізації затримок</value>\n  </data>\n  <data name=\"MinRefreshTooltip\" xml:space=\"preserve\">\n    <value>Частота 60Гц, щоб зберегти заряд батареї</value>\n  </data>\n  <data name=\"Minute\" xml:space=\"preserve\">\n    <value>Хвил.</value>\n  </data>\n  <data name=\"Minutes\" xml:space=\"preserve\">\n    <value>Хвилини</value>\n  </data>\n  <data name=\"MouseAngleSnapping\" xml:space=\"preserve\">\n    <value>Angle Snapping / Tuning</value>\n  </data>\n  <data name=\"MouseAutoPowerOff\" xml:space=\"preserve\">\n    <value>Авто-вимикання</value>\n  </data>\n  <data name=\"MouseButtonResponse\" xml:space=\"preserve\">\n    <value>Відповідь Кнопок</value>\n  </data>\n  <data name=\"MouseImportFailed\" xml:space=\"preserve\">\n    <value>Не вдалося імпортувати профіль. Вибраний файл не є допустимим профілем миші або є пошкодженим.</value>\n  </data>\n  <data name=\"MouseLiftOffDistance\" xml:space=\"preserve\">\n    <value>Відстань підйому</value>\n  </data>\n  <data name=\"MouseLowBatteryWarning\" xml:space=\"preserve\">\n    <value>Попередження про низький заряд</value>\n  </data>\n  <data name=\"MousePerformance\" xml:space=\"preserve\">\n    <value>Режим Швидкодії</value>\n  </data>\n  <data name=\"MouseSynchronize\" xml:space=\"preserve\">\n    <value>Синхронізувати з мишею</value>\n  </data>\n  <data name=\"Multizone\" xml:space=\"preserve\">\n    <value>Мульти зона</value>\n  </data>\n  <data name=\"MultizoneStrong\" xml:space=\"preserve\">\n    <value>Мульти зона сильна</value>\n  </data>\n  <data name=\"Muted\" xml:space=\"preserve\">\n    <value>Беззвучний</value>\n  </data>\n  <data name=\"MuteMic\" xml:space=\"preserve\">\n    <value>Вимкнути мікрофон</value>\n  </data>\n  <data name=\"Never\" xml:space=\"preserve\">\n    <value>Ніколи</value>\n  </data>\n  <data name=\"NewUpdates\" xml:space=\"preserve\">\n    <value>Є оновлення</value>\n  </data>\n  <data name=\"NoNewUpdates\" xml:space=\"preserve\">\n    <value>Немає оновлень</value>\n  </data>\n  <data name=\"NotConnected\" xml:space=\"preserve\">\n    <value>Не під'єднано</value>\n  </data>\n  <data name=\"Off\" xml:space=\"preserve\">\n    <value>Вимк.</value>\n  </data>\n  <data name=\"On\" xml:space=\"preserve\">\n    <value>Увімк.</value>\n  </data>\n  <data name=\"OneZone\" xml:space=\"preserve\">\n    <value>Одна зона</value>\n  </data>\n  <data name=\"OpenGHelper\" xml:space=\"preserve\">\n    <value>Відкрити вікно G-Helper</value>\n  </data>\n  <data name=\"Optimized\" xml:space=\"preserve\">\n    <value>Авто</value>\n  </data>\n  <data name=\"OptimizedGPUTooltip\" xml:space=\"preserve\">\n    <value>Вмикає Еко на батареї та Стандартний на зарядці</value>\n  </data>\n  <data name=\"OptimizedUSBC\" xml:space=\"preserve\">\n    <value>Вимикати GPU на зарядці від USB-C в режимі Авто</value>\n  </data>\n  <data name=\"Other\" xml:space=\"preserve\">\n    <value>Інше</value>\n  </data>\n  <data name=\"Overdrive\" xml:space=\"preserve\">\n    <value>Овердрайв</value>\n  </data>\n  <data name=\"PerformanceMode\" xml:space=\"preserve\">\n    <value>Режим</value>\n  </data>\n  <data name=\"Peripherals\" xml:space=\"preserve\">\n    <value>Периферія</value>\n  </data>\n  <data name=\"PictureGif\" xml:space=\"preserve\">\n    <value>Картинка / GIF</value>\n  </data>\n  <data name=\"PlayPause\" xml:space=\"preserve\">\n    <value>Відтворення / Пауза</value>\n  </data>\n  <data name=\"PollingRate\" xml:space=\"preserve\">\n    <value>Частота опитування</value>\n  </data>\n  <data name=\"PowerLimits\" xml:space=\"preserve\">\n    <value>Ліміти Потужності</value>\n  </data>\n  <data name=\"PPTExperimental\" xml:space=\"preserve\">\n    <value>Налаштування лімітів потужності є експериментальною функцією. Використовуйте обережно та на свій страх і ризик!</value>\n  </data>\n  <data name=\"PrintScreen\" xml:space=\"preserve\">\n    <value>Print Screen</value>\n  </data>\n  <data name=\"Profile\" xml:space=\"preserve\">\n    <value>Профіль</value>\n  </data>\n  <data name=\"Quit\" xml:space=\"preserve\">\n    <value>Вихід</value>\n  </data>\n  <data name=\"Reset\" xml:space=\"preserve\">\n    <value>Скинути</value>\n  </data>\n  <data name=\"RestartGPU\" xml:space=\"preserve\">\n    <value>Щось використовує dGPU та запобігає Еко-режиму. Дозвольте G-Helper спробувати перезапустити dGPU у менеджері пристрою? (Будь ласка, продовжуйте на власний ризик)</value>\n  </data>\n  <data name=\"RPM\" xml:space=\"preserve\">\n    <value>Оберти</value>\n  </data>\n  <data name=\"RSDeadzones\" xml:space=\"preserve\">\n    <value>Правий стік - Deadzone</value>\n  </data>\n  <data name=\"RTDeadzones\" xml:space=\"preserve\">\n    <value>Правий тригер - Deadzone</value>\n  </data>\n  <data name=\"RunOnStartup\" xml:space=\"preserve\">\n    <value>Запускати на старті</value>\n  </data>\n  <data name=\"ScalingQuality\" xml:space=\"preserve\">\n    <value>Масштабування</value>\n  </data>\n  <data name=\"ScreenPadDown\" xml:space=\"preserve\">\n    <value>Зменшити яскравість Screenpad</value>\n  </data>\n  <data name=\"ScreenPadUp\" xml:space=\"preserve\">\n    <value>Збільшити яскравість Screenpad</value>\n  </data>\n  <data name=\"Shutdown\" xml:space=\"preserve\">\n    <value>Вимикання</value>\n  </data>\n  <data name=\"Silent\" xml:space=\"preserve\">\n    <value>Тихий</value>\n  </data>\n  <data name=\"Sleep\" xml:space=\"preserve\">\n    <value>Сон</value>\n  </data>\n  <data name=\"StandardGPUTooltip\" xml:space=\"preserve\">\n    <value>Вмикає dGPU для нормального використання</value>\n  </data>\n  <data name=\"StandardMode\" xml:space=\"preserve\">\n    <value>Стандартний</value>\n  </data>\n  <data name=\"Start\" xml:space=\"preserve\">\n    <value>Запустити</value>\n  </data>\n  <data name=\"StartingServices\" xml:space=\"preserve\">\n    <value>Запускаються сервіси</value>\n  </data>\n  <data name=\"StartupError\" xml:space=\"preserve\">\n    <value>Помилка запуску</value>\n  </data>\n  <data name=\"Stop\" xml:space=\"preserve\">\n    <value>Зупинити</value>\n  </data>\n  <data name=\"StopGPUApps\" xml:space=\"preserve\">\n    <value>Зупинити GPU додатки</value>\n  </data>\n  <data name=\"StoppingServices\" xml:space=\"preserve\">\n    <value>Зупиняються сервіси</value>\n  </data>\n  <data name=\"ToggleAura\" xml:space=\"preserve\">\n    <value>Аура</value>\n  </data>\n  <data name=\"ToggleClamshellMode\" xml:space=\"preserve\">\n    <value>Автоматично вмикати режим Clamshell</value>\n  </data>\n  <data name=\"ToggleFnLock\" xml:space=\"preserve\">\n    <value>Fn-Lock</value>\n  </data>\n  <data name=\"ToggleMiniled\" xml:space=\"preserve\">\n    <value>Міні-лед (якщо є)</value>\n  </data>\n  <data name=\"ToggleScreen\" xml:space=\"preserve\">\n    <value>Вимкнути екран</value>\n  </data>\n  <data name=\"ToggleTouchscreen\" xml:space=\"preserve\">\n    <value>Сенсорний екран</value>\n  </data>\n  <data name=\"Touchscreen\" xml:space=\"preserve\">\n    <value>Сенсорний екран</value>\n  </data>\n  <data name=\"Turbo\" xml:space=\"preserve\">\n    <value>Турбо</value>\n  </data>\n  <data name=\"TurnedOff\" xml:space=\"preserve\">\n    <value>Вимкнений</value>\n  </data>\n  <data name=\"TurnOffOnBattery\" xml:space=\"preserve\">\n    <value>Вимкнути на батареї</value>\n  </data>\n  <data name=\"UltimateGPUTooltip\" xml:space=\"preserve\">\n    <value>Підключає екран лептопу до dGPU, щоб підвищити FPS</value>\n  </data>\n  <data name=\"UltimateMode\" xml:space=\"preserve\">\n    <value>Ультімейт</value>\n  </data>\n  <data name=\"UndervoltingRisky\" xml:space=\"preserve\">\n    <value>Undervolting є експериментальним. Якщо значення занизькі для вашого CPU, це може спричинити нестабільність або пошкодити дані. Якщо хочете спробувати - почніть з малих значень, натисніть «Застосувати» та перевірте, чи стабільно все працює.</value>\n  </data>\n  <data name=\"Unmuted\" xml:space=\"preserve\">\n    <value>Активний</value>\n  </data>\n  <data name=\"Updates\" xml:space=\"preserve\">\n    <value>Оновлення</value>\n  </data>\n  <data name=\"VersionLabel\" xml:space=\"preserve\">\n    <value>Версія</value>\n  </data>\n  <data name=\"VibrationStrength\" xml:space=\"preserve\">\n    <value>Сила вібрації</value>\n  </data>\n  <data name=\"VisualMode\" xml:space=\"preserve\">\n    <value>Візуальний режим</value>\n  </data>\n  <data name=\"VisualModesHDR\" xml:space=\"preserve\">\n    <value>Візуальні режими недоступні, коли HDR активний</value>\n  </data>\n  <data name=\"VisualModesScreen\" xml:space=\"preserve\">\n    <value>Візуальні режими недоступні, коли екран вимкнений</value>\n  </data>\n  <data name=\"VolumeDown\" xml:space=\"preserve\">\n    <value>Зменшення гучності</value>\n  </data>\n  <data name=\"VolumeMute\" xml:space=\"preserve\">\n    <value>Вимкнення звуку</value>\n  </data>\n  <data name=\"VolumeUp\" xml:space=\"preserve\">\n    <value>Збільшення гучності</value>\n  </data>\n  <data name=\"WindowTop\" xml:space=\"preserve\">\n    <value>Тримати вікно завжди зверху</value>\n  </data>\n  <data name=\"Zoom\" xml:space=\"preserve\">\n    <value>Зум</value>\n  </data>\n  <data name=\"Donate\" xml:space=\"preserve\">\n    <value>Донат</value>\n  </data>\n  <data name=\"Legend\" xml:space=\"preserve\">\n    <value>Легенда</value>\n  </data>\n  <data name=\"LegendGray\" xml:space=\"preserve\">\n    <value>Немає даних</value>\n    <comment>Can't check local version</comment>\n  </data>\n  <data name=\"LegendRed\" xml:space=\"preserve\">\n    <value>Є оновлення</value>\n    <comment>Update Available</comment>\n  </data>\n  <data name=\"LegendGreen\" xml:space=\"preserve\">\n    <value>Оновлено</value>\n    <comment>Updated</comment>\n  </data>\n  <data name=\"SlashBounce\" xml:space=\"preserve\">\n    <value>Відскок</value>\n  </data>\n  <data name=\"SlashMode\" xml:space=\"preserve\">\n    <value>Слеш</value>\n  </data>\n  <data name=\"SlashLoading\" xml:space=\"preserve\">\n    <value>Завантаження</value>\n  </data>\n  <data name=\"SlashBitStream\" xml:space=\"preserve\">\n    <value>Bit Stream</value>\n  </data>\n  <data name=\"SlashTransmission\" xml:space=\"preserve\">\n    <value>Трансмісія</value>\n  </data>\n  <data name=\"SlashFlow\" xml:space=\"preserve\">\n    <value>Потік</value>\n  </data>\n  <data name=\"SlashFlux\" xml:space=\"preserve\">\n    <value>Flux</value>\n  </data>\n  <data name=\"SlashPhantom\" xml:space=\"preserve\">\n    <value>Phantom</value>\n  </data>\n  <data name=\"SlashSpectrum\" xml:space=\"preserve\">\n    <value>Spectrum</value>\n  </data>\n  <data name=\"SlashHazard\" xml:space=\"preserve\">\n    <value>Hazard</value>\n  </data>\n  <data name=\"SlashInterfacing\" xml:space=\"preserve\">\n    <value>Interfacing</value>\n  </data>\n  <data name=\"SlashRamp\" xml:space=\"preserve\">\n    <value>Ramp</value>\n  </data>\n  <data name=\"SlashGameOver\" xml:space=\"preserve\">\n    <value>Game Over</value>\n  </data>\n  <data name=\"SlashStart\" xml:space=\"preserve\">\n    <value>Почати</value>\n  </data>\n  <data name=\"SlashBuzzer\" xml:space=\"preserve\">\n    <value>Buzzer</value>\n  </data>\n  <data name=\"SlashStatic\" xml:space=\"preserve\">\n    <value>Static</value>\n  </data>\n  <data name=\"SlashBatteryLevel\" xml:space=\"preserve\">\n    <value>Рівень заряду батареї</value>\n  </data>\n  <data name=\"IntervalOff\" xml:space=\"preserve\">\n    <value>Interval Off</value>\n  </data>\n  <data name=\"IntervalSeconds\" xml:space=\"preserve\">\n    <value>Interval {0}s</value>\n  </data>\n  <data name=\"DisableDynamicLighting\" xml:space=\"preserve\">\n    <value>Вимкніть Windows > &gt; Динамічне освітлення</value>\n  </data>\n  <data name=\"AmbientModeResources\" xml:space=\"preserve\">\n    <value>Режим Ambient може збільшити використання ресурсів</value>\n  </data>\n  <data name=\"MouseMotionSync\" xml:space=\"preserve\">\n    <value>Motion Sync</value>\n  </data>\n  <data name=\"MouseZoneMode\" xml:space=\"preserve\">\n    <value>Zone Mode</value>\n  </data>\n</root>"
  },
  {
    "path": "app/Properties/Strings.vi.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" id=\"root\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\"/>\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"name\" type=\"xsd:string\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\"/>\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Acceleration\" xml:space=\"preserve\">\n    <value>Gia tốc</value>\n  </data>\n  <data name=\"ACPIError\" xml:space=\"preserve\">\n    <value>Không thể kết nối đến ASUS ACPI. Chương trình cần nó để có thể hoạt động. Hãy thử cài lại Asus System Control Interface</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestart\" xml:space=\"preserve\">\n    <value>Khởi động lại thiết bị của bạn để áp dụng thay đổi</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestartTitle\" xml:space=\"preserve\">\n    <value>Khởi động lại ngay?</value>\n  </data>\n  <data name=\"AlertDGPU\" xml:space=\"preserve\">\n    <value>Có vẻ như GPU rời đang được sử dụng nhiều, tắt nó?</value>\n  </data>\n  <data name=\"AlertDGPUTitle\" xml:space=\"preserve\">\n    <value>Chế độ Tiết kiệm</value>\n  </data>\n  <data name=\"AlertUltimateOff\" xml:space=\"preserve\">\n    <value>Chuyển sang Chế độ Tối thượng cần phải khởi động lại</value>\n  </data>\n  <data name=\"AlertUltimateOn\" xml:space=\"preserve\">\n    <value>Chế độ Tối thượng yêu cầu phải khởi động lại</value>\n  </data>\n  <data name=\"AlertUltimateTitle\" xml:space=\"preserve\">\n    <value>Khởi động lại ngay?</value>\n  </data>\n  <data name=\"AllyController\" xml:space=\"preserve\">\n    <value>Bộ điều khiển Ally</value>\n  </data>\n  <data name=\"AnimationSpeed\" xml:space=\"preserve\">\n    <value>Tốc độ</value>\n  </data>\n  <data name=\"AnimeMatrix\" xml:space=\"preserve\">\n    <value>AniMe Matrix</value>\n  </data>\n  <data name=\"AppAlreadyRunning\" xml:space=\"preserve\">\n    <value>Chương trình đã chạy</value>\n  </data>\n  <data name=\"AppAlreadyRunningText\" xml:space=\"preserve\">\n    <value>G-Helper đã chạy. Hãy kiểm tra khay hệ thống</value>\n  </data>\n  <data name=\"Apply\" xml:space=\"preserve\">\n    <value>Áp dụng</value>\n  </data>\n  <data name=\"ApplyFanCurve\" xml:space=\"preserve\">\n    <value>Áp dụng Đường cong quạt tuỳ chỉnh</value>\n  </data>\n  <data name=\"ApplyPowerLimits\" xml:space=\"preserve\">\n    <value>Áp dụng Giới hạn công suất</value>\n  </data>\n  <data name=\"ApplyWindowsPowerPlan\" xml:space=\"preserve\">\n    <value>Tự động điều chỉnh Kế hoạch nguồn của Windows</value>\n  </data>\n  <data name=\"APUMemory\" xml:space=\"preserve\">\n    <value>Bộ nhớ chuyển cho GPU</value>\n  </data>\n  <data name=\"AsusServicesRunning\" xml:space=\"preserve\">\n    <value>Dịch vụ Asus đang chạy</value>\n  </data>\n  <data name=\"AuraBatteryState\" xml:space=\"preserve\">\n    <value>Trạng thái pin</value>\n  </data>\n  <data name=\"AuraBreathe\" xml:space=\"preserve\">\n    <value>Hơi thở</value>\n  </data>\n  <data name=\"AuraClockwise\" xml:space=\"preserve\">\n    <value>Chiều kim đồng hồ</value>\n  </data>\n  <data name=\"AuraColorCycle\" xml:space=\"preserve\">\n    <value>Chuyển màu</value>\n  </data>\n  <data name=\"AuraComet\" xml:space=\"preserve\">\n    <value>Sao chổi</value>\n  </data>\n  <data name=\"AuraCounterClockwise\" xml:space=\"preserve\">\n    <value>Ngược chiều kim đồng hồ</value>\n  </data>\n  <data name=\"AuraFast\" xml:space=\"preserve\">\n    <value>Nhanh</value>\n  </data>\n  <data name=\"AuraLightingMode\" xml:space=\"preserve\">\n    <value>Chế độ sáng</value>\n  </data>\n  <data name=\"AuraNormal\" xml:space=\"preserve\">\n    <value>Bình thường</value>\n  </data>\n  <data name=\"AuraRainbow\" xml:space=\"preserve\">\n    <value>Cầu vồng</value>\n  </data>\n  <data name=\"AuraRandomColor\" xml:space=\"preserve\">\n    <value>Ngẫu nhiên</value>\n  </data>\n  <data name=\"AuraReact\" xml:space=\"preserve\">\n    <value>Phản ứng</value>\n  </data>\n  <data name=\"AuraSlow\" xml:space=\"preserve\">\n    <value>Chậm</value>\n  </data>\n  <data name=\"AuraStatic\" xml:space=\"preserve\">\n    <value>Tĩnh</value>\n  </data>\n  <data name=\"AuraStrobe\" xml:space=\"preserve\">\n    <value>Nhấp nháy</value>\n  </data>\n  <data name=\"AuraZoneAll\" xml:space=\"preserve\">\n    <value>Tất cả</value>\n  </data>\n  <data name=\"AuraZoneDock\" xml:space=\"preserve\">\n    <value>Dock kết nối</value>\n  </data>\n  <data name=\"AuraZoneLogo\" xml:space=\"preserve\">\n    <value>Biểu tượng</value>\n  </data>\n  <data name=\"AuraZoneScroll\" xml:space=\"preserve\">\n    <value>Con lăn chuột</value>\n  </data>\n  <data name=\"AuraZoneUnderglow\" xml:space=\"preserve\">\n    <value>Underglow</value>\n  </data>\n  <data name=\"AutoApply\" xml:space=\"preserve\">\n    <value>Áp dụng tự động</value>\n  </data>\n  <data name=\"AutoMode\" xml:space=\"preserve\">\n    <value>Tự động</value>\n  </data>\n  <data name=\"AutoRefreshTooltip\" xml:space=\"preserve\">\n    <value>Chuyển về 60Hz khi không cắm sạc và 120Hz khi cắm sạc</value>\n  </data>\n  <data name=\"Awake\" xml:space=\"preserve\">\n    <value>Đang bật</value>\n  </data>\n  <data name=\"BacklightLow\" xml:space=\"preserve\">\n    <value>Thấp</value>\n  </data>\n  <data name=\"BacklightMax\" xml:space=\"preserve\">\n    <value>Cao</value>\n  </data>\n  <data name=\"BacklightMid\" xml:space=\"preserve\">\n    <value>Trung bình</value>\n  </data>\n  <data name=\"BacklightOff\" xml:space=\"preserve\">\n    <value>Tắt</value>\n  </data>\n  <data name=\"BacklightTimeout\" xml:space=\"preserve\">\n    <value>Số giây để tắt đèn nền bàn phím(khi dùng pin)</value>\n  </data>\n  <data name=\"BacklightTimeoutBattery\" xml:space=\"preserve\">\n    <value>Số giây để tắt đèn nền bàn phím(khi dùng pin)</value>\n  </data>\n  <data name=\"BacklightTimeoutPlugged\" xml:space=\"preserve\">\n    <value>Số giây để tắt đèn bàn phím (khi cắm dây)</value>\n  </data>\n  <data name=\"Balanced\" xml:space=\"preserve\">\n    <value>Cân bằng</value>\n  </data>\n  <data name=\"BatteryCharge\" xml:space=\"preserve\">\n    <value>Sạc</value>\n  </data>\n  <data name=\"BatteryChargeLimit\" xml:space=\"preserve\">\n    <value>Giới hạn sạc</value>\n  </data>\n  <data name=\"BatteryHealth\" xml:space=\"preserve\">\n    <value>Sức khoẻ pin</value>\n  </data>\n  <data name=\"BatteryLimitFull\" xml:space=\"preserve\">\n    <value>Sạc 1 lần đến 100%</value>\n  </data>\n  <data name=\"Binding\" xml:space=\"preserve\">\n    <value>Binding</value>\n  </data>\n  <data name=\"BindingPrimary\" xml:space=\"preserve\">\n    <value>Chính</value>\n  </data>\n  <data name=\"BindingSecondary\" xml:space=\"preserve\">\n    <value>Phụ</value>\n  </data>\n  <data name=\"BiosAndDriverUpdates\" xml:space=\"preserve\">\n    <value>Cập nhật BIOS và driver</value>\n  </data>\n  <data name=\"Boot\" xml:space=\"preserve\">\n    <value>Khởi động</value>\n  </data>\n  <data name=\"BootSound\" xml:space=\"preserve\">\n    <value>Tiếng ROG khi bật máy</value>\n  </data>\n  <data name=\"Brightness\" xml:space=\"preserve\">\n    <value>Độ sáng</value>\n  </data>\n  <data name=\"BrightnessDown\" xml:space=\"preserve\">\n    <value>Giảm độ sáng</value>\n  </data>\n  <data name=\"BrightnessUp\" xml:space=\"preserve\">\n    <value>Tăng độ sáng</value>\n  </data>\n  <data name=\"BWTrayIcon\" xml:space=\"preserve\">\n    <value>Logo đen trắng ở thanh tác vụ</value>\n  </data>\n  <data name=\"Calibrate\" xml:space=\"preserve\">\n    <value>Cân chỉnh</value>\n  </data>\n  <data name=\"Charging\" xml:space=\"preserve\">\n    <value>Đang sạc</value>\n  </data>\n  <data name=\"Color\" xml:space=\"preserve\">\n    <value>Màu</value>\n  </data>\n  <data name=\"Contrast\" xml:space=\"preserve\">\n    <value>Độ tương phản</value>\n  </data>\n  <data name=\"Controller\" xml:space=\"preserve\">\n    <value>Bộ điều khiển</value>\n  </data>\n  <data name=\"CPUBoost\" xml:space=\"preserve\">\n    <value>Tăng tốc CPU</value>\n  </data>\n  <data name=\"Custom\" xml:space=\"preserve\">\n    <value>Tuỳ chỉnh</value>\n  </data>\n  <data name=\"Deceleration\" xml:space=\"preserve\">\n    <value>Giảm tốc</value>\n  </data>\n  <data name=\"Default\" xml:space=\"preserve\">\n    <value>Mặc định</value>\n  </data>\n  <data name=\"DisableController\" xml:space=\"preserve\">\n    <value>Tắt điều khiển</value>\n  </data>\n  <data name=\"DisableOnLidClose\" xml:space=\"preserve\">\n    <value>Tắt khi gập máy xuống</value>\n  </data>\n  <data name=\"DisableOverdrive\" xml:space=\"preserve\">\n    <value>Tắt Overdrive</value>\n  </data>\n  <data name=\"Discharging\" xml:space=\"preserve\">\n    <value>Đang không sạc</value>\n  </data>\n  <data name=\"DownloadColorProfiles\" xml:space=\"preserve\">\n    <value>Download Color Profiles</value>\n  </data>\n  <data name=\"DownloadUpdate\" xml:space=\"preserve\">\n    <value>Tải xuống</value>\n  </data>\n  <data name=\"DriverAndSoftware\" xml:space=\"preserve\">\n    <value>Driver và phần mềm</value>\n  </data>\n  <data name=\"EcoGPUTooltip\" xml:space=\"preserve\">\n    <value>Tắt GPU rời để tiết kiệm pin</value>\n  </data>\n  <data name=\"EcoMode\" xml:space=\"preserve\">\n    <value>Tiết kiệm</value>\n  </data>\n  <data name=\"EnableGPUOnShutdown\" xml:space=\"preserve\">\n    <value>Khởi chạy GPU khi máy tắt (tránh vấn đề khi chạy chế độ Eco)</value>\n  </data>\n  <data name=\"EnableOptimusText\" xml:space=\"preserve\">\n    <value>Vô hiệu hóa GPU rời bằng cách chuyển sang chế độ Eco trong khi chế độ màn hình trong NVIDIA Control Panel chưa được đổi thành Optimus có thể gây ra lỗi điều chỉnh độ sáng cho đến khi khởi động lại.\n\nBạn có muốn tiếp tục không?</value>\n  </data>\n  <data name=\"EnableOptimusTitle\" xml:space=\"preserve\">\n    <value>Chế độ màn hình trong NVIDIA chưa được chỉnh sang Optimus</value>\n  </data>\n  <data name=\"EnergySettings\" xml:space=\"preserve\">\n    <value>Các chế độ năng lượng</value>\n  </data>\n  <data name=\"Export\" xml:space=\"preserve\">\n    <value>Xuất cấu hình ra file</value>\n  </data>\n  <data name=\"Extra\" xml:space=\"preserve\">\n    <value>Thêm</value>\n  </data>\n  <data name=\"ExtraSettings\" xml:space=\"preserve\">\n    <value>Cài đặt bổ sung</value>\n  </data>\n  <data name=\"FactoryDefaults\" xml:space=\"preserve\">\n    <value>Đặt về mặc định</value>\n  </data>\n  <data name=\"FanCurves\" xml:space=\"preserve\">\n    <value>Chế độ Quạt</value>\n  </data>\n  <data name=\"FanProfileCPU\" xml:space=\"preserve\">\n    <value>Cấu hình Quạt CPU</value>\n  </data>\n  <data name=\"FanProfileGPU\" xml:space=\"preserve\">\n    <value>Cấu hình Quạt GPU</value>\n  </data>\n  <data name=\"FanProfileMid\" xml:space=\"preserve\">\n    <value>Cấu hình Quạt giữa</value>\n  </data>\n  <data name=\"FanProfiles\" xml:space=\"preserve\">\n    <value>Cấu hình Quạt</value>\n  </data>\n  <data name=\"FansAndPower\" xml:space=\"preserve\">\n    <value>Quạt và Công suất</value>\n  </data>\n  <data name=\"FanSpeed\" xml:space=\"preserve\">\n    <value>Quạt</value>\n  </data>\n  <data name=\"FansPower\" xml:space=\"preserve\">\n    <value>Quạt + Công suất</value>\n  </data>\n  <data name=\"FlickerFreeDimming\" xml:space=\"preserve\">\n    <value>Flicker-free Dimming</value>\n  </data>\n  <data name=\"FnLock\" xml:space=\"preserve\">\n    <value>Dùng những tổ hợp phím Fn+F mà không cần Fn</value>\n  </data>\n  <data name=\"FnLockOff\" xml:space=\"preserve\">\n    <value>Tắt khóa Fn</value>\n  </data>\n  <data name=\"FnLockOn\" xml:space=\"preserve\">\n    <value>Bật khóa Fn</value>\n  </data>\n  <data name=\"GPUBoost\" xml:space=\"preserve\">\n    <value>Tăng tốc năng động</value>\n  </data>\n  <data name=\"GPUChanging\" xml:space=\"preserve\">\n    <value>Đang đổi GPU</value>\n  </data>\n  <data name=\"GPUCoreClockOffset\" xml:space=\"preserve\">\n    <value>Bù trừ Tốc độ Nhân GPU</value>\n  </data>\n  <data name=\"GPUMemoryClockOffset\" xml:space=\"preserve\">\n    <value>Bù trừ Tốc độ RAM GPU</value>\n  </data>\n  <data name=\"GPUMode\" xml:space=\"preserve\">\n    <value>Chế độ GPU</value>\n  </data>\n  <data name=\"GPUModeEco\" xml:space=\"preserve\">\n    <value>Chỉ dùng GPU tích hợp</value>\n  </data>\n  <data name=\"GPUModeStandard\" xml:space=\"preserve\">\n    <value>GPU tích hợp + GPU rời</value>\n  </data>\n  <data name=\"GPUModeUltimate\" xml:space=\"preserve\">\n    <value>Chỉ dùng GPU rời</value>\n  </data>\n  <data name=\"GPUPower\" xml:space=\"preserve\">\n    <value>Chế độ điện GPU</value>\n  </data>\n  <data name=\"GPUSettings\" xml:space=\"preserve\">\n    <value>Cài đặt GPU</value>\n  </data>\n  <data name=\"GPUTempTarget\" xml:space=\"preserve\">\n    <value>Nhiệt độ đích</value>\n  </data>\n  <data name=\"HibernateAfter\" xml:space=\"preserve\">\n    <value>Minutes till Hibernation in sleep on battery (0 - OFF)</value>\n  </data>\n  <data name=\"High\" xml:space=\"preserve\">\n    <value>Cao</value>\n  </data>\n  <data name=\"ImageRotation\" xml:space=\"preserve\">\n    <value>Xoay Hình Ảnh</value>\n  </data>\n  <data name=\"Import\" xml:space=\"preserve\">\n    <value>Nhập cấu hình từ file</value>\n  </data>\n  <data name=\"KeyBindings\" xml:space=\"preserve\">\n    <value>Tổ hợp phím</value>\n  </data>\n  <data name=\"Keyboard\" xml:space=\"preserve\">\n    <value>Bàn phím</value>\n  </data>\n  <data name=\"KillGpuApps\" xml:space=\"preserve\">\n    <value>Ngưng tất cả app dùng GPU khi đổi sang chế độ Eco</value>\n  </data>\n  <data name=\"LaptopBacklight\" xml:space=\"preserve\">\n    <value>Độ sáng đèn nền</value>\n  </data>\n  <data name=\"LaptopKeyboard\" xml:space=\"preserve\">\n    <value>Bàn phím Laptop</value>\n  </data>\n  <data name=\"LaptopScreen\" xml:space=\"preserve\">\n    <value>Màn hình Laptop</value>\n  </data>\n  <data name=\"LEDStatusIndicators\" xml:space=\"preserve\">\n    <value>Đèn báo LED</value>\n  </data>\n  <data name=\"Lid\" xml:space=\"preserve\">\n    <value>Màn gập</value>\n  </data>\n  <data name=\"Lightbar\" xml:space=\"preserve\">\n    <value>Thanh sáng</value>\n  </data>\n  <data name=\"Lighting\" xml:space=\"preserve\">\n    <value>Ánh sáng</value>\n  </data>\n  <data name=\"LockScreen\" xml:space=\"preserve\">\n    <value>Màn hình khoá</value>\n  </data>\n  <data name=\"Logo\" xml:space=\"preserve\">\n    <value>Biểu tượng</value>\n  </data>\n  <data name=\"Low\" xml:space=\"preserve\">\n    <value>Thấp</value>\n  </data>\n  <data name=\"LSDeadzones\" xml:space=\"preserve\">\n    <value>Deadzone stick trái</value>\n  </data>\n  <data name=\"LTDeadzones\" xml:space=\"preserve\">\n    <value>Deadzone trigger trái</value>\n  </data>\n  <data name=\"MatrixAudio\" xml:space=\"preserve\">\n    <value>Sóng nhạc</value>\n  </data>\n  <data name=\"MatrixBanner\" xml:space=\"preserve\">\n    <value>Nhị phân</value>\n  </data>\n  <data name=\"MatrixBright\" xml:space=\"preserve\">\n    <value>Sáng</value>\n  </data>\n  <data name=\"MatrixClock\" xml:space=\"preserve\">\n    <value>Đồng hồ</value>\n  </data>\n  <data name=\"MatrixDim\" xml:space=\"preserve\">\n    <value>Sáng mờ</value>\n  </data>\n  <data name=\"MatrixLogo\" xml:space=\"preserve\">\n    <value>Logo ROG</value>\n  </data>\n  <data name=\"MatrixMedium\" xml:space=\"preserve\">\n    <value>Vừa phải</value>\n  </data>\n  <data name=\"MatrixOff\" xml:space=\"preserve\">\n    <value>Tắt</value>\n  </data>\n  <data name=\"MatrixPicture\" xml:space=\"preserve\">\n    <value>Hình ảnh</value>\n  </data>\n  <data name=\"MaxRefreshTooltip\" xml:space=\"preserve\">\n    <value>Tần số quét tối đa để có độ trễ thấp</value>\n  </data>\n  <data name=\"MinRefreshTooltip\" xml:space=\"preserve\">\n    <value>Tần số quét 60Hz để tiết kiệm pin</value>\n  </data>\n  <data name=\"Minute\" xml:space=\"preserve\">\n    <value>Phút</value>\n  </data>\n  <data name=\"Minutes\" xml:space=\"preserve\">\n    <value>Minutes</value>\n  </data>\n  <data name=\"MouseAngleSnapping\" xml:space=\"preserve\">\n    <value>Angle Snapping / Tuning</value>\n  </data>\n  <data name=\"MouseAutoPowerOff\" xml:space=\"preserve\">\n    <value>Auto Power Off After</value>\n  </data>\n  <data name=\"MouseButtonResponse\" xml:space=\"preserve\">\n    <value>Button Response</value>\n  </data>\n  <data name=\"MouseImportFailed\" xml:space=\"preserve\">\n    <value>Import failed. Selected file is not a valid mouse profile or corrutpted.</value>\n  </data>\n  <data name=\"MouseLiftOffDistance\" xml:space=\"preserve\">\n    <value>Lift Off Distance</value>\n  </data>\n  <data name=\"MouseLowBatteryWarning\" xml:space=\"preserve\">\n    <value>Low Battery Warning at</value>\n  </data>\n  <data name=\"MousePerformance\" xml:space=\"preserve\">\n    <value>Performance</value>\n  </data>\n  <data name=\"MouseSynchronize\" xml:space=\"preserve\">\n    <value>Synchronize with mouse</value>\n  </data>\n  <data name=\"Multizone\" xml:space=\"preserve\">\n    <value>Multi Zone</value>\n  </data>\n  <data name=\"MultizoneStrong\" xml:space=\"preserve\">\n    <value>Multi Zone Strong</value>\n  </data>\n  <data name=\"Muted\" xml:space=\"preserve\">\n    <value>Muted</value>\n  </data>\n  <data name=\"MuteMic\" xml:space=\"preserve\">\n    <value>Tắt Mic</value>\n  </data>\n  <data name=\"Never\" xml:space=\"preserve\">\n    <value>Never</value>\n  </data>\n  <data name=\"NewUpdates\" xml:space=\"preserve\">\n    <value>New updates</value>\n  </data>\n  <data name=\"NoNewUpdates\" xml:space=\"preserve\">\n    <value>No new updates</value>\n  </data>\n  <data name=\"NotConnected\" xml:space=\"preserve\">\n    <value>Not Connected</value>\n  </data>\n  <data name=\"Off\" xml:space=\"preserve\">\n    <value>Off</value>\n  </data>\n  <data name=\"On\" xml:space=\"preserve\">\n    <value>On</value>\n  </data>\n  <data name=\"OneZone\" xml:space=\"preserve\">\n    <value>One Zone</value>\n  </data>\n  <data name=\"OpenGHelper\" xml:space=\"preserve\">\n    <value>Mở cửa sổ G-Helper</value>\n  </data>\n  <data name=\"Optimized\" xml:space=\"preserve\">\n    <value>Tối ưu</value>\n  </data>\n  <data name=\"OptimizedGPUTooltip\" xml:space=\"preserve\">\n    <value>Chuyển về Tiết kiệm khi dùng pin và Tiêu chuẩn khi cắm sạc</value>\n  </data>\n  <data name=\"OptimizedUSBC\" xml:space=\"preserve\">\n    <value>Tắt GPU khi dùng sạc Type-C ở Chế độ Tối ưu</value>\n  </data>\n  <data name=\"Other\" xml:space=\"preserve\">\n    <value>Khác</value>\n  </data>\n  <data name=\"Overdrive\" xml:space=\"preserve\">\n    <value>Overdrive</value>\n  </data>\n  <data name=\"PerformanceMode\" xml:space=\"preserve\">\n    <value>Chế độ Hiệu suất</value>\n  </data>\n  <data name=\"Peripherals\" xml:space=\"preserve\">\n    <value>Peripherals</value>\n  </data>\n  <data name=\"PictureGif\" xml:space=\"preserve\">\n    <value>Ảnh tĩnh / Ảnh động</value>\n  </data>\n  <data name=\"PlayPause\" xml:space=\"preserve\">\n    <value>Phát / Dừng</value>\n  </data>\n  <data name=\"PollingRate\" xml:space=\"preserve\">\n    <value>Polling Rate</value>\n  </data>\n  <data name=\"PowerLimits\" xml:space=\"preserve\">\n    <value>Giới hạn công suất</value>\n  </data>\n  <data name=\"PPTExperimental\" xml:space=\"preserve\">\n    <value>Giới hạn công suất là tính năng thử nghiệm. Sử dụng nó cẩn thận và tự chịu mọi rủi ro!</value>\n  </data>\n  <data name=\"PrintScreen\" xml:space=\"preserve\">\n    <value>Chụp màn hình</value>\n  </data>\n  <data name=\"Profile\" xml:space=\"preserve\">\n    <value>Profile</value>\n  </data>\n  <data name=\"Quit\" xml:space=\"preserve\">\n    <value>Thoát</value>\n  </data>\n  <data name=\"Reset\" xml:space=\"preserve\">\n    <value>Reset</value>\n  </data>\n  <data name=\"RestartGPU\" xml:space=\"preserve\">\n    <value>Something is using dGPU and preventing Eco mode. Let G-Helper try to restart dGPU in device manager? (Please proceed at your own risk)</value>\n  </data>\n  <data name=\"RPM\" xml:space=\"preserve\">\n    <value>VTP</value>\n  </data>\n  <data name=\"RSDeadzones\" xml:space=\"preserve\">\n    <value>Right Stick Deadzones</value>\n  </data>\n  <data name=\"RTDeadzones\" xml:space=\"preserve\">\n    <value>Right Trigger Deadzones</value>\n  </data>\n  <data name=\"RunOnStartup\" xml:space=\"preserve\">\n    <value>Chạy khi khởi động</value>\n  </data>\n  <data name=\"ScalingQuality\" xml:space=\"preserve\">\n    <value>Scaling Quality</value>\n  </data>\n  <data name=\"ScreenPadDown\" xml:space=\"preserve\">\n    <value>Screenpad Brightness Down</value>\n  </data>\n  <data name=\"ScreenPadUp\" xml:space=\"preserve\">\n    <value>Screenpad Brightness Up</value>\n  </data>\n  <data name=\"Shutdown\" xml:space=\"preserve\">\n    <value>Tắt nguồn</value>\n  </data>\n  <data name=\"Silent\" xml:space=\"preserve\">\n    <value>Im lặng</value>\n  </data>\n  <data name=\"Sleep\" xml:space=\"preserve\">\n    <value>Ngủ</value>\n  </data>\n  <data name=\"StandardGPUTooltip\" xml:space=\"preserve\">\n    <value>Bật GPU rời song song với GPU tích hợp</value>\n  </data>\n  <data name=\"StandardMode\" xml:space=\"preserve\">\n    <value>Tiêu chuẩn</value>\n  </data>\n  <data name=\"Start\" xml:space=\"preserve\">\n    <value>Start</value>\n  </data>\n  <data name=\"StartingServices\" xml:space=\"preserve\">\n    <value>Starting Services</value>\n  </data>\n  <data name=\"StartupError\" xml:space=\"preserve\">\n    <value>Khởi động lỗi</value>\n  </data>\n  <data name=\"Stop\" xml:space=\"preserve\">\n    <value>Stop</value>\n  </data>\n  <data name=\"StopGPUApps\" xml:space=\"preserve\">\n    <value>Stop GPU Applications</value>\n  </data>\n  <data name=\"StoppingServices\" xml:space=\"preserve\">\n    <value>Stopping Services</value>\n  </data>\n  <data name=\"ToggleAura\" xml:space=\"preserve\">\n    <value>Bật tắt Aura</value>\n  </data>\n  <data name=\"ToggleClamshellMode\" xml:space=\"preserve\">\n    <value>Auto Toggle Clamshell Mode</value>\n  </data>\n  <data name=\"ToggleFnLock\" xml:space=\"preserve\">\n    <value>Toggle Fn-Lock</value>\n  </data>\n  <data name=\"ToggleMiniled\" xml:space=\"preserve\">\n    <value>Bật tắt Miniled(Nếu có hỗ trợ)</value>\n  </data>\n  <data name=\"ToggleScreen\" xml:space=\"preserve\">\n    <value>Bật tắt màn hình</value>\n  </data>\n  <data name=\"ToggleTouchscreen\" xml:space=\"preserve\">\n    <value>Toggle Touchscreen</value>\n  </data>\n  <data name=\"Touchscreen\" xml:space=\"preserve\">\n    <value>Touchscreen</value>\n  </data>\n  <data name=\"Turbo\" xml:space=\"preserve\">\n    <value>Turbo</value>\n  </data>\n  <data name=\"TurnedOff\" xml:space=\"preserve\">\n    <value>Đã tắt</value>\n  </data>\n  <data name=\"TurnOffOnBattery\" xml:space=\"preserve\">\n    <value>Tắt khi không cắm sạc</value>\n  </data>\n  <data name=\"UltimateGPUTooltip\" xml:space=\"preserve\">\n    <value>Chỉ dùng GPU rời, tối đa hóa FPS</value>\n  </data>\n  <data name=\"UltimateMode\" xml:space=\"preserve\">\n    <value>Tối thượng</value>\n  </data>\n  <data name=\"UndervoltingRisky\" xml:space=\"preserve\">\n    <value>Undervolting is an experimental and risky feature. If applied values are too low for your hardware, it can become unstable, shut down or cause data corruption. If you want to try - start from small values first, click Apply and test what works for you.</value>\n  </data>\n  <data name=\"Unmuted\" xml:space=\"preserve\">\n    <value>Unmuted</value>\n  </data>\n  <data name=\"Updates\" xml:space=\"preserve\">\n    <value>Updates</value>\n  </data>\n  <data name=\"VersionLabel\" xml:space=\"preserve\">\n    <value>Phiên bản</value>\n  </data>\n  <data name=\"VibrationStrength\" xml:space=\"preserve\">\n    <value>Vibration Strength</value>\n  </data>\n  <data name=\"VisualMode\" xml:space=\"preserve\">\n    <value>Visual Mode</value>\n  </data>\n  <data name=\"VisualModesHDR\" xml:space=\"preserve\">\n    <value>Visual Modes are not available when HDR is active</value>\n  </data>\n  <data name=\"VisualModesScreen\" xml:space=\"preserve\">\n    <value>Visual Modes are not available when laptop screen is off</value>\n  </data>\n  <data name=\"VolumeDown\" xml:space=\"preserve\">\n    <value>Giảm âm lượng</value>\n  </data>\n  <data name=\"VolumeMute\" xml:space=\"preserve\">\n    <value>Tắt âm lượng</value>\n  </data>\n  <data name=\"VolumeUp\" xml:space=\"preserve\">\n    <value>Tăng âm lượng</value>\n  </data>\n  <data name=\"WindowTop\" xml:space=\"preserve\">\n    <value>Giữ cửa sổ ở trên cùng</value>\n  </data>\n  <data name=\"Zoom\" xml:space=\"preserve\">\n    <value>Zoom</value>\n  </data>\n  <data name=\"Donate\" xml:space=\"preserve\">\n    <value>Donate</value>\n  </data>\n  <data name=\"Legend\" xml:space=\"preserve\">\n    <value>Legend</value>\n  </data>\n  <data name=\"LegendGray\" xml:space=\"preserve\">\n    <value>Can't check local version</value>\n    <comment>Can't check local version</comment>\n  </data>\n  <data name=\"LegendRed\" xml:space=\"preserve\">\n    <value>Update Available</value>\n    <comment>Update Available</comment>\n  </data>\n  <data name=\"LegendGreen\" xml:space=\"preserve\">\n    <value>Updated</value>\n    <comment>Updated</comment>\n  </data>\n  <data name=\"SlashBounce\" xml:space=\"preserve\">\n    <value>Bounce</value>\n  </data>\n  <data name=\"SlashMode\" xml:space=\"preserve\">\n    <value>Slash</value>\n  </data>\n  <data name=\"SlashLoading\" xml:space=\"preserve\">\n    <value>Loading</value>\n  </data>\n  <data name=\"SlashBitStream\" xml:space=\"preserve\">\n    <value>Bit Stream</value>\n  </data>\n  <data name=\"SlashTransmission\" xml:space=\"preserve\">\n    <value>Transmission</value>\n  </data>\n  <data name=\"SlashFlow\" xml:space=\"preserve\">\n    <value>Flow</value>\n  </data>\n  <data name=\"SlashFlux\" xml:space=\"preserve\">\n    <value>Flux</value>\n  </data>\n  <data name=\"SlashPhantom\" xml:space=\"preserve\">\n    <value>Phantom</value>\n  </data>\n  <data name=\"SlashSpectrum\" xml:space=\"preserve\">\n    <value>Spectrum</value>\n  </data>\n  <data name=\"SlashHazard\" xml:space=\"preserve\">\n    <value>Hazard</value>\n  </data>\n  <data name=\"SlashInterfacing\" xml:space=\"preserve\">\n    <value>Interfacing</value>\n  </data>\n  <data name=\"SlashRamp\" xml:space=\"preserve\">\n    <value>Ramp</value>\n  </data>\n  <data name=\"SlashGameOver\" xml:space=\"preserve\">\n    <value>Game Over</value>\n  </data>\n  <data name=\"SlashStart\" xml:space=\"preserve\">\n    <value>Start</value>\n  </data>\n  <data name=\"SlashBuzzer\" xml:space=\"preserve\">\n    <value>Buzzer</value>\n  </data>\n  <data name=\"SlashStatic\" xml:space=\"preserve\">\n    <value>Static</value>\n  </data>\n  <data name=\"SlashBatteryLevel\" xml:space=\"preserve\">\n    <value>Battery Level</value>\n  </data>\n  <data name=\"IntervalOff\" xml:space=\"preserve\">\n    <value>Interval Off</value>\n  </data>\n  <data name=\"IntervalSeconds\" xml:space=\"preserve\">\n    <value>Interval {0}s</value>\n  </data>\n  <data name=\"DisableDynamicLighting\" xml:space=\"preserve\">\n    <value>Please disable Windows &gt; Dynamic Lighting</value>\n  </data>\n  <data name=\"AmbientModeResources\" xml:space=\"preserve\">\n    <value>Ambient mode may increase resource usage</value>\n  </data>\n  <data name=\"MouseMotionSync\" xml:space=\"preserve\">\n    <value>Motion Sync</value>\n  </data>\n  <data name=\"MouseZoneMode\" xml:space=\"preserve\">\n    <value>Zone Mode</value>\n  </data>\n</root>"
  },
  {
    "path": "app/Properties/Strings.zh-CN.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" id=\"root\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\"/>\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"name\" type=\"xsd:string\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\"/>\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Acceleration\" xml:space=\"preserve\">\n    <value>加速</value>\n  </data>\n  <data name=\"ACPIError\" xml:space=\"preserve\">\n    <value>无法连接到ASUS ACPI。 没有它应用程序将无法运行。 请尝试安装Asus System Control Interface驱动。</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestart\" xml:space=\"preserve\">\n    <value>重新启动您的设备以应用更改</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestartTitle\" xml:space=\"preserve\">\n    <value>现在重启？</value>\n  </data>\n  <data name=\"AlertDGPU\" xml:space=\"preserve\">\n    <value>看起来 GPU 正在被重度使用，是否禁用？</value>\n  </data>\n  <data name=\"AlertDGPUTitle\" xml:space=\"preserve\">\n    <value>集显模式</value>\n  </data>\n  <data name=\"AlertUltimateOff\" xml:space=\"preserve\">\n    <value>关闭独显直连需要重启</value>\n  </data>\n  <data name=\"AlertUltimateOn\" xml:space=\"preserve\">\n    <value>切换到独显直连需要重启</value>\n  </data>\n  <data name=\"AlertUltimateTitle\" xml:space=\"preserve\">\n    <value>现在重启吗？</value>\n  </data>\n  <data name=\"AllyController\" xml:space=\"preserve\">\n    <value>Ally 控制器</value>\n  </data>\n  <data name=\"AnimationSpeed\" xml:space=\"preserve\">\n    <value>动画速度</value>\n  </data>\n  <data name=\"AnimeMatrix\" xml:space=\"preserve\">\n    <value>Anime Matrix</value>\n  </data>\n  <data name=\"AppAlreadyRunning\" xml:space=\"preserve\">\n    <value>应用已经在运行</value>\n  </data>\n  <data name=\"AppAlreadyRunningText\" xml:space=\"preserve\">\n    <value>G-Helper已经在运行。 请查看系统托盘中的图标。</value>\n  </data>\n  <data name=\"Apply\" xml:space=\"preserve\">\n    <value>应用</value>\n  </data>\n  <data name=\"ApplyFanCurve\" xml:space=\"preserve\">\n    <value>应用自定义风扇曲线</value>\n  </data>\n  <data name=\"ApplyPowerLimits\" xml:space=\"preserve\">\n    <value>应用功率限制</value>\n  </data>\n  <data name=\"ApplyWindowsPowerPlan\" xml:space=\"preserve\">\n    <value>自动调整Windows电源模式</value>\n  </data>\n  <data name=\"APUMemory\" xml:space=\"preserve\">\n    <value>分配给 GPU 的内存</value>\n  </data>\n  <data name=\"AsusServicesRunning\" xml:space=\"preserve\">\n    <value>正在运行的 Asus 服务</value>\n  </data>\n  <data name=\"AuraBatteryState\" xml:space=\"preserve\">\n    <value>电池状态</value>\n  </data>\n  <data name=\"AuraBreathe\" xml:space=\"preserve\">\n    <value>呼吸</value>\n  </data>\n  <data name=\"AuraClockwise\" xml:space=\"preserve\">\n    <value>顺时针</value>\n  </data>\n  <data name=\"AuraColorCycle\" xml:space=\"preserve\">\n    <value>彩色循环</value>\n  </data>\n  <data name=\"AuraComet\" xml:space=\"preserve\">\n    <value>彗星</value>\n  </data>\n  <data name=\"AuraCounterClockwise\" xml:space=\"preserve\">\n    <value>逆时针</value>\n  </data>\n  <data name=\"AuraFast\" xml:space=\"preserve\">\n    <value>快速</value>\n  </data>\n  <data name=\"AuraLightingMode\" xml:space=\"preserve\">\n    <value>灯效模式</value>\n  </data>\n  <data name=\"AuraNormal\" xml:space=\"preserve\">\n    <value>正常</value>\n  </data>\n  <data name=\"AuraRainbow\" xml:space=\"preserve\">\n    <value>彩虹</value>\n  </data>\n  <data name=\"AuraRandomColor\" xml:space=\"preserve\">\n    <value>随机</value>\n  </data>\n  <data name=\"AuraReact\" xml:space=\"preserve\">\n    <value>触发</value>\n  </data>\n  <data name=\"AuraSlow\" xml:space=\"preserve\">\n    <value>慢</value>\n  </data>\n  <data name=\"AuraStatic\" xml:space=\"preserve\">\n    <value>恒亮(静态)</value>\n  </data>\n  <data name=\"AuraStrobe\" xml:space=\"preserve\">\n    <value>闪烁</value>\n  </data>\n  <data name=\"AuraZoneAll\" xml:space=\"preserve\">\n    <value>全部</value>\n  </data>\n  <data name=\"AuraZoneDock\" xml:space=\"preserve\">\n    <value>Dock</value>\n  </data>\n  <data name=\"AuraZoneLogo\" xml:space=\"preserve\">\n    <value>Logo</value>\n  </data>\n  <data name=\"AuraZoneScroll\" xml:space=\"preserve\">\n    <value>滚轮</value>\n  </data>\n  <data name=\"AuraZoneUnderglow\" xml:space=\"preserve\">\n    <value>底灯</value>\n  </data>\n  <data name=\"AutoApply\" xml:space=\"preserve\">\n    <value>自动应用</value>\n  </data>\n  <data name=\"AutoMode\" xml:space=\"preserve\">\n    <value>自动</value>\n  </data>\n  <data name=\"AutoRefreshTooltip\" xml:space=\"preserve\">\n    <value>使用电池时设置为60Hz,并在插上电源时恢复</value>\n  </data>\n  <data name=\"Awake\" xml:space=\"preserve\">\n    <value>唤醒时</value>\n  </data>\n  <data name=\"BacklightLow\" xml:space=\"preserve\">\n    <value>低亮度</value>\n  </data>\n  <data name=\"BacklightMax\" xml:space=\"preserve\">\n    <value>高亮度</value>\n  </data>\n  <data name=\"BacklightMid\" xml:space=\"preserve\">\n    <value>中亮度</value>\n  </data>\n  <data name=\"BacklightOff\" xml:space=\"preserve\">\n    <value>背光关闭</value>\n  </data>\n  <data name=\"BacklightTimeout\" xml:space=\"preserve\">\n    <value>插电/电池时熄灭时间（0表示长亮）</value>\n  </data>\n  <data name=\"BacklightTimeoutBattery\" xml:space=\"preserve\">\n    <value>充电模式下的背光超时</value>\n  </data>\n  <data name=\"BacklightTimeoutPlugged\" xml:space=\"preserve\">\n    <value>电源模式下的背光超时</value>\n  </data>\n  <data name=\"Balanced\" xml:space=\"preserve\">\n    <value>平衡模式</value>\n  </data>\n  <data name=\"BatteryCharge\" xml:space=\"preserve\">\n    <value>电池电量</value>\n  </data>\n  <data name=\"BatteryChargeLimit\" xml:space=\"preserve\">\n    <value>电池充电限制</value>\n  </data>\n  <data name=\"BatteryHealth\" xml:space=\"preserve\">\n    <value>电池健康</value>\n  </data>\n  <data name=\"BatteryLimitFull\" xml:space=\"preserve\">\n    <value>一次性充电至 100%</value>\n  </data>\n  <data name=\"Binding\" xml:space=\"preserve\">\n    <value>绑定</value>\n  </data>\n  <data name=\"BindingPrimary\" xml:space=\"preserve\">\n    <value>主要</value>\n  </data>\n  <data name=\"BindingSecondary\" xml:space=\"preserve\">\n    <value>次要</value>\n  </data>\n  <data name=\"BiosAndDriverUpdates\" xml:space=\"preserve\">\n    <value>BIOS 和驱动程序更新</value>\n  </data>\n  <data name=\"Boot\" xml:space=\"preserve\">\n    <value>开机时</value>\n  </data>\n  <data name=\"BootSound\" xml:space=\"preserve\">\n    <value>开机音效</value>\n  </data>\n  <data name=\"Brightness\" xml:space=\"preserve\">\n    <value>亮度</value>\n  </data>\n  <data name=\"BrightnessDown\" xml:space=\"preserve\">\n    <value>降低亮度</value>\n  </data>\n  <data name=\"BrightnessUp\" xml:space=\"preserve\">\n    <value>提高亮度</value>\n  </data>\n  <data name=\"BWTrayIcon\" xml:space=\"preserve\">\n    <value>黑白托盘图标</value>\n  </data>\n  <data name=\"Calibrate\" xml:space=\"preserve\">\n    <value>校准</value>\n  </data>\n  <data name=\"Charging\" xml:space=\"preserve\">\n    <value>充电中</value>\n  </data>\n  <data name=\"Color\" xml:space=\"preserve\">\n    <value>颜色</value>\n  </data>\n  <data name=\"Contrast\" xml:space=\"preserve\">\n    <value>对比</value>\n  </data>\n  <data name=\"Controller\" xml:space=\"preserve\">\n    <value>控制器</value>\n  </data>\n  <data name=\"CPUBoost\" xml:space=\"preserve\">\n    <value>CPU 睿频</value>\n  </data>\n  <data name=\"Custom\" xml:space=\"preserve\">\n    <value>自定义设置</value>\n  </data>\n  <data name=\"Deceleration\" xml:space=\"preserve\">\n    <value>减速</value>\n  </data>\n  <data name=\"Default\" xml:space=\"preserve\">\n    <value>默认</value>\n  </data>\n  <data name=\"DisableController\" xml:space=\"preserve\">\n    <value>禁用控制器</value>\n  </data>\n  <data name=\"DisableOnLidClose\" xml:space=\"preserve\">\n    <value>合盖时禁用</value>\n  </data>\n  <data name=\"DisableOverdrive\" xml:space=\"preserve\">\n    <value>禁用屏幕快速显示(OD)</value>\n  </data>\n  <data name=\"Discharging\" xml:space=\"preserve\">\n    <value>正在放电</value>\n  </data>\n  <data name=\"DownloadColorProfiles\" xml:space=\"preserve\">\n    <value>下载颜色配置文件</value>\n  </data>\n  <data name=\"DownloadUpdate\" xml:space=\"preserve\">\n    <value>下载</value>\n  </data>\n  <data name=\"DriverAndSoftware\" xml:space=\"preserve\">\n    <value>驱动程序和软件</value>\n  </data>\n  <data name=\"EcoGPUTooltip\" xml:space=\"preserve\">\n    <value>禁用独显以节省电池电量</value>\n  </data>\n  <data name=\"EcoMode\" xml:space=\"preserve\">\n    <value>集显模式</value>\n  </data>\n  <data name=\"EnableGPUOnShutdown\" xml:space=\"preserve\">\n    <value>在关闭时启用 GPU (防止与 Eco 模式出现问题)</value>\n  </data>\n  <data name=\"EnableOptimusText\" xml:space=\"preserve\">\n    <value>NVIDIA 控制面板中的显示模式未设置为 Optimus 时，通过集显模式禁用独立显卡可能会使亮度控制出现问题，直到下次重启后才能恢复。\n\n确定还要继续吗？</value>\n  </data>\n  <data name=\"EnableOptimusTitle\" xml:space=\"preserve\">\n    <value>NVIDIA 显示模式未设置为 Optimus</value>\n  </data>\n  <data name=\"EnergySettings\" xml:space=\"preserve\">\n    <value>电源设置</value>\n  </data>\n  <data name=\"Export\" xml:space=\"preserve\">\n    <value>导出配置文件</value>\n  </data>\n  <data name=\"Extra\" xml:space=\"preserve\">\n    <value>更多</value>\n  </data>\n  <data name=\"ExtraSettings\" xml:space=\"preserve\">\n    <value>更多设置</value>\n  </data>\n  <data name=\"FactoryDefaults\" xml:space=\"preserve\">\n    <value>恢复默认设置</value>\n  </data>\n  <data name=\"FanCurves\" xml:space=\"preserve\">\n    <value>风扇曲线</value>\n  </data>\n  <data name=\"FanProfileCPU\" xml:space=\"preserve\">\n    <value>CPU 风扇配置文件</value>\n  </data>\n  <data name=\"FanProfileGPU\" xml:space=\"preserve\">\n    <value>GPU 风扇配置文件</value>\n  </data>\n  <data name=\"FanProfileMid\" xml:space=\"preserve\">\n    <value>Mid 风扇配置文件</value>\n  </data>\n  <data name=\"FanProfiles\" xml:space=\"preserve\">\n    <value>风扇配置</value>\n  </data>\n  <data name=\"FansAndPower\" xml:space=\"preserve\">\n    <value>风扇和电源</value>\n  </data>\n  <data name=\"FanSpeed\" xml:space=\"preserve\">\n    <value>风扇</value>\n  </data>\n  <data name=\"FansPower\" xml:space=\"preserve\">\n    <value>风扇 + 功率</value>\n  </data>\n  <data name=\"FlickerFreeDimming\" xml:space=\"preserve\">\n    <value>低亮度防闪烁功能</value>\n  </data>\n  <data name=\"FnLock\" xml:space=\"preserve\">\n    <value>打开FnLock (无需按下FN使用FN+(F1-F12)热键)</value>\n  </data>\n  <data name=\"FnLockOff\" xml:space=\"preserve\">\n    <value>Fn锁定关</value>\n  </data>\n  <data name=\"FnLockOn\" xml:space=\"preserve\">\n    <value>Fn锁定开</value>\n  </data>\n  <data name=\"GPUBoost\" xml:space=\"preserve\">\n    <value>动态加速</value>\n  </data>\n  <data name=\"GPUChanging\" xml:space=\"preserve\">\n    <value>切换中...</value>\n  </data>\n  <data name=\"GPUCoreClockOffset\" xml:space=\"preserve\">\n    <value>核心频率偏移量</value>\n  </data>\n  <data name=\"GPUMemoryClockOffset\" xml:space=\"preserve\">\n    <value>显存频率偏移量</value>\n  </data>\n  <data name=\"GPUMode\" xml:space=\"preserve\">\n    <value>显卡模式</value>\n  </data>\n  <data name=\"GPUModeEco\" xml:space=\"preserve\">\n    <value>仅限核显</value>\n  </data>\n  <data name=\"GPUModeStandard\" xml:space=\"preserve\">\n    <value>核显 + 独显</value>\n  </data>\n  <data name=\"GPUModeUltimate\" xml:space=\"preserve\">\n    <value>独显直连</value>\n  </data>\n  <data name=\"GPUPower\" xml:space=\"preserve\">\n    <value>GPU 功率</value>\n  </data>\n  <data name=\"GPUSettings\" xml:space=\"preserve\">\n    <value>GPU 设置</value>\n  </data>\n  <data name=\"GPUTempTarget\" xml:space=\"preserve\">\n    <value>温度目标</value>\n  </data>\n  <data name=\"HibernateAfter\" xml:space=\"preserve\">\n    <value>在使用电池时几分钟后进入休眠状态 (0 - 关闭)</value>\n  </data>\n  <data name=\"High\" xml:space=\"preserve\">\n    <value>高</value>\n  </data>\n  <data name=\"ImageRotation\" xml:space=\"preserve\">\n    <value>图像旋转</value>\n  </data>\n  <data name=\"Import\" xml:space=\"preserve\">\n    <value>导入配置</value>\n  </data>\n  <data name=\"KeyBindings\" xml:space=\"preserve\">\n    <value>按键绑定</value>\n  </data>\n  <data name=\"Keyboard\" xml:space=\"preserve\">\n    <value>键盘</value>\n  </data>\n  <data name=\"KillGpuApps\" xml:space=\"preserve\">\n    <value>当切换到集显模式时，停止所有正在使用独显的应用</value>\n  </data>\n  <data name=\"LaptopBacklight\" xml:space=\"preserve\">\n    <value>背光</value>\n  </data>\n  <data name=\"LaptopKeyboard\" xml:space=\"preserve\">\n    <value>笔记本键盘</value>\n  </data>\n  <data name=\"LaptopScreen\" xml:space=\"preserve\">\n    <value>笔记本屏幕</value>\n  </data>\n  <data name=\"LEDStatusIndicators\" xml:space=\"preserve\">\n    <value>LED 状态指示器</value>\n  </data>\n  <data name=\"Lid\" xml:space=\"preserve\">\n    <value>盖子</value>\n  </data>\n  <data name=\"Lightbar\" xml:space=\"preserve\">\n    <value>灯条</value>\n  </data>\n  <data name=\"Lighting\" xml:space=\"preserve\">\n    <value>背光</value>\n  </data>\n  <data name=\"LockScreen\" xml:space=\"preserve\">\n    <value>锁定屏幕</value>\n  </data>\n  <data name=\"Logo\" xml:space=\"preserve\">\n    <value>徽标</value>\n  </data>\n  <data name=\"Low\" xml:space=\"preserve\">\n    <value>低</value>\n  </data>\n  <data name=\"LSDeadzones\" xml:space=\"preserve\">\n    <value>左摇杆死区</value>\n  </data>\n  <data name=\"LTDeadzones\" xml:space=\"preserve\">\n    <value>左扳机死区</value>\n  </data>\n  <data name=\"MatrixAudio\" xml:space=\"preserve\">\n    <value>音频可视化器</value>\n  </data>\n  <data name=\"MatrixBanner\" xml:space=\"preserve\">\n    <value>Anime Matrix 标识</value>\n  </data>\n  <data name=\"MatrixBright\" xml:space=\"preserve\">\n    <value>明亮</value>\n  </data>\n  <data name=\"MatrixClock\" xml:space=\"preserve\">\n    <value>时钟</value>\n  </data>\n  <data name=\"MatrixDim\" xml:space=\"preserve\">\n    <value>暗淡</value>\n  </data>\n  <data name=\"MatrixLogo\" xml:space=\"preserve\">\n    <value>ROG logo</value>\n  </data>\n  <data name=\"MatrixMedium\" xml:space=\"preserve\">\n    <value>中</value>\n  </data>\n  <data name=\"MatrixOff\" xml:space=\"preserve\">\n    <value>关闭</value>\n  </data>\n  <data name=\"MatrixPicture\" xml:space=\"preserve\">\n    <value>图片</value>\n  </data>\n  <data name=\"MaxRefreshTooltip\" xml:space=\"preserve\">\n    <value>更高的刷新率和更低的延迟</value>\n  </data>\n  <data name=\"MinRefreshTooltip\" xml:space=\"preserve\">\n    <value>调整刷新率为60Hz以节省电量</value>\n  </data>\n  <data name=\"Minute\" xml:space=\"preserve\">\n    <value>分钟</value>\n  </data>\n  <data name=\"Minutes\" xml:space=\"preserve\">\n    <value>分钟</value>\n  </data>\n  <data name=\"MouseAngleSnapping\" xml:space=\"preserve\">\n    <value>Angle Snapping / Tuning</value>\n  </data>\n  <data name=\"MouseAutoPowerOff\" xml:space=\"preserve\">\n    <value>自动关闭时间</value>\n  </data>\n  <data name=\"MouseButtonResponse\" xml:space=\"preserve\">\n    <value>按键响应</value>\n  </data>\n  <data name=\"MouseImportFailed\" xml:space=\"preserve\">\n    <value>导入失败，选中的文件不是有效的配置文件或已损坏。</value>\n  </data>\n  <data name=\"MouseLiftOffDistance\" xml:space=\"preserve\">\n    <value>响应高度</value>\n  </data>\n  <data name=\"MouseLowBatteryWarning\" xml:space=\"preserve\">\n    <value>低于该电量时警告</value>\n  </data>\n  <data name=\"MousePerformance\" xml:space=\"preserve\">\n    <value>性能</value>\n  </data>\n  <data name=\"MouseSynchronize\" xml:space=\"preserve\">\n    <value>和鼠标同步</value>\n  </data>\n  <data name=\"Multizone\" xml:space=\"preserve\">\n    <value>多区</value>\n  </data>\n  <data name=\"MultizoneStrong\" xml:space=\"preserve\">\n    <value>多区强化</value>\n  </data>\n  <data name=\"Muted\" xml:space=\"preserve\">\n    <value>麦克风关闭</value>\n  </data>\n  <data name=\"MuteMic\" xml:space=\"preserve\">\n    <value>静音麦克风</value>\n  </data>\n  <data name=\"Never\" xml:space=\"preserve\">\n    <value>从不</value>\n  </data>\n  <data name=\"NewUpdates\" xml:space=\"preserve\">\n    <value>有更新</value>\n  </data>\n  <data name=\"NoNewUpdates\" xml:space=\"preserve\">\n    <value>无更新</value>\n  </data>\n  <data name=\"NotConnected\" xml:space=\"preserve\">\n    <value>未连接</value>\n  </data>\n  <data name=\"Off\" xml:space=\"preserve\">\n    <value>关</value>\n  </data>\n  <data name=\"On\" xml:space=\"preserve\">\n    <value>开</value>\n  </data>\n  <data name=\"OneZone\" xml:space=\"preserve\">\n    <value>单区</value>\n  </data>\n  <data name=\"OpenGHelper\" xml:space=\"preserve\">\n    <value>打开G-Helper窗口</value>\n  </data>\n  <data name=\"Optimized\" xml:space=\"preserve\">\n    <value>自动切换</value>\n  </data>\n  <data name=\"OptimizedGPUTooltip\" xml:space=\"preserve\">\n    <value>使用电池时切换到集显模式，并在插上电源后重新启用标准模式</value>\n  </data>\n  <data name=\"OptimizedUSBC\" xml:space=\"preserve\">\n    <value>在自动切换模式下，使用USB-C为笔记本供电时禁用GPU</value>\n  </data>\n  <data name=\"Other\" xml:space=\"preserve\">\n    <value>其他</value>\n  </data>\n  <data name=\"Overdrive\" xml:space=\"preserve\">\n    <value>超频</value>\n  </data>\n  <data name=\"PerformanceMode\" xml:space=\"preserve\">\n    <value>性能模式</value>\n  </data>\n  <data name=\"Peripherals\" xml:space=\"preserve\">\n    <value>外设</value>\n  </data>\n  <data name=\"PictureGif\" xml:space=\"preserve\">\n    <value>图片/动图</value>\n  </data>\n  <data name=\"PlayPause\" xml:space=\"preserve\">\n    <value>播放/暂停</value>\n  </data>\n  <data name=\"PollingRate\" xml:space=\"preserve\">\n    <value>回报率</value>\n  </data>\n  <data name=\"PowerLimits\" xml:space=\"preserve\">\n    <value>功率限制</value>\n  </data>\n  <data name=\"PPTExperimental\" xml:space=\"preserve\">\n    <value>功率限制 是实验性功能。 谨慎使用，风险自负！</value>\n  </data>\n  <data name=\"PrintScreen\" xml:space=\"preserve\">\n    <value>截图</value>\n  </data>\n  <data name=\"Profile\" xml:space=\"preserve\">\n    <value>配置</value>\n  </data>\n  <data name=\"Quit\" xml:space=\"preserve\">\n    <value>退出</value>\n  </data>\n  <data name=\"Reset\" xml:space=\"preserve\">\n    <value>重置</value>\n  </data>\n  <data name=\"RestartGPU\" xml:space=\"preserve\">\n    <value>有程序正在使用独显并阻止进入集显模式。要让 G-Helper 在设备管理器中重新启动独显吗？（请自行承担风险）</value>\n  </data>\n  <data name=\"RPM\" xml:space=\"preserve\">\n    <value>转/分钟</value>\n  </data>\n  <data name=\"RSDeadzones\" xml:space=\"preserve\">\n    <value>右摇杆死区</value>\n  </data>\n  <data name=\"RTDeadzones\" xml:space=\"preserve\">\n    <value>右扳机死区</value>\n  </data>\n  <data name=\"RunOnStartup\" xml:space=\"preserve\">\n    <value>开机自启</value>\n  </data>\n  <data name=\"ScalingQuality\" xml:space=\"preserve\">\n    <value>缩放质量</value>\n  </data>\n  <data name=\"ScreenPadDown\" xml:space=\"preserve\">\n    <value>Screenpad亮度降低</value>\n  </data>\n  <data name=\"ScreenPadUp\" xml:space=\"preserve\">\n    <value>Screenpad亮度增加</value>\n  </data>\n  <data name=\"Shutdown\" xml:space=\"preserve\">\n    <value>关机时</value>\n  </data>\n  <data name=\"Silent\" xml:space=\"preserve\">\n    <value>静音模式</value>\n  </data>\n  <data name=\"Sleep\" xml:space=\"preserve\">\n    <value>睡眠时</value>\n  </data>\n  <data name=\"StandardGPUTooltip\" xml:space=\"preserve\">\n    <value>启用独显以供日常使用</value>\n  </data>\n  <data name=\"StandardMode\" xml:space=\"preserve\">\n    <value>标准模式</value>\n  </data>\n  <data name=\"Start\" xml:space=\"preserve\">\n    <value>启动</value>\n  </data>\n  <data name=\"StartingServices\" xml:space=\"preserve\">\n    <value>启动服务中...</value>\n  </data>\n  <data name=\"StartupError\" xml:space=\"preserve\">\n    <value>启动错误</value>\n  </data>\n  <data name=\"Stop\" xml:space=\"preserve\">\n    <value>停止</value>\n  </data>\n  <data name=\"StopGPUApps\" xml:space=\"preserve\">\n    <value>停止使用 GPU 的程序</value>\n  </data>\n  <data name=\"StoppingServices\" xml:space=\"preserve\">\n    <value>停止服务中...</value>\n  </data>\n  <data name=\"ToggleAura\" xml:space=\"preserve\">\n    <value>切换 Aura 模式</value>\n  </data>\n  <data name=\"ToggleClamshellMode\" xml:space=\"preserve\">\n    <value>自动切换合盖模式</value>\n  </data>\n  <data name=\"ToggleFnLock\" xml:space=\"preserve\">\n    <value>切换 Fn 锁定</value>\n  </data>\n  <data name=\"ToggleMiniled\" xml:space=\"preserve\">\n    <value>切换 MiniLED (如果支持)</value>\n  </data>\n  <data name=\"ToggleScreen\" xml:space=\"preserve\">\n    <value>关闭屏幕</value>\n  </data>\n  <data name=\"ToggleTouchscreen\" xml:space=\"preserve\">\n    <value>切换触摸屏</value>\n  </data>\n  <data name=\"Touchscreen\" xml:space=\"preserve\">\n    <value>触摸屏</value>\n  </data>\n  <data name=\"Turbo\" xml:space=\"preserve\">\n    <value>增强模式</value>\n  </data>\n  <data name=\"TurnedOff\" xml:space=\"preserve\">\n    <value>已关闭</value>\n  </data>\n  <data name=\"TurnOffOnBattery\" xml:space=\"preserve\">\n    <value>使用电池时关闭</value>\n  </data>\n  <data name=\"UltimateGPUTooltip\" xml:space=\"preserve\">\n    <value>开启独显直连获得最佳帧率</value>\n  </data>\n  <data name=\"UltimateMode\" xml:space=\"preserve\">\n    <value>独显直连</value>\n  </data>\n  <data name=\"UndervoltingRisky\" xml:space=\"preserve\">\n    <value>降低电压是实验性的危险功能。 如果对硬件应用的值太低，可能会产生不稳定、关闭现象或造成数据损坏问题。 如果你想要尝试，应先从小值开始，点击应用并测试合适的值。</value>\n  </data>\n  <data name=\"Unmuted\" xml:space=\"preserve\">\n    <value>麦克风开启</value>\n  </data>\n  <data name=\"Updates\" xml:space=\"preserve\">\n    <value>更新</value>\n  </data>\n  <data name=\"VersionLabel\" xml:space=\"preserve\">\n    <value>版本</value>\n  </data>\n  <data name=\"VibrationStrength\" xml:space=\"preserve\">\n    <value>震动强度</value>\n  </data>\n  <data name=\"VisualMode\" xml:space=\"preserve\">\n    <value>色域模式</value>\n  </data>\n  <data name=\"VisualModesHDR\" xml:space=\"preserve\">\n    <value>HDR 开启时不支持色域模式</value>\n  </data>\n  <data name=\"VisualModesScreen\" xml:space=\"preserve\">\n    <value>笔记本自带屏幕关闭时不支持色域模式</value>\n  </data>\n  <data name=\"VolumeDown\" xml:space=\"preserve\">\n    <value>音量降低</value>\n  </data>\n  <data name=\"VolumeMute\" xml:space=\"preserve\">\n    <value>静音</value>\n  </data>\n  <data name=\"VolumeUp\" xml:space=\"preserve\">\n    <value>音量增加</value>\n  </data>\n  <data name=\"WindowTop\" xml:space=\"preserve\">\n    <value>窗口置顶</value>\n  </data>\n  <data name=\"Zoom\" xml:space=\"preserve\">\n    <value>缩放</value>\n  </data>\n  <data name=\"Donate\" xml:space=\"preserve\">\n    <value>赞助</value>\n  </data>\n  <data name=\"Legend\" xml:space=\"preserve\">\n    <value>Legend</value>\n  </data>\n  <data name=\"LegendGray\" xml:space=\"preserve\">\n    <value>无法检查本地版本</value>\n    <comment>Can't check local version</comment>\n  </data>\n  <data name=\"LegendRed\" xml:space=\"preserve\">\n    <value>有可用更新</value>\n    <comment>Update Available</comment>\n  </data>\n  <data name=\"LegendGreen\" xml:space=\"preserve\">\n    <value>已更新</value>\n    <comment>Updated</comment>\n  </data>\n  <data name=\"SlashBounce\" xml:space=\"preserve\">\n    <value>Bounce</value>\n  </data>\n  <data name=\"SlashMode\" xml:space=\"preserve\">\n    <value>Slash</value>\n  </data>\n  <data name=\"SlashLoading\" xml:space=\"preserve\">\n    <value>加载中</value>\n  </data>\n  <data name=\"SlashBitStream\" xml:space=\"preserve\">\n    <value>Bit Stream</value>\n  </data>\n  <data name=\"SlashTransmission\" xml:space=\"preserve\">\n    <value>Transmission</value>\n  </data>\n  <data name=\"SlashFlow\" xml:space=\"preserve\">\n    <value>Flow</value>\n  </data>\n  <data name=\"SlashFlux\" xml:space=\"preserve\">\n    <value>Flux</value>\n  </data>\n  <data name=\"SlashPhantom\" xml:space=\"preserve\">\n    <value>Phantom</value>\n  </data>\n  <data name=\"SlashSpectrum\" xml:space=\"preserve\">\n    <value>Spectrum</value>\n  </data>\n  <data name=\"SlashHazard\" xml:space=\"preserve\">\n    <value>Hazard</value>\n  </data>\n  <data name=\"SlashInterfacing\" xml:space=\"preserve\">\n    <value>Interfacing</value>\n  </data>\n  <data name=\"SlashRamp\" xml:space=\"preserve\">\n    <value>Ramp</value>\n  </data>\n  <data name=\"SlashGameOver\" xml:space=\"preserve\">\n    <value>游戏结束</value>\n  </data>\n  <data name=\"SlashStart\" xml:space=\"preserve\">\n    <value>启动</value>\n  </data>\n  <data name=\"SlashBuzzer\" xml:space=\"preserve\">\n    <value>Buzzer</value>\n  </data>\n  <data name=\"SlashStatic\" xml:space=\"preserve\">\n    <value>恒亮(静态)</value>\n  </data>\n  <data name=\"SlashBatteryLevel\" xml:space=\"preserve\">\n    <value>电池电量</value>\n  </data>\n  <data name=\"IntervalOff\" xml:space=\"preserve\">\n    <value>Interval Off</value>\n  </data>\n  <data name=\"IntervalSeconds\" xml:space=\"preserve\">\n    <value>间隔 {0}秒</value>\n  </data>\n  <data name=\"DisableDynamicLighting\" xml:space=\"preserve\">\n    <value>请关闭个性化 &gt; 动态光效</value>\n  </data>\n  <data name=\"AmbientModeResources\" xml:space=\"preserve\">\n    <value>环境模式可能会增加资源使用</value>\n  </data>\n  <data name=\"MouseMotionSync\" xml:space=\"preserve\">\n    <value>动态同步</value>\n  </data>\n  <data name=\"MouseZoneMode\" xml:space=\"preserve\">\n    <value>Zone 模式</value>\n  </data>\n</root>"
  },
  {
    "path": "app/Properties/Strings.zh-TW.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" id=\"root\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\"/>\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\"/>\n              <xsd:attribute name=\"name\" type=\"xsd:string\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\"/>\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\"/>\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\"/>\n              <xsd:attribute ref=\"xml:space\"/>\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\"/>\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\"/>\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Acceleration\" xml:space=\"preserve\">\n    <value>滑鼠加速</value>\n  </data>\n  <data name=\"ACPIError\" xml:space=\"preserve\">\n    <value>無法連結到華碩 ACPI，應用程式無法執行。 請嘗試安裝 Asus System Control Interface</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestart\" xml:space=\"preserve\">\n    <value>重新啟動裝置以套用變更</value>\n  </data>\n  <data name=\"AlertAPUMemoryRestartTitle\" xml:space=\"preserve\">\n    <value>現在重新啟動?</value>\n  </data>\n  <data name=\"AlertDGPU\" xml:space=\"preserve\">\n    <value>看起來 GPU 正在被重度使用，是否禁用?</value>\n  </data>\n  <data name=\"AlertDGPUTitle\" xml:space=\"preserve\">\n    <value>節能模式</value>\n  </data>\n  <data name=\"AlertUltimateOff\" xml:space=\"preserve\">\n    <value>關閉獨顯需要重新啟動</value>\n  </data>\n  <data name=\"AlertUltimateOn\" xml:space=\"preserve\">\n    <value>獨顯輸出需要重新啟動</value>\n  </data>\n  <data name=\"AlertUltimateTitle\" xml:space=\"preserve\">\n    <value>立即重新啟動?</value>\n  </data>\n  <data name=\"AllyController\" xml:space=\"preserve\">\n    <value>Ally控制器</value>\n  </data>\n  <data name=\"AnimationSpeed\" xml:space=\"preserve\">\n    <value>動畫速度</value>\n  </data>\n  <data name=\"AnimeMatrix\" xml:space=\"preserve\">\n    <value>AniMeMatrix™</value>\n  </data>\n  <data name=\"AppAlreadyRunning\" xml:space=\"preserve\">\n    <value>程式正在執行</value>\n  </data>\n  <data name=\"AppAlreadyRunningText\" xml:space=\"preserve\">\n    <value>G-Helper 正在執行。 請檢查右下系統匣。</value>\n  </data>\n  <data name=\"Apply\" xml:space=\"preserve\">\n    <value>套用</value>\n  </data>\n  <data name=\"ApplyFanCurve\" xml:space=\"preserve\">\n    <value>套用自定義風扇曲線</value>\n  </data>\n  <data name=\"ApplyPowerLimits\" xml:space=\"preserve\">\n    <value>套用功率限制</value>\n  </data>\n  <data name=\"ApplyWindowsPowerPlan\" xml:space=\"preserve\">\n    <value>自動調整 Windows 電源模式</value>\n  </data>\n  <data name=\"APUMemory\" xml:space=\"preserve\">\n    <value>分配給 GPU 的記憶體</value>\n  </data>\n  <data name=\"AsusServicesRunning\" xml:space=\"preserve\">\n    <value>執行中的華碩服務</value>\n  </data>\n  <data name=\"AuraBatteryState\" xml:space=\"preserve\">\n    <value>電池狀態</value>\n  </data>\n  <data name=\"AuraBreathe\" xml:space=\"preserve\">\n    <value>呼吸</value>\n  </data>\n  <data name=\"AuraClockwise\" xml:space=\"preserve\">\n    <value>順時針</value>\n  </data>\n  <data name=\"AuraColorCycle\" xml:space=\"preserve\">\n    <value>色彩循環</value>\n  </data>\n  <data name=\"AuraComet\" xml:space=\"preserve\">\n    <value>彗星</value>\n  </data>\n  <data name=\"AuraCounterClockwise\" xml:space=\"preserve\">\n    <value>逆時針</value>\n  </data>\n  <data name=\"AuraFast\" xml:space=\"preserve\">\n    <value>快速</value>\n  </data>\n  <data name=\"AuraLightingMode\" xml:space=\"preserve\">\n    <value>燈效模式</value>\n  </data>\n  <data name=\"AuraNormal\" xml:space=\"preserve\">\n    <value>正常</value>\n  </data>\n  <data name=\"AuraRainbow\" xml:space=\"preserve\">\n    <value>彩虹</value>\n  </data>\n  <data name=\"AuraRandomColor\" xml:space=\"preserve\">\n    <value>隨機</value>\n  </data>\n  <data name=\"AuraReact\" xml:space=\"preserve\">\n    <value>觸發</value>\n  </data>\n  <data name=\"AuraSlow\" xml:space=\"preserve\">\n    <value>慢</value>\n  </data>\n  <data name=\"AuraStatic\" xml:space=\"preserve\">\n    <value>靜態恆亮</value>\n  </data>\n  <data name=\"AuraStrobe\" xml:space=\"preserve\">\n    <value>閃爍</value>\n  </data>\n  <data name=\"AuraZoneAll\" xml:space=\"preserve\">\n    <value>全部</value>\n  </data>\n  <data name=\"AuraZoneDock\" xml:space=\"preserve\">\n    <value>底座</value>\n  </data>\n  <data name=\"AuraZoneLogo\" xml:space=\"preserve\">\n    <value>Logo</value>\n  </data>\n  <data name=\"AuraZoneScroll\" xml:space=\"preserve\">\n    <value>滾輪</value>\n  </data>\n  <data name=\"AuraZoneUnderglow\" xml:space=\"preserve\">\n    <value>底光</value>\n  </data>\n  <data name=\"AutoApply\" xml:space=\"preserve\">\n    <value>自動套用</value>\n  </data>\n  <data name=\"AutoMode\" xml:space=\"preserve\">\n    <value>自動</value>\n  </data>\n  <data name=\"AutoRefreshTooltip\" xml:space=\"preserve\">\n    <value>使用電池時設定為 60Hz，並在插上電源時恢復</value>\n  </data>\n  <data name=\"Awake\" xml:space=\"preserve\">\n    <value>喚醒時</value>\n  </data>\n  <data name=\"BacklightLow\" xml:space=\"preserve\">\n    <value>低</value>\n  </data>\n  <data name=\"BacklightMax\" xml:space=\"preserve\">\n    <value>最大</value>\n  </data>\n  <data name=\"BacklightMid\" xml:space=\"preserve\">\n    <value>中等</value>\n  </data>\n  <data name=\"BacklightOff\" xml:space=\"preserve\">\n    <value>關閉</value>\n  </data>\n  <data name=\"BacklightTimeout\" xml:space=\"preserve\">\n    <value>閒置幾秒後關閉燈光：插電時 / 使用電池 (0 = 不關閉)</value>\n  </data>\n  <data name=\"BacklightTimeoutBattery\" xml:space=\"preserve\">\n    <value>閒置時關閉燈光(電池模式)</value>\n  </data>\n  <data name=\"BacklightTimeoutPlugged\" xml:space=\"preserve\">\n    <value>閒置時關閉燈光(充電模式)</value>\n  </data>\n  <data name=\"Balanced\" xml:space=\"preserve\">\n    <value>效能</value>\n  </data>\n  <data name=\"BatteryCharge\" xml:space=\"preserve\">\n    <value>充電</value>\n  </data>\n  <data name=\"BatteryChargeLimit\" xml:space=\"preserve\">\n    <value>電池充電上限</value>\n  </data>\n  <data name=\"BatteryHealth\" xml:space=\"preserve\">\n    <value>電池健康度</value>\n  </data>\n  <data name=\"BatteryLimitFull\" xml:space=\"preserve\">\n    <value>僅本次將電力充滿</value>\n  </data>\n  <data name=\"Binding\" xml:space=\"preserve\">\n    <value>綁定</value>\n  </data>\n  <data name=\"BindingPrimary\" xml:space=\"preserve\">\n    <value>主要</value>\n  </data>\n  <data name=\"BindingSecondary\" xml:space=\"preserve\">\n    <value>次要</value>\n  </data>\n  <data name=\"BiosAndDriverUpdates\" xml:space=\"preserve\">\n    <value>BIOS 與驅動程式更新</value>\n  </data>\n  <data name=\"Boot\" xml:space=\"preserve\">\n    <value>開機時</value>\n  </data>\n  <data name=\"BootSound\" xml:space=\"preserve\">\n    <value>開機音效</value>\n  </data>\n  <data name=\"Brightness\" xml:space=\"preserve\">\n    <value>亮度</value>\n  </data>\n  <data name=\"BrightnessDown\" xml:space=\"preserve\">\n    <value>螢幕亮度降低</value>\n  </data>\n  <data name=\"BrightnessUp\" xml:space=\"preserve\">\n    <value>螢幕亮度提高</value>\n  </data>\n  <data name=\"BWTrayIcon\" xml:space=\"preserve\">\n    <value>工作列圖示黑白化</value>\n  </data>\n  <data name=\"Calibrate\" xml:space=\"preserve\">\n    <value>校準</value>\n  </data>\n  <data name=\"Charging\" xml:space=\"preserve\">\n    <value>充電中</value>\n  </data>\n  <data name=\"Color\" xml:space=\"preserve\">\n    <value>顏色</value>\n  </data>\n  <data name=\"Contrast\" xml:space=\"preserve\">\n    <value>對比</value>\n  </data>\n  <data name=\"Controller\" xml:space=\"preserve\">\n    <value>控制器</value>\n  </data>\n  <data name=\"CPUBoost\" xml:space=\"preserve\">\n    <value>CPU 加速</value>\n  </data>\n  <data name=\"Custom\" xml:space=\"preserve\">\n    <value>自定義設置</value>\n  </data>\n  <data name=\"Deceleration\" xml:space=\"preserve\">\n    <value>滑鼠減速</value>\n  </data>\n  <data name=\"Default\" xml:space=\"preserve\">\n    <value>預設</value>\n  </data>\n  <data name=\"DisableController\" xml:space=\"preserve\">\n    <value>停用控制器</value>\n  </data>\n  <data name=\"DisableOnLidClose\" xml:space=\"preserve\">\n    <value>蓋上螢幕時取消</value>\n  </data>\n  <data name=\"DisableOverdrive\" xml:space=\"preserve\">\n    <value>禁用螢幕加速OD</value>\n  </data>\n  <data name=\"Discharging\" xml:space=\"preserve\">\n    <value>使用電池中</value>\n  </data>\n  <data name=\"DownloadColorProfiles\" xml:space=\"preserve\">\n    <value>下載色彩設定檔</value>\n  </data>\n  <data name=\"DownloadUpdate\" xml:space=\"preserve\">\n    <value>下載</value>\n  </data>\n  <data name=\"DriverAndSoftware\" xml:space=\"preserve\">\n    <value>驅動程式與軟體</value>\n  </data>\n  <data name=\"EcoGPUTooltip\" xml:space=\"preserve\">\n    <value>禁用獨顯以節省電池電量</value>\n  </data>\n  <data name=\"EcoMode\" xml:space=\"preserve\">\n    <value>節能模式</value>\n  </data>\n  <data name=\"EnableGPUOnShutdown\" xml:space=\"preserve\">\n    <value>關機前啟動顯卡(解決切換顯卡節能模式&amp;混合輸出和亮度的某些問題)</value>\n  </data>\n  <data name=\"EnableOptimusText\" xml:space=\"preserve\">\n    <value>「Nvidia控制面板」中的顯示模式未設置為自動切換時，透過G-Helper的節能模式禁用獨顯可能導致螢幕亮度控制出現問題直到下次重新開機後。\n\n是否繼續？</value>\n  </data>\n  <data name=\"EnableOptimusTitle\" xml:space=\"preserve\">\n    <value>Nvidia顯示模式未設置為自動切換</value>\n  </data>\n  <data name=\"EnergySettings\" xml:space=\"preserve\">\n    <value>電源設定</value>\n  </data>\n  <data name=\"Export\" xml:space=\"preserve\">\n    <value>匯出設定檔</value>\n  </data>\n  <data name=\"Extra\" xml:space=\"preserve\">\n    <value>更多</value>\n  </data>\n  <data name=\"ExtraSettings\" xml:space=\"preserve\">\n    <value>更多設定</value>\n  </data>\n  <data name=\"FactoryDefaults\" xml:space=\"preserve\">\n    <value>恢復原廠設定</value>\n  </data>\n  <data name=\"FanCurves\" xml:space=\"preserve\">\n    <value>風扇曲線</value>\n  </data>\n  <data name=\"FanProfileCPU\" xml:space=\"preserve\">\n    <value>CPU 風扇設定檔</value>\n  </data>\n  <data name=\"FanProfileGPU\" xml:space=\"preserve\">\n    <value>GPU 風扇設定檔</value>\n  </data>\n  <data name=\"FanProfileMid\" xml:space=\"preserve\">\n    <value>小風扇設定檔</value>\n  </data>\n  <data name=\"FanProfiles\" xml:space=\"preserve\">\n    <value>風扇設定檔</value>\n  </data>\n  <data name=\"FansAndPower\" xml:space=\"preserve\">\n    <value>風扇和電源</value>\n  </data>\n  <data name=\"FanSpeed\" xml:space=\"preserve\">\n    <value>風扇</value>\n  </data>\n  <data name=\"FansPower\" xml:space=\"preserve\">\n    <value>自定義</value>\n  </data>\n  <data name=\"FlickerFreeDimming\" xml:space=\"preserve\">\n    <value>不閃屏調光(Flicker-free Dimming)</value>\n  </data>\n  <data name=\"FnLock\" xml:space=\"preserve\">\n    <value>使用 Fn + F1~F12 功能時無須按下Fn鍵</value>\n  </data>\n  <data name=\"FnLockOff\" xml:space=\"preserve\">\n    <value>Fn鎖定解除</value>\n  </data>\n  <data name=\"FnLockOn\" xml:space=\"preserve\">\n    <value>Fn鎖定</value>\n  </data>\n  <data name=\"GPUBoost\" xml:space=\"preserve\">\n    <value>動態加速 (Dynamic Boost)</value>\n  </data>\n  <data name=\"GPUChanging\" xml:space=\"preserve\">\n    <value>切換中...</value>\n  </data>\n  <data name=\"GPUCoreClockOffset\" xml:space=\"preserve\">\n    <value>核心時脈偏移量(Offset)</value>\n  </data>\n  <data name=\"GPUMemoryClockOffset\" xml:space=\"preserve\">\n    <value>顯示卡記憶體偏移量(Offset)</value>\n  </data>\n  <data name=\"GPUMode\" xml:space=\"preserve\">\n    <value>GPU 模式</value>\n  </data>\n  <data name=\"GPUModeEco\" xml:space=\"preserve\">\n    <value>僅限內顯</value>\n  </data>\n  <data name=\"GPUModeStandard\" xml:space=\"preserve\">\n    <value>內顯 + 獨顯</value>\n  </data>\n  <data name=\"GPUModeUltimate\" xml:space=\"preserve\">\n    <value>獨立顯卡</value>\n  </data>\n  <data name=\"GPUPower\" xml:space=\"preserve\">\n    <value>顯卡功耗</value>\n  </data>\n  <data name=\"GPUSettings\" xml:space=\"preserve\">\n    <value>顯卡設定</value>\n  </data>\n  <data name=\"GPUTempTarget\" xml:space=\"preserve\">\n    <value>GPU溫度上限</value>\n  </data>\n  <data name=\"HibernateAfter\" xml:space=\"preserve\">\n    <value>使用電池下何時進入休眠(0=關閉此功能)</value>\n  </data>\n  <data name=\"High\" xml:space=\"preserve\">\n    <value>高</value>\n  </data>\n  <data name=\"ImageRotation\" xml:space=\"preserve\">\n    <value>圖像旋轉</value>\n  </data>\n  <data name=\"Import\" xml:space=\"preserve\">\n    <value>匯入設定檔</value>\n  </data>\n  <data name=\"KeyBindings\" xml:space=\"preserve\">\n    <value>按鍵綁定</value>\n  </data>\n  <data name=\"Keyboard\" xml:space=\"preserve\">\n    <value>鍵盤</value>\n  </data>\n  <data name=\"KillGpuApps\" xml:space=\"preserve\">\n    <value>切換至節能模式時，關閉所有正在使用獨顯的程式</value>\n  </data>\n  <data name=\"LaptopBacklight\" xml:space=\"preserve\">\n    <value>背光</value>\n  </data>\n  <data name=\"LaptopKeyboard\" xml:space=\"preserve\">\n    <value>鍵盤背光</value>\n  </data>\n  <data name=\"LaptopScreen\" xml:space=\"preserve\">\n    <value>螢幕顯示</value>\n  </data>\n  <data name=\"LEDStatusIndicators\" xml:space=\"preserve\">\n    <value>LED狀態指示器</value>\n  </data>\n  <data name=\"Lid\" xml:space=\"preserve\">\n    <value>螢幕背蓋</value>\n  </data>\n  <data name=\"Lightbar\" xml:space=\"preserve\">\n    <value>燈條</value>\n  </data>\n  <data name=\"Lighting\" xml:space=\"preserve\">\n    <value>亮度</value>\n  </data>\n  <data name=\"LockScreen\" xml:space=\"preserve\">\n    <value>鎖定螢幕</value>\n  </data>\n  <data name=\"Logo\" xml:space=\"preserve\">\n    <value>Logo</value>\n  </data>\n  <data name=\"Low\" xml:space=\"preserve\">\n    <value>低</value>\n  </data>\n  <data name=\"LSDeadzones\" xml:space=\"preserve\">\n    <value>左搖桿死區</value>\n  </data>\n  <data name=\"LTDeadzones\" xml:space=\"preserve\">\n    <value>左扳機(LT)死區</value>\n  </data>\n  <data name=\"MatrixAudio\" xml:space=\"preserve\">\n    <value>音效視覺化</value>\n  </data>\n  <data name=\"MatrixBanner\" xml:space=\"preserve\">\n    <value>横幅</value>\n  </data>\n  <data name=\"MatrixBright\" xml:space=\"preserve\">\n    <value>明亮</value>\n  </data>\n  <data name=\"MatrixClock\" xml:space=\"preserve\">\n    <value>時鐘</value>\n  </data>\n  <data name=\"MatrixDim\" xml:space=\"preserve\">\n    <value>黯淡</value>\n  </data>\n  <data name=\"MatrixLogo\" xml:space=\"preserve\">\n    <value>ROG logo</value>\n  </data>\n  <data name=\"MatrixMedium\" xml:space=\"preserve\">\n    <value>中</value>\n  </data>\n  <data name=\"MatrixOff\" xml:space=\"preserve\">\n    <value>關閉</value>\n  </data>\n  <data name=\"MatrixPicture\" xml:space=\"preserve\">\n    <value>圖片</value>\n  </data>\n  <data name=\"MaxRefreshTooltip\" xml:space=\"preserve\">\n    <value>更高的更新率和更低延遲</value>\n  </data>\n  <data name=\"MinRefreshTooltip\" xml:space=\"preserve\">\n    <value>維持60Hz以節省電量</value>\n  </data>\n  <data name=\"Minute\" xml:space=\"preserve\">\n    <value>分鐘</value>\n  </data>\n  <data name=\"Minutes\" xml:space=\"preserve\">\n    <value>分鐘</value>\n  </data>\n  <data name=\"MouseAngleSnapping\" xml:space=\"preserve\">\n    <value>直線修正/定位角度</value>\n  </data>\n  <data name=\"MouseAutoPowerOff\" xml:space=\"preserve\">\n    <value>自動關閉電源</value>\n  </data>\n  <data name=\"MouseButtonResponse\" xml:space=\"preserve\">\n    <value>按鍵回應</value>\n  </data>\n  <data name=\"MouseImportFailed\" xml:space=\"preserve\">\n    <value>匯入失敗，所選檔案並非有效的滑鼠設定檔或該檔已毀損</value>\n  </data>\n  <data name=\"MouseLiftOffDistance\" xml:space=\"preserve\">\n    <value>響應高度(LOD)</value>\n  </data>\n  <data name=\"MouseLowBatteryWarning\" xml:space=\"preserve\">\n    <value>低電量警告</value>\n  </data>\n  <data name=\"MousePerformance\" xml:space=\"preserve\">\n    <value>性能設定</value>\n  </data>\n  <data name=\"MouseSynchronize\" xml:space=\"preserve\">\n    <value>與滑鼠同步</value>\n  </data>\n  <data name=\"Multizone\" xml:space=\"preserve\">\n    <value>多區</value>\n  </data>\n  <data name=\"MultizoneStrong\" xml:space=\"preserve\">\n    <value>多區強化</value>\n  </data>\n  <data name=\"Muted\" xml:space=\"preserve\">\n    <value>已靜音</value>\n  </data>\n  <data name=\"MuteMic\" xml:space=\"preserve\">\n    <value>麥克風開關</value>\n  </data>\n  <data name=\"Never\" xml:space=\"preserve\">\n    <value>永不</value>\n  </data>\n  <data name=\"NewUpdates\" xml:space=\"preserve\">\n    <value>新的更新</value>\n  </data>\n  <data name=\"NoNewUpdates\" xml:space=\"preserve\">\n    <value>沒有新的更新</value>\n  </data>\n  <data name=\"NotConnected\" xml:space=\"preserve\">\n    <value>未連線</value>\n  </data>\n  <data name=\"Off\" xml:space=\"preserve\">\n    <value>關閉</value>\n  </data>\n  <data name=\"On\" xml:space=\"preserve\">\n    <value>開啟</value>\n  </data>\n  <data name=\"OneZone\" xml:space=\"preserve\">\n    <value>單區</value>\n  </data>\n  <data name=\"OpenGHelper\" xml:space=\"preserve\">\n    <value>開啟G-Helper視窗</value>\n  </data>\n  <data name=\"Optimized\" xml:space=\"preserve\">\n    <value>自動調節</value>\n  </data>\n  <data name=\"OptimizedGPUTooltip\" xml:space=\"preserve\">\n    <value>使用電池時切換到，插入電源時切換到標準模式</value>\n  </data>\n  <data name=\"OptimizedUSBC\" xml:space=\"preserve\">\n    <value>自動調節模式下，使用USB-C充電時持續關閉獨顯</value>\n  </data>\n  <data name=\"Other\" xml:space=\"preserve\">\n    <value>其他</value>\n  </data>\n  <data name=\"Overdrive\" xml:space=\"preserve\">\n    <value>OD</value>\n  </data>\n  <data name=\"PerformanceMode\" xml:space=\"preserve\">\n    <value>性能模式</value>\n  </data>\n  <data name=\"Peripherals\" xml:space=\"preserve\">\n    <value>週邊設備</value>\n  </data>\n  <data name=\"PictureGif\" xml:space=\"preserve\">\n    <value>圖片/動圖</value>\n  </data>\n  <data name=\"PlayPause\" xml:space=\"preserve\">\n    <value>播放/暫停</value>\n  </data>\n  <data name=\"PollingRate\" xml:space=\"preserve\">\n    <value>輪詢率</value>\n  </data>\n  <data name=\"PowerLimits\" xml:space=\"preserve\">\n    <value>功率限制</value>\n  </data>\n  <data name=\"PPTExperimental\" xml:space=\"preserve\">\n    <value>功率限制是實驗性功能。謹慎使用,風險自負!</value>\n  </data>\n  <data name=\"PrintScreen\" xml:space=\"preserve\">\n    <value>截圖</value>\n  </data>\n  <data name=\"Profile\" xml:space=\"preserve\">\n    <value>設定檔</value>\n  </data>\n  <data name=\"Quit\" xml:space=\"preserve\">\n    <value>退出</value>\n  </data>\n  <data name=\"Reset\" xml:space=\"preserve\">\n    <value>重設</value>\n  </data>\n  <data name=\"RestartGPU\" xml:space=\"preserve\">\n    <value>有其他程式正在使用獨顯導致無法切換至節能模式. 是否讓 G-Helper 於裝置管理員重新啟動獨顯? (請自行評估風險)</value>\n  </data>\n  <data name=\"RPM\" xml:space=\"preserve\">\n    <value>RPM</value>\n  </data>\n  <data name=\"RSDeadzones\" xml:space=\"preserve\">\n    <value>右搖桿死區</value>\n  </data>\n  <data name=\"RTDeadzones\" xml:space=\"preserve\">\n    <value>右扳機(RT)死區</value>\n  </data>\n  <data name=\"RunOnStartup\" xml:space=\"preserve\">\n    <value>開機時自動執行</value>\n  </data>\n  <data name=\"ScalingQuality\" xml:space=\"preserve\">\n    <value>縮放品質</value>\n  </data>\n  <data name=\"ScreenPadDown\" xml:space=\"preserve\">\n    <value>第二觸控螢幕亮度降低</value>\n  </data>\n  <data name=\"ScreenPadUp\" xml:space=\"preserve\">\n    <value>第二觸控螢幕亮度提高</value>\n  </data>\n  <data name=\"Shutdown\" xml:space=\"preserve\">\n    <value>關機時</value>\n  </data>\n  <data name=\"Silent\" xml:space=\"preserve\">\n    <value>靜音</value>\n  </data>\n  <data name=\"Sleep\" xml:space=\"preserve\">\n    <value>睡眠時</value>\n  </data>\n  <data name=\"StandardGPUTooltip\" xml:space=\"preserve\">\n    <value>自動切換獨立顯卡以及整合式顯卡 (MS-Hybrid)</value>\n  </data>\n  <data name=\"StandardMode\" xml:space=\"preserve\">\n    <value>標準模式</value>\n  </data>\n  <data name=\"Start\" xml:space=\"preserve\">\n    <value>啟動</value>\n  </data>\n  <data name=\"StartingServices\" xml:space=\"preserve\">\n    <value>正在啟動服務</value>\n  </data>\n  <data name=\"StartupError\" xml:space=\"preserve\">\n    <value>啟動錯誤</value>\n  </data>\n  <data name=\"Stop\" xml:space=\"preserve\">\n    <value>停止</value>\n  </data>\n  <data name=\"StopGPUApps\" xml:space=\"preserve\">\n    <value>停止GPU相關程式</value>\n  </data>\n  <data name=\"StoppingServices\" xml:space=\"preserve\">\n    <value>正在停止服務</value>\n  </data>\n  <data name=\"ToggleAura\" xml:space=\"preserve\">\n    <value>切換 Aura 模式</value>\n  </data>\n  <data name=\"ToggleClamshellMode\" xml:space=\"preserve\">\n    <value>翻蓋模式 (蓋上筆電但有外接螢幕時，系統仍會持續運行)</value>\n  </data>\n  <data name=\"ToggleFnLock\" xml:space=\"preserve\">\n    <value>切換 Fn-Lock</value>\n  </data>\n  <data name=\"ToggleMiniled\" xml:space=\"preserve\">\n    <value>切換 mini-LED (若有支援)</value>\n  </data>\n  <data name=\"ToggleScreen\" xml:space=\"preserve\">\n    <value>切換螢幕</value>\n  </data>\n  <data name=\"ToggleTouchscreen\" xml:space=\"preserve\">\n    <value>切換螢幕觸控</value>\n  </data>\n  <data name=\"Touchscreen\" xml:space=\"preserve\">\n    <value>觸控螢幕</value>\n  </data>\n  <data name=\"Turbo\" xml:space=\"preserve\">\n    <value>極速</value>\n  </data>\n  <data name=\"TurnedOff\" xml:space=\"preserve\">\n    <value>已關閉</value>\n  </data>\n  <data name=\"TurnOffOnBattery\" xml:space=\"preserve\">\n    <value>電池模式時關閉</value>\n  </data>\n  <data name=\"UltimateGPUTooltip\" xml:space=\"preserve\">\n    <value>開啟獨顯輸出獲得最佳幀數</value>\n  </data>\n  <data name=\"UltimateMode\" xml:space=\"preserve\">\n    <value>獨顯輸出</value>\n  </data>\n  <data name=\"UndervoltingRisky\" xml:space=\"preserve\">\n    <value>降壓是一項實驗性且有風險的功能，若設定的值過低，可能造成系統不穩定甚至無預警關機，建議可先嘗試較小的降壓數值，並點擊\"套用\"來測試適合你的使用狀況</value>\n  </data>\n  <data name=\"Unmuted\" xml:space=\"preserve\">\n    <value>已取消靜音</value>\n  </data>\n  <data name=\"Updates\" xml:space=\"preserve\">\n    <value>更新驅動</value>\n  </data>\n  <data name=\"VersionLabel\" xml:space=\"preserve\">\n    <value>版本</value>\n  </data>\n  <data name=\"VibrationStrength\" xml:space=\"preserve\">\n    <value>震動強度</value>\n  </data>\n  <data name=\"VisualMode\" xml:space=\"preserve\">\n    <value>色域模式</value>\n  </data>\n  <data name=\"VisualModesHDR\" xml:space=\"preserve\">\n    <value>HDR開啟時不支援色域模式</value>\n  </data>\n  <data name=\"VisualModesScreen\" xml:space=\"preserve\">\n    <value>筆電螢幕闔上時不支援色域模式</value>\n  </data>\n  <data name=\"VolumeDown\" xml:space=\"preserve\">\n    <value>音量降低</value>\n  </data>\n  <data name=\"VolumeMute\" xml:space=\"preserve\">\n    <value>靜音</value>\n  </data>\n  <data name=\"VolumeUp\" xml:space=\"preserve\">\n    <value>音量增加</value>\n  </data>\n  <data name=\"WindowTop\" xml:space=\"preserve\">\n    <value>視窗置頂</value>\n  </data>\n  <data name=\"Zoom\" xml:space=\"preserve\">\n    <value>縮放</value>\n  </data>\n  <data name=\"Donate\" xml:space=\"preserve\">\n    <value>捐贈</value>\n  </data>\n  <data name=\"Legend\" xml:space=\"preserve\">\n    <value>Legend</value>\n  </data>\n  <data name=\"LegendGray\" xml:space=\"preserve\">\n    <value>無法檢查本機版本</value>\n    <comment>Can't check local version</comment>\n  </data>\n  <data name=\"LegendRed\" xml:space=\"preserve\">\n    <value>有可用的更新</value>\n    <comment>Update Available</comment>\n  </data>\n  <data name=\"LegendGreen\" xml:space=\"preserve\">\n    <value>已更新</value>\n    <comment>Updated</comment>\n  </data>\n  <data name=\"SlashBounce\" xml:space=\"preserve\">\n    <value>Bounce</value>\n  </data>\n  <data name=\"SlashMode\" xml:space=\"preserve\">\n    <value>Slash</value>\n  </data>\n  <data name=\"SlashLoading\" xml:space=\"preserve\">\n    <value>Loading</value>\n  </data>\n  <data name=\"SlashBitStream\" xml:space=\"preserve\">\n    <value>Bit Stream</value>\n  </data>\n  <data name=\"SlashTransmission\" xml:space=\"preserve\">\n    <value>Transmission</value>\n  </data>\n  <data name=\"SlashFlow\" xml:space=\"preserve\">\n    <value>Flow</value>\n  </data>\n  <data name=\"SlashFlux\" xml:space=\"preserve\">\n    <value>Flux</value>\n  </data>\n  <data name=\"SlashPhantom\" xml:space=\"preserve\">\n    <value>Phantom</value>\n  </data>\n  <data name=\"SlashSpectrum\" xml:space=\"preserve\">\n    <value>Spectrum</value>\n  </data>\n  <data name=\"SlashHazard\" xml:space=\"preserve\">\n    <value>Hazard</value>\n  </data>\n  <data name=\"SlashInterfacing\" xml:space=\"preserve\">\n    <value>Interfacing</value>\n  </data>\n  <data name=\"SlashRamp\" xml:space=\"preserve\">\n    <value>Ramp</value>\n  </data>\n  <data name=\"SlashGameOver\" xml:space=\"preserve\">\n    <value>Game Over</value>\n  </data>\n  <data name=\"SlashStart\" xml:space=\"preserve\">\n    <value>Start</value>\n  </data>\n  <data name=\"SlashBuzzer\" xml:space=\"preserve\">\n    <value>Buzzer</value>\n  </data>\n  <data name=\"SlashStatic\" xml:space=\"preserve\">\n    <value>Static</value>\n  </data>\n  <data name=\"SlashBatteryLevel\" xml:space=\"preserve\">\n    <value>Battery Level</value>\n  </data>\n  <data name=\"IntervalOff\" xml:space=\"preserve\">\n    <value>Interval Off</value>\n  </data>\n  <data name=\"IntervalSeconds\" xml:space=\"preserve\">\n    <value>間隔 {0}秒</value>\n  </data>\n  <data name=\"DisableDynamicLighting\" xml:space=\"preserve\">\n    <value>Please disable Windows &gt; Dynamic Lighting</value>\n  </data>\n  <data name=\"AmbientModeResources\" xml:space=\"preserve\">\n    <value>Ambient mode may increase resource usage</value>\n  </data>\n  <data name=\"MouseMotionSync\" xml:space=\"preserve\">\n    <value>動態同步</value>\n  </data>\n  <data name=\"MouseZoneMode\" xml:space=\"preserve\">\n    <value>Zone 模式</value>\n  </data>\n</root>"
  },
  {
    "path": "app/Properties/launchSettings.json",
    "content": "{\n  \"profiles\": {\n    \"GHelper\": {\n      \"commandName\": \"Project\"\n    }\n  }\n}"
  },
  {
    "path": "app/Ryzen/OpenLibSys.cs",
    "content": "﻿//-----------------------------------------------------------------------------\n//     Author : hiyohiyo\n//       Mail : hiyohiyo@crystalmark.info\n//        Web : http://openlibsys.org/\n//    License : The modified BSD license\n//\n//                     Copyright 2007-2009 OpenLibSys.org. All rights reserved.\n//-----------------------------------------------------------------------------\n// This is support library for WinRing0 1.3.x.\n\nusing System.Runtime.InteropServices;\n\nnamespace Ryzen\n{\n    public class Ols : IDisposable\n    {\n        const string dllNameX64 = \"WinRing0x64.dll\";\n        const string dllName = \"WinRing0.dll\";\n\n        // for this support library\n        public enum Status\n        {\n            NO_ERROR = 0,\n            DLL_NOT_FOUND = 1,\n            DLL_INCORRECT_VERSION = 2,\n            DLL_INITIALIZE_ERROR = 3,\n        }\n\n        // for WinRing0\n        public enum OlsDllStatus\n        {\n            OLS_DLL_NO_ERROR = 0,\n            OLS_DLL_UNSUPPORTED_PLATFORM = 1,\n            OLS_DLL_DRIVER_NOT_LOADED = 2,\n            OLS_DLL_DRIVER_NOT_FOUND = 3,\n            OLS_DLL_DRIVER_UNLOADED = 4,\n            OLS_DLL_DRIVER_NOT_LOADED_ON_NETWORK = 5,\n            OLS_DLL_UNKNOWN_ERROR = 9\n        }\n\n        // for WinRing0\n        public enum OlsDriverType\n        {\n            OLS_DRIVER_TYPE_UNKNOWN = 0,\n            OLS_DRIVER_TYPE_WIN_9X = 1,\n            OLS_DRIVER_TYPE_WIN_NT = 2,\n            OLS_DRIVER_TYPE_WIN_NT4 = 3,    // Obsolete\n            OLS_DRIVER_TYPE_WIN_NT_X64 = 4,\n            OLS_DRIVER_TYPE_WIN_NT_IA64 = 5\n        }\n\n        // for WinRing0\n        public enum OlsErrorPci : uint\n        {\n            OLS_ERROR_PCI_BUS_NOT_EXIST = 0xE0000001,\n            OLS_ERROR_PCI_NO_DEVICE = 0xE0000002,\n            OLS_ERROR_PCI_WRITE_CONFIG = 0xE0000003,\n            OLS_ERROR_PCI_READ_CONFIG = 0xE0000004\n        }\n\n        // Bus Number, Device Number and Function Number to PCI Device Address\n        public uint PciBusDevFunc(uint bus, uint dev, uint func)\n        {\n            return (bus & 0xFF) << 8 | (dev & 0x1F) << 3 | func & 7;\n        }\n\n        // PCI Device Address to Bus Number\n        public uint PciGetBus(uint address)\n        {\n            return address >> 8 & 0xFF;\n        }\n\n        // PCI Device Address to Device Number\n        public uint PciGetDev(uint address)\n        {\n            return address >> 3 & 0x1F;\n        }\n\n        // PCI Device Address to Function Number\n        public uint PciGetFunc(uint address)\n        {\n            return address & 7;\n        }\n\n        [DllImport(\"kernel32\")]\n        public extern static nint LoadLibrary(string lpFileName);\n\n\n        [DllImport(\"kernel32\", SetLastError = true)]\n        private static extern bool FreeLibrary(nint hModule);\n\n        [DllImport(\"kernel32\", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = false)]\n        private static extern nint GetProcAddress(nint hModule, [MarshalAs(UnmanagedType.LPStr)] string lpProcName);\n\n        private nint module = nint.Zero;\n        private uint status = (uint)Status.NO_ERROR;\n\n        public Ols()\n        {\n            string fileName;\n\n            if (nint.Size == 8)\n            {\n                fileName = dllNameX64;\n            }\n            else\n            {\n                fileName = dllName;\n            }\n\n            module = LoadLibrary(fileName);\n            if (module == nint.Zero)\n            {\n                status = (uint)Status.DLL_NOT_FOUND;\n            }\n            else\n            {\n\n                GetDllStatus = (_GetDllStatus)GetDelegate(\"GetDllStatus\", typeof(_GetDllStatus));\n                GetDllVersion = (_GetDllVersion)GetDelegate(\"GetDllVersion\", typeof(_GetDllVersion));\n                GetDriverVersion = (_GetDriverVersion)GetDelegate(\"GetDriverVersion\", typeof(_GetDriverVersion));\n                GetDriverType = (_GetDriverType)GetDelegate(\"GetDriverType\", typeof(_GetDriverType));\n\n                InitializeOls = (_InitializeOls)GetDelegate(\"InitializeOls\", typeof(_InitializeOls));\n                DeinitializeOls = (_DeinitializeOls)GetDelegate(\"DeinitializeOls\", typeof(_DeinitializeOls));\n\n                IsCpuid = (_IsCpuid)GetDelegate(\"IsCpuid\", typeof(_IsCpuid));\n                IsMsr = (_IsMsr)GetDelegate(\"IsMsr\", typeof(_IsMsr));\n                IsTsc = (_IsTsc)GetDelegate(\"IsTsc\", typeof(_IsTsc));\n                Hlt = (_Hlt)GetDelegate(\"Hlt\", typeof(_Hlt));\n                HltTx = (_HltTx)GetDelegate(\"HltTx\", typeof(_HltTx));\n                HltPx = (_HltPx)GetDelegate(\"HltPx\", typeof(_HltPx));\n                Rdmsr = (_Rdmsr)GetDelegate(\"Rdmsr\", typeof(_Rdmsr));\n                RdmsrTx = (_RdmsrTx)GetDelegate(\"RdmsrTx\", typeof(_RdmsrTx));\n                RdmsrPx = (_RdmsrPx)GetDelegate(\"RdmsrPx\", typeof(_RdmsrPx));\n                Wrmsr = (_Wrmsr)GetDelegate(\"Wrmsr\", typeof(_Wrmsr));\n                WrmsrTx = (_WrmsrTx)GetDelegate(\"WrmsrTx\", typeof(_WrmsrTx));\n                WrmsrPx = (_WrmsrPx)GetDelegate(\"WrmsrPx\", typeof(_WrmsrPx));\n                Rdpmc = (_Rdpmc)GetDelegate(\"Rdpmc\", typeof(_Rdpmc));\n                RdpmcTx = (_RdpmcTx)GetDelegate(\"RdpmcTx\", typeof(_RdpmcTx));\n                RdpmcPx = (_RdpmcPx)GetDelegate(\"RdpmcPx\", typeof(_RdpmcPx));\n                Cpuid = (_Cpuid)GetDelegate(\"Cpuid\", typeof(_Cpuid));\n                CpuidTx = (_CpuidTx)GetDelegate(\"CpuidTx\", typeof(_CpuidTx));\n                CpuidPx = (_CpuidPx)GetDelegate(\"CpuidPx\", typeof(_CpuidPx));\n                Rdtsc = (_Rdtsc)GetDelegate(\"Rdtsc\", typeof(_Rdtsc));\n                RdtscTx = (_RdtscTx)GetDelegate(\"RdtscTx\", typeof(_RdtscTx));\n                RdtscPx = (_RdtscPx)GetDelegate(\"RdtscPx\", typeof(_RdtscPx));\n\n                ReadIoPortByte = (_ReadIoPortByte)GetDelegate(\"ReadIoPortByte\", typeof(_ReadIoPortByte));\n                ReadIoPortWord = (_ReadIoPortWord)GetDelegate(\"ReadIoPortWord\", typeof(_ReadIoPortWord));\n                ReadIoPortDword = (_ReadIoPortDword)GetDelegate(\"ReadIoPortDword\", typeof(_ReadIoPortDword));\n                ReadIoPortByteEx = (_ReadIoPortByteEx)GetDelegate(\"ReadIoPortByteEx\", typeof(_ReadIoPortByteEx));\n                ReadIoPortWordEx = (_ReadIoPortWordEx)GetDelegate(\"ReadIoPortWordEx\", typeof(_ReadIoPortWordEx));\n                ReadIoPortDwordEx = (_ReadIoPortDwordEx)GetDelegate(\"ReadIoPortDwordEx\", typeof(_ReadIoPortDwordEx));\n\n                WriteIoPortByte = (_WriteIoPortByte)GetDelegate(\"WriteIoPortByte\", typeof(_WriteIoPortByte));\n                WriteIoPortWord = (_WriteIoPortWord)GetDelegate(\"WriteIoPortWord\", typeof(_WriteIoPortWord));\n                WriteIoPortDword = (_WriteIoPortDword)GetDelegate(\"WriteIoPortDword\", typeof(_WriteIoPortDword));\n                WriteIoPortByteEx = (_WriteIoPortByteEx)GetDelegate(\"WriteIoPortByteEx\", typeof(_WriteIoPortByteEx));\n                WriteIoPortWordEx = (_WriteIoPortWordEx)GetDelegate(\"WriteIoPortWordEx\", typeof(_WriteIoPortWordEx));\n                WriteIoPortDwordEx = (_WriteIoPortDwordEx)GetDelegate(\"WriteIoPortDwordEx\", typeof(_WriteIoPortDwordEx));\n\n                SetPciMaxBusIndex = (_SetPciMaxBusIndex)GetDelegate(\"SetPciMaxBusIndex\", typeof(_SetPciMaxBusIndex));\n                ReadPciConfigByte = (_ReadPciConfigByte)GetDelegate(\"ReadPciConfigByte\", typeof(_ReadPciConfigByte));\n                ReadPciConfigWord = (_ReadPciConfigWord)GetDelegate(\"ReadPciConfigWord\", typeof(_ReadPciConfigWord));\n                ReadPciConfigDword = (_ReadPciConfigDword)GetDelegate(\"ReadPciConfigDword\", typeof(_ReadPciConfigDword));\n                ReadPciConfigByteEx = (_ReadPciConfigByteEx)GetDelegate(\"ReadPciConfigByteEx\", typeof(_ReadPciConfigByteEx));\n                ReadPciConfigWordEx = (_ReadPciConfigWordEx)GetDelegate(\"ReadPciConfigWordEx\", typeof(_ReadPciConfigWordEx));\n                ReadPciConfigDwordEx = (_ReadPciConfigDwordEx)GetDelegate(\"ReadPciConfigDwordEx\", typeof(_ReadPciConfigDwordEx));\n                ReadPciConfigDwordEx64 = (_ReadPciConfigDwordEx64)GetDelegate(\"ReadPciConfigDwordEx\", typeof(_ReadPciConfigDwordEx64));\n                WritePciConfigByte = (_WritePciConfigByte)GetDelegate(\"WritePciConfigByte\", typeof(_WritePciConfigByte));\n                WritePciConfigWord = (_WritePciConfigWord)GetDelegate(\"WritePciConfigWord\", typeof(_WritePciConfigWord));\n                WritePciConfigDword = (_WritePciConfigDword)GetDelegate(\"WritePciConfigDword\", typeof(_WritePciConfigDword));\n                WritePciConfigByteEx = (_WritePciConfigByteEx)GetDelegate(\"WritePciConfigByteEx\", typeof(_WritePciConfigByteEx));\n                WritePciConfigWordEx = (_WritePciConfigWordEx)GetDelegate(\"WritePciConfigWordEx\", typeof(_WritePciConfigWordEx));\n                WritePciConfigDwordEx = (_WritePciConfigDwordEx)GetDelegate(\"WritePciConfigDwordEx\", typeof(_WritePciConfigDwordEx));\n                WritePciConfigDwordEx64 = (_WritePciConfigDwordEx64)GetDelegate(\"WritePciConfigDwordEx\", typeof(_WritePciConfigDwordEx64));\n                FindPciDeviceById = (_FindPciDeviceById)GetDelegate(\"FindPciDeviceById\", typeof(_FindPciDeviceById));\n                FindPciDeviceByClass = (_FindPciDeviceByClass)GetDelegate(\"FindPciDeviceByClass\", typeof(_FindPciDeviceByClass));\n\n                /*\n                ReadDmiMemory = (_ReadDmiMemory)GetDelegate(\"ReadDmiMemory\", typeof(_ReadDmiMemory));\n                ReadPhysicalMemory = (_ReadPhysicalMemory)GetDelegate(\"ReadPhysicalMemory\", typeof(_ReadPhysicalMemory));\n                WritePhysicalMemory = (_WritePhysicalMemory)GetDelegate(\"WritePhysicalMemory\", typeof(_WritePhysicalMemory));\n\t\t\t\t*/\n\n                if (!(\n                   GetDllStatus != null\n                && GetDllVersion != null\n                && GetDriverVersion != null\n                && GetDriverType != null\n                && InitializeOls != null\n                && DeinitializeOls != null\n                && IsCpuid != null\n                && IsMsr != null\n                && IsTsc != null\n                && Hlt != null\n                && HltTx != null\n                && HltPx != null\n                && Rdmsr != null\n                && RdmsrTx != null\n                && RdmsrPx != null\n                && Wrmsr != null\n                && WrmsrTx != null\n                && WrmsrPx != null\n                && Rdpmc != null\n                && RdpmcTx != null\n                && RdpmcPx != null\n                && Cpuid != null\n                && CpuidTx != null\n                && CpuidPx != null\n                && Rdtsc != null\n                && RdtscTx != null\n                && RdtscPx != null\n                && ReadIoPortByte != null\n                && ReadIoPortWord != null\n                && ReadIoPortDword != null\n                && ReadIoPortByteEx != null\n                && ReadIoPortWordEx != null\n                && ReadIoPortDwordEx != null\n                && WriteIoPortByte != null\n                && WriteIoPortWord != null\n                && WriteIoPortDword != null\n                && WriteIoPortByteEx != null\n                && WriteIoPortWordEx != null\n                && WriteIoPortDwordEx != null\n                && SetPciMaxBusIndex != null\n                && ReadPciConfigByte != null\n                && ReadPciConfigWord != null\n                && ReadPciConfigDword != null\n                && ReadPciConfigByteEx != null\n                && ReadPciConfigWordEx != null\n                && ReadPciConfigDwordEx != null\n                && ReadPciConfigDwordEx64 != null\n                && WritePciConfigByte != null\n                && WritePciConfigWord != null\n                && WritePciConfigDword != null\n                && WritePciConfigByteEx != null\n                && WritePciConfigWordEx != null\n                && WritePciConfigDwordEx != null\n                && WritePciConfigDwordEx64 != null\n                && FindPciDeviceById != null\n                && FindPciDeviceByClass != null\n                /*&& ReadDmiMemory != null\n                && ReadPhysicalMemory != null\n                && WritePhysicalMemory != null\n\t\t\t\t*/\n                ))\n                {\n                    status = (uint)Status.DLL_INCORRECT_VERSION;\n                }\n\n                if (InitializeOls() == 0)\n                {\n                    status = (uint)Status.DLL_INITIALIZE_ERROR;\n                }\n            }\n        }\n\n        public uint GetStatus()\n        {\n            return status;\n        }\n\n        public void Dispose()\n        {\n            if (module != nint.Zero)\n            {\n                DeinitializeOls();\n                FreeLibrary(module);\n                module = nint.Zero;\n            }\n        }\n\n        public Delegate GetDelegate(string procName, Type delegateType)\n        {\n            nint ptr = GetProcAddress(module, procName);\n            if (ptr != nint.Zero)\n            {\n                Delegate d = Marshal.GetDelegateForFunctionPointer(ptr, delegateType);\n                return d;\n            }\n\n            int result = Marshal.GetHRForLastWin32Error();\n            throw Marshal.GetExceptionForHR(result);\n        }\n\n        //-----------------------------------------------------------------------------\n        // DLL Information\n        //-----------------------------------------------------------------------------\n        public delegate uint _GetDllStatus();\n        public delegate uint _GetDllVersion(ref byte major, ref byte minor, ref byte revision, ref byte release);\n        public delegate uint _GetDriverVersion(ref byte major, ref byte minor, ref byte revision, ref byte release);\n        public delegate uint _GetDriverType();\n\n        public delegate int _InitializeOls();\n        public delegate void _DeinitializeOls();\n\n        public _GetDllStatus GetDllStatus = null;\n        public _GetDriverType GetDriverType = null;\n        public _GetDllVersion GetDllVersion = null;\n        public _GetDriverVersion GetDriverVersion = null;\n\n        public _InitializeOls InitializeOls = null;\n        public _DeinitializeOls DeinitializeOls = null;\n\n        //-----------------------------------------------------------------------------\n        // CPU\n        //-----------------------------------------------------------------------------\n        public delegate int _IsCpuid();\n        public delegate int _IsMsr();\n        public delegate int _IsTsc();\n        public delegate int _Hlt();\n        public delegate int _HltTx(nuint threadAffinityMask);\n        public delegate int _HltPx(nuint processAffinityMask);\n        public delegate int _Rdmsr(uint index, ref uint eax, ref uint edx);\n        public delegate int _RdmsrTx(uint index, ref uint eax, ref uint edx, nuint threadAffinityMask);\n        public delegate int _RdmsrPx(uint index, ref uint eax, ref uint edx, nuint processAffinityMask);\n        public delegate int _Wrmsr(uint index, uint eax, uint edx);\n        public delegate int _WrmsrTx(uint index, uint eax, uint edx, nuint threadAffinityMask);\n        public delegate int _WrmsrPx(uint index, uint eax, uint edx, nuint processAffinityMask);\n        public delegate int _Rdpmc(uint index, ref uint eax, ref uint edx);\n        public delegate int _RdpmcTx(uint index, ref uint eax, ref uint edx, nuint threadAffinityMask);\n        public delegate int _RdpmcPx(uint index, ref uint eax, ref uint edx, nuint processAffinityMask);\n        public delegate int _Cpuid(uint index, ref uint eax, ref uint ebx, ref uint ecx, ref uint edx);\n        public delegate int _CpuidTx(uint index, ref uint eax, ref uint ebx, ref uint ecx, ref uint edx, nuint threadAffinityMask);\n        public delegate int _CpuidPx(uint index, ref uint eax, ref uint ebx, ref uint ecx, ref uint edx, nuint processAffinityMask);\n        public delegate int _Rdtsc(ref uint eax, ref uint edx);\n        public delegate int _RdtscTx(ref uint eax, ref uint edx, nuint threadAffinityMask);\n        public delegate int _RdtscPx(ref uint eax, ref uint edx, nuint processAffinityMask);\n\n        public _IsCpuid IsCpuid = null;\n        public _IsMsr IsMsr = null;\n        public _IsTsc IsTsc = null;\n        public _Hlt Hlt = null;\n        public _HltTx HltTx = null;\n        public _HltPx HltPx = null;\n        public _Rdmsr Rdmsr = null;\n        public _RdmsrTx RdmsrTx = null;\n        public _RdmsrPx RdmsrPx = null;\n        public _Wrmsr Wrmsr = null;\n        public _WrmsrTx WrmsrTx = null;\n        public _WrmsrPx WrmsrPx = null;\n        public _Rdpmc Rdpmc = null;\n        public _RdpmcTx RdpmcTx = null;\n        public _RdpmcPx RdpmcPx = null;\n        public _Cpuid Cpuid = null;\n        public _CpuidTx CpuidTx = null;\n        public _CpuidPx CpuidPx = null;\n        public _Rdtsc Rdtsc = null;\n        public _RdtscTx RdtscTx = null;\n        public _RdtscPx RdtscPx = null;\n\n        //-----------------------------------------------------------------------------\n        // I/O\n        //-----------------------------------------------------------------------------\n        public delegate byte _ReadIoPortByte(ushort port);\n        public delegate ushort _ReadIoPortWord(ushort port);\n        public delegate uint _ReadIoPortDword(ushort port);\n        public _ReadIoPortByte ReadIoPortByte;\n        public _ReadIoPortWord ReadIoPortWord;\n        public _ReadIoPortDword ReadIoPortDword;\n\n        public delegate int _ReadIoPortByteEx(ushort port, ref byte value);\n        public delegate int _ReadIoPortWordEx(ushort port, ref ushort value);\n        public delegate int _ReadIoPortDwordEx(ushort port, ref uint value);\n        public _ReadIoPortByteEx ReadIoPortByteEx;\n        public _ReadIoPortWordEx ReadIoPortWordEx;\n        public _ReadIoPortDwordEx ReadIoPortDwordEx;\n\n        public delegate void _WriteIoPortByte(ushort port, byte value);\n        public delegate void _WriteIoPortWord(ushort port, ushort value);\n        public delegate void _WriteIoPortDword(ushort port, uint value);\n        public _WriteIoPortByte WriteIoPortByte;\n        public _WriteIoPortWord WriteIoPortWord;\n        public _WriteIoPortDword WriteIoPortDword;\n\n        public delegate int _WriteIoPortByteEx(ushort port, byte value);\n        public delegate int _WriteIoPortWordEx(ushort port, ushort value);\n        public delegate int _WriteIoPortDwordEx(ushort port, uint value);\n        public _WriteIoPortByteEx WriteIoPortByteEx;\n        public _WriteIoPortWordEx WriteIoPortWordEx;\n        public _WriteIoPortDwordEx WriteIoPortDwordEx;\n\n        //-----------------------------------------------------------------------------\n        // PCI\n        //-----------------------------------------------------------------------------\n        public delegate void _SetPciMaxBusIndex(byte max);\n        public _SetPciMaxBusIndex SetPciMaxBusIndex;\n\n        public delegate byte _ReadPciConfigByte(uint pciAddress, byte regAddress);\n        public delegate ushort _ReadPciConfigWord(uint pciAddress, byte regAddress);\n        public delegate uint _ReadPciConfigDword(uint pciAddress, byte regAddress);\n        public _ReadPciConfigByte ReadPciConfigByte;\n        public _ReadPciConfigWord ReadPciConfigWord;\n        public _ReadPciConfigDword ReadPciConfigDword;\n\n        public delegate int _ReadPciConfigByteEx(uint pciAddress, uint regAddress, ref byte value);\n        public delegate int _ReadPciConfigWordEx(uint pciAddress, uint regAddress, ref ushort value);\n        public delegate int _ReadPciConfigDwordEx(uint pciAddress, uint regAddress, ref uint value);\n        public _ReadPciConfigByteEx ReadPciConfigByteEx;\n        public _ReadPciConfigWordEx ReadPciConfigWordEx;\n        public _ReadPciConfigDwordEx ReadPciConfigDwordEx;\n\n\n        public delegate int _ReadPciConfigDwordEx64(uint pciAddress, uint regAddress, ref ulong value);\n        public _ReadPciConfigDwordEx64 ReadPciConfigDwordEx64;\n\n        public delegate void _WritePciConfigByte(uint pciAddress, byte regAddress, byte value);\n        public delegate void _WritePciConfigWord(uint pciAddress, byte regAddress, ushort value);\n        public delegate void _WritePciConfigDword(uint pciAddress, byte regAddress, uint value);\n        public _WritePciConfigByte WritePciConfigByte;\n        public _WritePciConfigWord WritePciConfigWord;\n        public _WritePciConfigDword WritePciConfigDword;\n\n        public delegate int _WritePciConfigByteEx(uint pciAddress, uint regAddress, byte value);\n        public delegate int _WritePciConfigWordEx(uint pciAddress, uint regAddress, ushort value);\n        public delegate int _WritePciConfigDwordEx(uint pciAddress, uint regAddress, uint value);\n        public _WritePciConfigByteEx WritePciConfigByteEx;\n        public _WritePciConfigWordEx WritePciConfigWordEx;\n        public _WritePciConfigDwordEx WritePciConfigDwordEx;\n\n        public delegate int _WritePciConfigDwordEx64(uint pciAddress, uint regAddress, ulong value);\n        public _WritePciConfigDwordEx64 WritePciConfigDwordEx64;\n\n        public delegate uint _FindPciDeviceById(ushort vendorId, ushort deviceId, byte index);\n        public delegate uint _FindPciDeviceByClass(byte baseClass, byte subClass, byte programIf, byte index);\n        public _FindPciDeviceById FindPciDeviceById;\n        public _FindPciDeviceByClass FindPciDeviceByClass;\n\n        //-----------------------------------------------------------------------------\n        // Physical Memory (unsafe)\n        //-----------------------------------------------------------------------------\n\n        /*public unsafe delegate uint _ReadDmiMemory(byte* buffer, uint count, uint unitSize);\n        public _ReadDmiMemory ReadDmiMemory;\n\n        public unsafe delegate uint _ReadPhysicalMemory(UIntPtr address, byte* buffer, uint count, uint unitSize);\n        public unsafe delegate uint _WritePhysicalMemory(UIntPtr address, byte* buffer, uint count, uint unitSize);\n\n        public _ReadPhysicalMemory ReadPhysicalMemory;\n        public _WritePhysicalMemory WritePhysicalMemory;\n\t\t*/\n    }\n}\n\n"
  },
  {
    "path": "app/Ryzen/RyzenControl.cs",
    "content": "﻿//\n// This is a optimised/simplified version of Ryzen System Management Unit from https://github.com/JamesCJ60/Universal-x86-Tuning-Utility\n// I do not take credit for the full functionality of the code (c)\n//\n\n\nusing GHelper.Helpers;\nusing System.Management;\nusing System.Net;\n\nnamespace Ryzen\n{\n    internal class RyzenControl\n    {\n\n        public static int MinCPUUV => AppConfig.Get(\"min_uv\", -40);\n        public static int MaxCPUUV => AppConfig.Get(\"max_uv\", 0);\n\n        public static int MinIGPUUV = AppConfig.Get(\"min_igpu_uv\", -30);\n        public static int MaxIGPUUV = AppConfig.Get(\"max_igpu_uv\", 0);\n\n        public static int MinTemp => AppConfig.Get(\"min_temp\", 75);\n        public const int MaxTemp = 98;\n        public const int DefaultTemp = 96;\n\n        public static int FAMID { get; protected set; }\n\n        public static string CPUModel = \"\";\n        public static string CPUName = \"\";\n\n        //Zen1/+ - -1\n        //RAVEN - 0\n        //PICASSO - 1\n        //DALI - 2\n        //RENOIR/LUCIENNE - 3\n        //MATISSE - 4\n        //VANGOGH - 5\n        //VERMEER - 6\n        //CEZANNE/BARCELO - 7\n        //REMBRANDT - 8\n        //PHEONIX - 9\n        //RAPHAEL/DRAGON RANGE - 10\n        //MENDOCINO - 11\n        //HAWKPOINT - 12\n        //STRIXPOINT - 13\n        //STRIXHALO - 14\n        //FIRERANGE - 15\n\n        public static void Init()\n        {\n            //Get CPU name\n\n            try\n            {\n                ManagementObjectSearcher myProcessorObject = new ManagementObjectSearcher(\"select * from Win32_Processor\");\n                foreach (ManagementObject obj in myProcessorObject.Get())\n                {\n                    CPUName = obj[\"Name\"].ToString();\n                    CPUModel = obj[\"Caption\"].ToString();\n                }\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine(ex.Message);\n            }\n\n            FAMID = 99999;\n\n            if (CPUModel.Contains(\"Model \" + Convert.ToString(1)) || CPUModel.Contains(\"Model \" + Convert.ToString(8)))\n            {\n                FAMID = -1; //Zen1/+ DT\n            }\n\n            if (CPUModel.Contains(\"Model \" + Convert.ToString(17)))\n            {\n                FAMID = 0; //RAVEN\n            }\n\n            if (CPUModel.Contains(\"Model \" + Convert.ToString(24)))\n            {\n                FAMID = 1; //PICASSO\n            }\n\n            if (CPUModel.Contains(\"Family \" + Convert.ToString(23)) && CPUModel.Contains(\"Model \" + Convert.ToString(32)))\n            {\n                FAMID = 2; //DALI\n            }\n\n            if (CPUModel.Contains(\"Model \" + Convert.ToString(33)))\n            {\n                FAMID = 6; //VERMEER\n            }\n\n            if (CPUModel.Contains(\"Model \" + Convert.ToString(96)) || CPUModel.Contains(\"Model \" + Convert.ToString(104)))\n            {\n                FAMID = 3; //RENOIR/LUCIENNE\n            }\n\n            if (CPUModel.Contains(\"Model \" + Convert.ToString(144)))\n            {\n                FAMID = 5; //VANGOGH\n            }\n\n            if (CPUModel.Contains(\"Model \" + Convert.ToString(80)))\n            {\n                FAMID = 7; //CEZANNE/BARCELO\n            }\n\n            if (CPUModel.Contains(\"Family \" + Convert.ToString(25)) && (CPUModel.Contains(\"Model \" + Convert.ToString(63)) || CPUModel.Contains(\"Model \" + Convert.ToString(68))))\n            {\n                FAMID = 8; //REMBRANDT\n            }\n\n            if (CPUModel.Contains(\"Model \" + Convert.ToString(116)) || CPUModel.Contains(\"Model \" + Convert.ToString(120)))\n            {\n                FAMID = 9; //PHEONIX \n            }\n\n            if (CPUModel.Contains(\"Model \" + Convert.ToString(97)))\n            {\n                FAMID = 10; //RAPHAEL/DRAGON RANGE\n            }\n\n            if (CPUModel.Contains(\"Model \" + Convert.ToString(160)))\n            {\n                FAMID = 11; //MENDOCINO \n            }\n\n            if (CPUModel.Contains(\"Model \" + Convert.ToString(117)))\n            {\n                FAMID = 12; //HAWKPOINT \n            }\n\n            if (CPUModel.Contains(\"Family \" + Convert.ToString(26)) && CPUModel.Contains(\"Model \" + Convert.ToString(36)))\n            {\n                FAMID = 13; //STRIXPOINT \n            }\n\n            if (CPUModel.Contains(\"Family \" + Convert.ToString(26)) && CPUModel.Contains(\"Model \" + Convert.ToString(112)))\n            {\n                FAMID = 14; //STRIXHALO \n            }\n\n            if (CPUModel.Contains(\"Family \" + Convert.ToString(26)) && CPUModel.Contains(\"Model \" + Convert.ToString(68)) && CPUName.Contains(\"HX\"))\n            {\n                FAMID = 15; //FIRERANGE \n            }\n\n            Logger.WriteLine($\"CPU: {FAMID} - {CPUName} - {CPUModel}\");\n\n            SetAddresses();\n        }\n\n        public static bool IsAMD()\n        {\n            if (CPUName.Length == 0) Init();\n            return CPUName.Contains(\"AMD\") || CPUName.Contains(\"Ryzen\") || CPUName.Contains(\"Athlon\") || CPUName.Contains(\"Radeon\") || CPUName.Contains(\"AMD Custom APU 0405\");\n        }\n\n        public static bool IsSupportedUV()\n        {\n            if (CPUName.Length == 0) Init();\n            return CPUName.Contains(\"RYZEN AI MAX\") || CPUName.Contains(\"Ryzen AI 9\") || CPUName.Contains(\"Ryzen 9\") || CPUName.Contains(\"4900H\") || CPUName.Contains(\"4800H\") || CPUName.Contains(\"4600H\");\n        }\n\n        public static bool IsSupportedUViGPU()\n        {\n            if (CPUName.Length == 0) Init();\n            return CPUName.Contains(\"RYZEN AI MAX\") || CPUName.Contains(\"6900H\") || CPUName.Contains(\"7945H\") || CPUName.Contains(\"7845H\");\n        }\n\n        public static bool IsRingExsists()\n        {\n            string exeDir = Path.GetDirectoryName(Application.ExecutablePath);\n            return File.Exists(exeDir + \"\\\\\" + \"WinRing0x64.dll\") && File.Exists(exeDir + \"\\\\\" + \"WinRing0x64.sys\");\n        }\n\n        public static void DownloadRing()\n        {\n            //var appVersion = new Version(Assembly.GetExecutingAssembly().GetName().Version.ToString());\n            //string requestUri = \"https://github.com/seerge/g-helper/releases/download/v\" + appVersion.Major + \".\" + appVersion.Minor + \"/PluginAdvancedSettings.zip\";\n            string requestUri = \"https://github.com/seerge/g-helper/releases/download/v0.150/PluginAdvancedSettings.zip\";\n\n            Uri uri = new Uri(requestUri);\n\n            string exeDir = Path.GetDirectoryName(Application.ExecutablePath);\n            string zipName = Path.GetFileName(uri.LocalPath);\n            string zipLocation = exeDir + \"\\\\\" + zipName;\n\n            using (WebClient client = new WebClient())\n            {\n                Logger.WriteLine(requestUri);\n                Logger.WriteLine(exeDir);\n                Logger.WriteLine(zipName);\n\n                try\n                {\n                    client.DownloadFile(uri, zipLocation);\n                }\n                catch (Exception ex)\n                {\n                    Logger.WriteLine(ex.Message);\n                    Logger.WriteLine(ex.ToString());\n                    if (!ProcessHelper.IsUserAdministrator() && !ex.Message.Contains(\"remote server\")) ProcessHelper.RunAsAdmin(\"uv\");\n                    return;\n                }\n\n                try\n                {\n                    System.IO.Compression.ZipFile.ExtractToDirectory(zipLocation, exeDir, overwriteFiles: true);\n                    File.Delete(zipLocation);\n                    ProcessHelper.RunAsAdmin(\"uv\", true);\n                }\n                catch (Exception ex)\n                {\n                    Logger.WriteLine(ex.ToString());\n                }\n            }\n        }\n\n        public static void SetAddresses()\n        {\n\n            Smu.SMU_PCI_ADDR = 0x00000000;\n            Smu.SMU_OFFSET_ADDR = 0xB8;\n            Smu.SMU_OFFSET_DATA = 0xBC;\n\n            if (FAMID == -1)\n            {\n                Smu.MP1_ADDR_MSG = 0X3B10528;\n                Smu.MP1_ADDR_RSP = 0X3B10564;\n                Smu.MP1_ADDR_ARG = 0X3B10598;\n\n                Smu.PSMU_ADDR_MSG = 0x3B1051C;\n                Smu.PSMU_ADDR_RSP = 0X3B10568;\n                Smu.PSMU_ADDR_ARG = 0X3B10590;\n            }\n\n\n            if (FAMID == 0 || FAMID == 1 || FAMID == 2 || FAMID == 3 || FAMID == 7)\n            {\n                Smu.MP1_ADDR_MSG = 0x3B10528;\n                Smu.MP1_ADDR_RSP = 0x3B10564;\n                Smu.MP1_ADDR_ARG = 0x3B10998;\n\n                Smu.PSMU_ADDR_MSG = 0x3B10A20;\n                Smu.PSMU_ADDR_RSP = 0x3B10A80;\n                Smu.PSMU_ADDR_ARG = 0x3B10A88;\n            }\n            else if (FAMID == 5 || FAMID == 8 || FAMID == 9 || FAMID == 11 || FAMID == 12 || FAMID == 14)\n            {\n                Smu.MP1_ADDR_MSG = 0x3B10528;\n                Smu.MP1_ADDR_RSP = 0x3B10578;\n                Smu.MP1_ADDR_ARG = 0x3B10998;\n\n                Smu.PSMU_ADDR_MSG = 0x3B10a20;\n                Smu.PSMU_ADDR_RSP = 0x3B10a80;\n                Smu.PSMU_ADDR_ARG = 0x3B10a88;\n            }\n            else if (FAMID == 13)\n            {\n                Smu.MP1_ADDR_MSG = 0x3B10928;\n                Smu.MP1_ADDR_RSP = 0x3B10978;\n                Smu.MP1_ADDR_ARG = 0x3B10998;\n\n                Smu.PSMU_ADDR_MSG = 0x3B10a20;\n                Smu.PSMU_ADDR_RSP = 0x3B10a80;\n                Smu.PSMU_ADDR_ARG = 0x3B10a88;\n            }\n            else if (FAMID == 4 || FAMID == 6)\n            {\n                Smu.MP1_ADDR_MSG = 0x3B10530;\n                Smu.MP1_ADDR_RSP = 0x3B1057C;\n                Smu.MP1_ADDR_ARG = 0x3B109C4;\n\n                Smu.PSMU_ADDR_MSG = 0x3B10524;\n                Smu.PSMU_ADDR_RSP = 0x3B10570;\n                Smu.PSMU_ADDR_ARG = 0x3B10A40;\n            }\n            else if (FAMID == 10 || FAMID == 15)\n            {\n                Smu.MP1_ADDR_MSG = 0x3B10530;\n                Smu.MP1_ADDR_RSP = 0x3B1057C;\n                Smu.MP1_ADDR_ARG = 0x3B109C4;\n\n                Smu.PSMU_ADDR_MSG = 0x03B10524;\n                Smu.PSMU_ADDR_RSP = 0x03B10570;\n                Smu.PSMU_ADDR_ARG = 0x03B10A40;\n            }\n            else\n            {\n                Smu.MP1_ADDR_MSG = 0;\n                Smu.MP1_ADDR_RSP = 0;\n                Smu.MP1_ADDR_ARG = 0;\n\n                Smu.PSMU_ADDR_MSG = 0;\n                Smu.PSMU_ADDR_RSP = 0;\n                Smu.PSMU_ADDR_ARG = 0;\n            }\n\n\n        }\n    }\n}\n"
  },
  {
    "path": "app/Ryzen/RyzenSmu.cs",
    "content": "﻿//\n// This is a optimised/simplified version of Ryzen System Management Unit from https://github.com/JamesCJ60/Universal-x86-Tuning-Utility\n// I do not take credit for the full functionality of the code (c)\n//\n\n[assembly: CLSCompliant(false)]\n\n\nnamespace Ryzen\n{\n    class Smu\n    {\n\n        public enum Status : int\n        {\n            BAD = 0x0,\n            OK = 0x1,\n            FAILED = 0xFF,\n            UNKNOWN_CMD = 0xFE,\n            CMD_REJECTED_PREREQ = 0xFD,\n            CMD_REJECTED_BUSY = 0xFC\n        }\n\n        private static readonly Dictionary<Status, string> status = new Dictionary<Status, string>()\n        {\n            { Status.BAD, \"BAD\" },\n            { Status.OK, \"OK\" },\n            { Status.FAILED, \"Failed\" },\n            { Status.UNKNOWN_CMD, \"Unknown Command\" },\n            { Status.CMD_REJECTED_PREREQ, \"CMD Rejected Prereq\" },\n            { Status.CMD_REJECTED_BUSY, \"CMD Rejected Busy\" }\n        };\n\n\n\n        Ols RyzenNbAccesss;\n\n\n        public Smu(bool EnableDebug)\n        {\n            ShowDebug = EnableDebug;\n            RyzenNbAccesss = new Ols();\n\n            // Check WinRing0 status\n            switch (RyzenNbAccesss.GetDllStatus())\n            {\n                case (uint)Ols.OlsDllStatus.OLS_DLL_NO_ERROR:\n                    if (ShowDebug)\n                    {\n                        //MessageBox.Show(\"Ols Dll is OK.\", \"Ols.OlsDllStatus:\");\n                    }\n                    break;\n                case (uint)Ols.OlsDllStatus.OLS_DLL_DRIVER_NOT_LOADED:\n                    //MessageBox.Show(\"WinRing OLS_DRIVER_NOT_LOADED\", \"Ols.OlsDllStatus:\");\n                    throw new ApplicationException(\"WinRing OLS_DRIVER_NOT_LOADED\");\n\n                case (uint)Ols.OlsDllStatus.OLS_DLL_UNSUPPORTED_PLATFORM:\n                    //MessageBox.Show(\"WinRing OLS_UNSUPPORTED_PLATFORM\", \"Ols.OlsDllStatus:\");\n                    throw new ApplicationException(\"WinRing OLS_UNSUPPORTED_PLATFORM\");\n\n                case (uint)Ols.OlsDllStatus.OLS_DLL_DRIVER_NOT_FOUND:\n                    //MessageBox.Show(\"WinRing OLS_DLL_DRIVER_NOT_FOUND\", \"Ols.OlsDllStatus:\");\n                    throw new ApplicationException(\"WinRing OLS_DLL_DRIVER_NOT_FOUND\");\n\n                case (uint)Ols.OlsDllStatus.OLS_DLL_DRIVER_UNLOADED:\n                    //MessageBox.Show(\"WinRing OLS_DLL_DRIVER_UNLOADED\", \"Ols.OlsDllStatus:\");\n                    throw new ApplicationException(\"WinRing OLS_DLL_DRIVER_UNLOADED\");\n\n                case (uint)Ols.OlsDllStatus.OLS_DLL_DRIVER_NOT_LOADED_ON_NETWORK:\n                    //MessageBox.Show(\"WinRing DRIVER_NOT_LOADED_ON_NETWORK\", \"Ols.OlsDllStatus:\");\n                    throw new ApplicationException(\"WinRing DRIVER_NOT_LOADED_ON_NETWORK\");\n\n                case (uint)Ols.OlsDllStatus.OLS_DLL_UNKNOWN_ERROR:\n                    //MessageBox.Show(\"WinRing OLS_DLL_UNKNOWN_ERROR\", \"Ols.OlsDllStatus:\");\n                    throw new ApplicationException(\"WinRing OLS_DLL_UNKNOWN_ERROR\");\n            }\n\n        }\n\n        public void Initialize()\n        {\n            amdSmuMutex = new Mutex();\n            RyzenNbAccesss.InitializeOls();\n\n            // Check WinRing0 status\n            switch (RyzenNbAccesss.GetStatus())\n            {\n                case (uint)Ols.Status.NO_ERROR:\n                    if (ShowDebug)\n                    {\n                        //MessageBox.Show(\"Ols is OK.\", \"Ols.Status:\");\n                        ShowDebug = false;\n                    }\n                    break;\n                case (uint)Ols.Status.DLL_NOT_FOUND:\n                    //MessageBox.Show(\"WinRing Status: DLL_NOT_FOUND\", \"Ols.Status:\");\n                    throw new ApplicationException(\"WinRing DLL_NOT_FOUND\");\n                    break;\n                case (uint)Ols.Status.DLL_INCORRECT_VERSION:\n                    //MessageBox.Show(\"WinRing Status: DLL_INCORRECT_VERSION\", \"Ols.Status:\");\n                    throw new ApplicationException(\"WinRing DLL_INCORRECT_VERSION\");\n                    break;\n                case (uint)Ols.Status.DLL_INITIALIZE_ERROR:\n                    //MessageBox.Show(\"WinRing Status: DLL_INITIALIZE_ERROR\", \"Ols.Status:\");\n                    throw new ApplicationException(\"WinRing DLL_INITIALIZE_ERROR\");\n                    break;\n                default:\n                    break;\n            }\n        }\n\n\n        public void Deinitialize()\n        {\n            RyzenNbAccesss.DeinitializeOls();\n        }\n\n        public static uint SMU_PCI_ADDR { get; set; }\n        public static uint SMU_OFFSET_ADDR { get; set; }\n        public static uint SMU_OFFSET_DATA { get; set; }\n\n        public static uint MP1_ADDR_MSG { get; set; }\n        public static uint MP1_ADDR_RSP { get; set; }\n        public static uint MP1_ADDR_ARG { get; set; }\n\n        public static uint PSMU_ADDR_MSG { get; set; }\n        public static uint PSMU_ADDR_RSP { get; set; }\n        public static uint PSMU_ADDR_ARG { get; set; }\n        public static uint[] args { get; set; }\n\n        public bool ShowDebug { get; set; }\n\n        private static Mutex amdSmuMutex;\n        private const ushort SMU_TIMEOUT = 8192;\n\n        public Status SendMp1(uint message, ref uint[] arguments)\n        {\n            var result = SendMsg(MP1_ADDR_MSG, MP1_ADDR_RSP, MP1_ADDR_ARG, message, ref arguments);\n            //Logger.WriteLine($\"RyzenMP1:{message} {arguments[0]} {result}\");\n            return result;\n        }\n\n        public Status SendPsmu(uint message, ref uint[] arguments)\n        {\n            var result =  SendMsg(PSMU_ADDR_MSG, PSMU_ADDR_RSP, PSMU_ADDR_ARG, message, ref arguments);\n            //Logger.WriteLine($\"RyzenPSMU:{message} {arguments[0]} {result}\");\n            return result;\n        }\n\n\n        public Status SendMsg(uint SMU_ADDR_MSG, uint SMU_ADDR_RSP, uint SMU_ADDR_ARG, uint msg, ref uint[] args)\n        {\n            ushort timeout = SMU_TIMEOUT;\n            uint[] cmdArgs = new uint[6];\n            int argsLength = args.Length;\n            uint status = 0;\n\n            if (argsLength > cmdArgs.Length)\n                argsLength = cmdArgs.Length;\n\n            for (int i = 0; i < argsLength; ++i)\n                cmdArgs[i] = args[i];\n\n            if (amdSmuMutex.WaitOne(5000))\n            {\n                // Clear response register\n                bool temp;\n                do\n                    temp = SmuWriteReg(SMU_ADDR_RSP, 0);\n                while (!temp && --timeout > 0);\n\n                if (timeout == 0)\n                {\n                    amdSmuMutex.ReleaseMutex();\n                    SmuReadReg(SMU_ADDR_RSP, ref status);\n                    return (Status)status;\n                }\n\n                // Write data\n                for (int i = 0; i < cmdArgs.Length; ++i)\n                    SmuWriteReg(SMU_ADDR_ARG + (uint)(i * 4), cmdArgs[i]);\n\n                // Send message\n                SmuWriteReg(SMU_ADDR_MSG, msg);\n\n                // Wait done\n                if (!SmuWaitDone(SMU_ADDR_RSP))\n                {\n                    amdSmuMutex.ReleaseMutex();\n                    SmuReadReg(SMU_ADDR_RSP, ref status);\n                    return (Status)status;\n                }\n\n                // Read back args\n                for (int i = 0; i < args.Length; ++i)\n                    SmuReadReg(SMU_ADDR_ARG + (uint)(i * 4), ref args[i]);\n            }\n\n            amdSmuMutex.ReleaseMutex();\n            SmuReadReg(SMU_ADDR_RSP, ref status);\n\n            return (Status)status;\n        }\n\n\n        public bool SmuWaitDone(uint SMU_ADDR_RSP)\n        {\n            bool res;\n            ushort timeout = SMU_TIMEOUT;\n            uint data = 0;\n\n            do\n                res = SmuReadReg(SMU_ADDR_RSP, ref data);\n            while ((!res || data != 1) && --timeout > 0);\n\n            if (timeout == 0 || data != 1) res = false;\n\n            return res;\n        }\n\n\n        private bool SmuWriteReg(uint addr, uint data)\n        {\n            if (RyzenNbAccesss.WritePciConfigDwordEx(SMU_PCI_ADDR, SMU_OFFSET_ADDR, addr) == 1)\n            {\n                return RyzenNbAccesss.WritePciConfigDwordEx(SMU_PCI_ADDR, SMU_OFFSET_DATA, data) == 1;\n            }\n            return false;\n        }\n\n        private bool SmuReadReg(uint addr, ref uint data)\n        {\n            if (RyzenNbAccesss.WritePciConfigDwordEx(SMU_PCI_ADDR, SMU_OFFSET_ADDR, addr) == 1)\n            {\n                return RyzenNbAccesss.ReadPciConfigDwordEx(SMU_PCI_ADDR, SMU_OFFSET_DATA, ref data) == 1;\n            }\n            return false;\n        }\n\n\n\n    }\n}\n"
  },
  {
    "path": "app/Ryzen/SendCommand.cs",
    "content": "﻿//\n// This is a optimised/simplified version of Ryzen System Management Unit from https://github.com/JamesCJ60/Universal-x86-Tuning-Utility\n// I do not take credit for the full functionality of the code (c)\n//\n\n\nnamespace Ryzen\n{\n    internal class SendCommand\n    {\n\n        //RAVEN - 0\n        //PICASSO - 1\n        //DALI - 2\n        //RENOIR/LUCIENNE - 3\n        //MATISSE - 4\n        //VANGOGH - 5\n        //VERMEER - 6\n        //CEZANNE/BARCELO - 7\n        //REMBRANDT - 8\n        //PHEONIX - 9\n        //RAPHAEL/DRAGON RANGE - 10\n        //MENDOCINO - 11\n        //HAWKPOINT - 12\n        //STRIXPOINT - 13\n        //STRIXHALO - 14\n        //FIRERANGE - 15\n\n        public static Smu RyzenAccess = new Smu(false);\n        public static int FAMID = RyzenControl.FAMID;\n\n\n        //STAMP Limit\n        public static Smu.Status? set_stapm_limit(uint value)\n        {\n            RyzenAccess.Initialize();\n            uint[] Args = new uint[6];\n            Args[0] = value;\n            Smu.Status? result = null;\n\n            switch (FAMID)\n            {\n                case 0:\n                case 1:\n                case 2:\n                    result = RyzenAccess.SendMp1(0x1a, ref Args);\n                    break;\n                case 3:\n                case 5:\n                case 7:\n                case 8:\n                case 9:\n                case 11:\n                case 12:\n                case 13:\n                    result = RyzenAccess.SendMp1(0x14, ref Args);\n                    result = RyzenAccess.SendPsmu(0x31, ref Args);\n                    break;\n                default:\n                    break;\n            }\n\n            RyzenAccess.Deinitialize();\n            return result;\n            \n        }\n\n        //Fast Limit\n        public static Smu.Status? set_fast_limit(uint value)\n        {\n            RyzenAccess.Initialize();\n            uint[] Args = new uint[6];\n            Args[0] = value;\n            Smu.Status? result = null;\n\n            switch (FAMID)\n            {\n                case 0:\n                case 1:\n                case 2:\n                    result = RyzenAccess.SendMp1(0x1b, ref Args);\n                    break;\n                case 3:\n                case 5:\n                case 7:\n                case 8:\n                case 9:\n                case 11:\n                case 12:\n                case 13:\n                    result = RyzenAccess.SendMp1(0x15, ref Args);\n                    result = RyzenAccess.SendPsmu(0x32, ref Args);\n                    break;\n                default:\n                    break;\n            }\n            RyzenAccess.Deinitialize();\n            return result;\n        }\n\n        //Slow Limit\n        public static Smu.Status? set_slow_limit(uint value)\n        {\n            RyzenAccess.Initialize();\n            uint[] Args = new uint[6];\n            Args[0] = value;\n            Smu.Status? result = null;\n            \n            switch (FAMID)\n            {\n                case 0:\n                case 1:\n                case 2:\n                    result = RyzenAccess.SendMp1(0x1c, ref Args);\n                    break;\n                case 3:\n                case 5:\n                case 7:\n                case 8:\n                case 9:\n                case 11:\n                case 12:\n                case 13:\n                    result = RyzenAccess.SendMp1(0x16, ref Args);\n                    result = RyzenAccess.SendPsmu(0x33, ref Args);\n                    result = RyzenAccess.SendPsmu(0x34, ref Args);\n                    break;\n                default:\n                    break;\n            }\n            RyzenAccess.Deinitialize();\n            return result;\n        }\n\n\n        //TCTL Temp Limit\n        public static Smu.Status? set_tctl_temp(uint value)\n        {\n            RyzenAccess.Initialize();\n            uint[] Args = new uint[6];\n            Args[0] = value;\n\n            Smu.Status? result = null;\n\n            switch (FAMID)\n            {\n                case -1:\n                    result = RyzenAccess.SendPsmu(0x68, ref Args);\n                    break;\n                case 0:\n                case 1:\n                case 2:\n                    result = RyzenAccess.SendMp1(0x1f, ref Args);\n                    break;\n                case 3:\n                case 5:\n                case 7:\n                case 8:\n                case 9:\n                case 11:\n                case 12:\n                case 13:\n                case 14:\n                    result = RyzenAccess.SendMp1(0x19, ref Args);\n                    break;\n                case 4:\n                case 6:\n                    result = RyzenAccess.SendMp1(0x23, ref Args);\n                    result = RyzenAccess.SendPsmu(0x56, ref Args);\n                    break;\n                case 10:\n                case 15:\n                    result = RyzenAccess.SendMp1(0x3f, ref Args);\n                    result = RyzenAccess.SendPsmu(0x59, ref Args);\n                    break;\n                default:\n                    break;\n            }\n\n            RyzenAccess.Deinitialize();\n            return result;\n        }\n\n        //Set All Core Curve Optimiser\n        public static Smu.Status? set_coall(int value)\n        {\n\n            uint uvalue = Convert.ToUInt32(0x100000 - (uint)(-1 * value));\n\n            RyzenAccess.Initialize();\n            uint[] Args = new uint[6];\n            Args[0] = uvalue;\n\n            Smu.Status? result = null;\n\n            switch (FAMID)\n            {\n                case 3:\n                case 7:\n                    result = RyzenAccess.SendMp1(0x55, ref Args);\n                    result = RyzenAccess.SendPsmu(0xB1, ref Args);\n                    break;\n                case 4:\n                case 6:\n                    result = RyzenAccess.SendMp1(0x36, ref Args);\n                    result = RyzenAccess.SendPsmu(0xB, ref Args);\n                    break;\n                case 5:\n                case 8:\n                case 9:\n                case 11:\n                case 12:\n                case 13:\n                    result = RyzenAccess.SendPsmu(0x5D, ref Args);\n                    break;\n                case 14:\n                    result = RyzenAccess.SendMp1(0x4C, ref Args);\n                    result = RyzenAccess.SendPsmu(0x5D, ref Args);\n                    break;\n                case 10:\n                case 15:\n                    result = RyzenAccess.SendPsmu(0x7, ref Args);\n                    break;\n                default:\n                    break;\n            }\n\n            RyzenAccess.Deinitialize();\n            return result;\n\n        }\n\n\n        //Set iGPU Curve Optimiser\n        public static Smu.Status? set_cogfx(int value)\n        {\n\n            uint uvalue = Convert.ToUInt32(0x100000 - (uint)(-1 * value));\n\n            RyzenAccess.Initialize();\n            uint[] Args = new uint[6];\n            Args[0] = uvalue;\n\n            Smu.Status? result = null;\n\n            switch (FAMID)\n            {\n                case 3:\n                case 7:\n                    result = RyzenAccess.SendMp1(0x64, ref Args);\n                    result = RyzenAccess.SendPsmu(0x57, ref Args);\n                    break;\n                case 5:\n                case 8:\n                case 9:\n                case 11:\n                case 12:\n                case 13:\n                case 14:\n                    result = RyzenAccess.SendPsmu(0xb7, ref Args);\n                    break;\n                default:\n                    break;\n            }\n\n            RyzenAccess.Deinitialize();\n            return result;\n        }\n\n\n    }\n}\n"
  },
  {
    "path": "app/Settings.Designer.cs",
    "content": "﻿using GHelper.UI;\n\nnamespace GHelper\n{\n    partial class SettingsForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            panelMatrix = new Panel();\n            panelMatrixAuto = new Panel();\n            checkMatrixLid = new CheckBox();\n            checkMatrix = new CheckBox();\n            tableLayoutMatrix = new TableLayoutPanel();\n            comboMatrix = new RComboBox();\n            comboMatrixRunning = new RComboBox();\n            comboInterval = new RComboBox();\n            buttonMatrix = new RButton();\n            panelMatrixTitle = new Panel();\n            pictureMatrix = new PictureBox();\n            labelMatrix = new Label();\n            panelBattery = new Panel();\n            buttonBatteryFull = new RButton();\n            sliderBattery = new Slider();\n            panelBatteryTitle = new Panel();\n            labelBattery = new Label();\n            pictureBattery = new PictureBox();\n            labelBatteryTitle = new Label();\n            panelFooter = new Panel();\n            tableButtons = new TableLayoutPanel();\n            buttonDonate = new RBadgeButton();\n            buttonQuit = new RButton();\n            buttonUpdates = new RButton();\n            checkStartup = new CheckBox();\n            panelPerformance = new Panel();\n            tablePerf = new TableLayoutPanel();\n            buttonSilent = new RButton();\n            buttonBalanced = new RButton();\n            buttonTurbo = new RButton();\n            buttonFans = new RButton();\n            panelCPUTitle = new Panel();\n            picturePerf = new PictureBox();\n            labelPerf = new Label();\n            labelCPUFan = new Label();\n            panelGPU = new Panel();\n            labelTipGPU = new Label();\n            tableAMD = new TableLayoutPanel();\n            buttonAutoTDP = new RButton();\n            buttonOverlay = new RButton();\n            buttonFPS = new RButton();\n            tableGPU = new TableLayoutPanel();\n            buttonStopGPU = new RButton();\n            buttonEco = new RButton();\n            buttonStandard = new RButton();\n            buttonXGM = new RButton();\n            buttonOptimized = new RButton();\n            buttonUltimate = new RButton();\n            panelGPUTitle = new Panel();\n            pictureGPU = new PictureBox();\n            labelGPU = new Label();\n            labelGPUFan = new Label();\n            panelScreen = new Panel();\n            labelTipScreen = new Label();\n            tableScreen = new TableLayoutPanel();\n            buttonScreenAuto = new RButton();\n            button60Hz = new RButton();\n            button120Hz = new RButton();\n            buttonMiniled = new RButton();\n            buttonFHD = new RButton();\n            panelScreenTitle = new Panel();\n            labelMidFan = new Label();\n            pictureScreen = new PictureBox();\n            labelSreen = new Label();\n            panelKeyboard = new Panel();\n            labelBacklight = new Label();\n            tableLayoutKeyboard = new TableLayoutPanel();\n            buttonKeyboard = new RButton();\n            panelColor = new Panel();\n            pictureColor2 = new PictureBox();\n            pictureColor = new PictureBox();\n            buttonKeyboardColor = new RButton();\n            comboKeyboard = new RComboBox();\n            panelKeyboardTitle = new Panel();\n            buttonFnLock = new RButton();\n            pictureKeyboard = new PictureBox();\n            labelKeyboard = new Label();\n            panelStartup = new Panel();\n            labelCharge = new Label();\n            panelPeripherals = new Panel();\n            tableLayoutPeripherals = new TableLayoutPanel();\n            buttonPeripheral3 = new RButton();\n            buttonPeripheral2 = new RButton();\n            buttonPeripheral1 = new RButton();\n            panelAlly = new Panel();\n            tableLayoutAlly = new TableLayoutPanel();\n            buttonController = new RButton();\n            buttonBacklight = new RButton();\n            buttonControllerMode = new RButton();\n            panelAllyTitle = new Panel();\n            pictureAlly = new PictureBox();\n            labelAlly = new Label();\n            panelGamma = new Panel();\n            labelVisual = new Label();\n            tableVisual = new TableLayoutPanel();\n            buttonInstallColor = new RButton();\n            comboVisual = new RComboBox();\n            comboColorTemp = new RComboBox();\n            comboGamut = new RComboBox();\n            sliderGamma = new Slider();\n            panelGammaTitle = new Panel();\n            labelGamma = new Label();\n            pictureGamma = new PictureBox();\n            labelGammaTitle = new Label();\n            panelVersion = new Panel();\n            buttonEnergySaver = new RButton();\n            buttonAmdOled = new RButton();\n            buttonArmoury = new RButton();\n            labelVersion = new Label();\n            buttonHDRControl = new RButton();\n            panelMatrix.SuspendLayout();\n            panelMatrixAuto.SuspendLayout();\n            tableLayoutMatrix.SuspendLayout();\n            panelMatrixTitle.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureMatrix).BeginInit();\n            panelBattery.SuspendLayout();\n            panelBatteryTitle.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureBattery).BeginInit();\n            panelFooter.SuspendLayout();\n            tableButtons.SuspendLayout();\n            panelPerformance.SuspendLayout();\n            tablePerf.SuspendLayout();\n            panelCPUTitle.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)picturePerf).BeginInit();\n            panelGPU.SuspendLayout();\n            tableAMD.SuspendLayout();\n            tableGPU.SuspendLayout();\n            panelGPUTitle.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureGPU).BeginInit();\n            panelScreen.SuspendLayout();\n            tableScreen.SuspendLayout();\n            panelScreenTitle.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureScreen).BeginInit();\n            panelKeyboard.SuspendLayout();\n            tableLayoutKeyboard.SuspendLayout();\n            panelColor.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureColor2).BeginInit();\n            ((System.ComponentModel.ISupportInitialize)pictureColor).BeginInit();\n            panelKeyboardTitle.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureKeyboard).BeginInit();\n            panelStartup.SuspendLayout();\n            panelPeripherals.SuspendLayout();\n            tableLayoutPeripherals.SuspendLayout();\n            panelAlly.SuspendLayout();\n            tableLayoutAlly.SuspendLayout();\n            panelAllyTitle.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureAlly).BeginInit();\n            panelGamma.SuspendLayout();\n            tableVisual.SuspendLayout();\n            panelGammaTitle.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureGamma).BeginInit();\n            panelVersion.SuspendLayout();\n            SuspendLayout();\n            // \n            // panelMatrix\n            // \n            panelMatrix.AccessibleRole = AccessibleRole.Grouping;\n            panelMatrix.AutoSize = true;\n            panelMatrix.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelMatrix.Controls.Add(panelMatrixAuto);\n            panelMatrix.Controls.Add(tableLayoutMatrix);\n            panelMatrix.Controls.Add(panelMatrixTitle);\n            panelMatrix.Dock = DockStyle.Top;\n            panelMatrix.Location = new Point(11, 1071);\n            panelMatrix.Margin = new Padding(0);\n            panelMatrix.Name = \"panelMatrix\";\n            panelMatrix.Padding = new Padding(20, 20, 20, 11);\n            panelMatrix.Size = new Size(827, 183);\n            panelMatrix.TabIndex = 3;\n            panelMatrix.TabStop = true;\n            // \n            // panelMatrixAuto\n            // \n            panelMatrixAuto.Controls.Add(checkMatrixLid);\n            panelMatrixAuto.Controls.Add(checkMatrix);\n            panelMatrixAuto.Dock = DockStyle.Top;\n            panelMatrixAuto.Location = new Point(20, 132);\n            panelMatrixAuto.Margin = new Padding(4);\n            panelMatrixAuto.Name = \"panelMatrixAuto\";\n            panelMatrixAuto.Padding = new Padding(8, 0, 0, 0);\n            panelMatrixAuto.Size = new Size(787, 40);\n            panelMatrixAuto.TabIndex = 47;\n            // \n            // checkMatrixLid\n            // \n            checkMatrixLid.AutoSize = true;\n            checkMatrixLid.Dock = DockStyle.Left;\n            checkMatrixLid.ForeColor = SystemColors.GrayText;\n            checkMatrixLid.Location = new Point(260, 0);\n            checkMatrixLid.Margin = new Padding(8, 4, 8, 4);\n            checkMatrixLid.Name = \"checkMatrixLid\";\n            checkMatrixLid.Size = new Size(253, 40);\n            checkMatrixLid.TabIndex = 46;\n            checkMatrixLid.Text = \"Disable on lid close\";\n            checkMatrixLid.UseVisualStyleBackColor = true;\n            checkMatrixLid.Visible = true;\n            // \n            // checkMatrix\n            // \n            checkMatrix.AutoSize = true;\n            checkMatrix.Dock = DockStyle.Left;\n            checkMatrix.ForeColor = SystemColors.GrayText;\n            checkMatrix.Location = new Point(8, 0);\n            checkMatrix.Margin = new Padding(8, 4, 8, 4);\n            checkMatrix.Name = \"checkMatrix\";\n            checkMatrix.Padding = new Padding(0, 0, 11, 0);\n            checkMatrix.Size = new Size(252, 40);\n            checkMatrix.TabIndex = 19;\n            checkMatrix.Text = Properties.Strings.TurnOffOnBattery;\n            checkMatrix.UseVisualStyleBackColor = true;\n            // \n            // tableLayoutMatrix\n            // \n            tableLayoutMatrix.AutoSize = true;\n            tableLayoutMatrix.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            tableLayoutMatrix.ColumnCount = 3;\n            tableLayoutMatrix.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableLayoutMatrix.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableLayoutMatrix.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableLayoutMatrix.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableLayoutMatrix.Controls.Add(comboMatrix, 0, 0);\n            tableLayoutMatrix.Controls.Add(comboMatrixRunning, 1, 0);\n            tableLayoutMatrix.Controls.Add(comboInterval, 2, 0);\n            tableLayoutMatrix.Controls.Add(buttonMatrix, 2, 0);\n            tableLayoutMatrix.Dock = DockStyle.Top;\n            tableLayoutMatrix.Location = new Point(20, 60);\n            tableLayoutMatrix.Margin = new Padding(8, 4, 8, 4);\n            tableLayoutMatrix.Name = \"tableLayoutMatrix\";\n            tableLayoutMatrix.Padding = new Padding(3, 0, 3, 0);\n            tableLayoutMatrix.RowCount = 1;\n            tableLayoutMatrix.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));\n            tableLayoutMatrix.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F));\n            tableLayoutMatrix.Size = new Size(787, 72);\n            tableLayoutMatrix.TabIndex = 43;\n            // \n            // comboMatrix\n            // \n            comboMatrix.BorderColor = Color.White;\n            comboMatrix.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboMatrix.Dock = DockStyle.Top;\n            comboMatrix.Font = new Font(\"Segoe UI\", 9F);\n            comboMatrix.FormattingEnabled = true;\n            comboMatrix.ItemHeight = 32;\n            comboMatrix.Items.AddRange(new object[] { Properties.Strings.MatrixOff, Properties.Strings.MatrixDim, Properties.Strings.MatrixMedium, Properties.Strings.MatrixBright });\n            comboMatrix.Location = new Point(10, 8);\n            comboMatrix.Margin = new Padding(7, 8, 7, 4);\n            comboMatrix.Name = \"comboMatrix\";\n            comboMatrix.Size = new Size(246, 40);\n            comboMatrix.TabIndex = 16;\n            // \n            // comboMatrixRunning\n            // \n            comboMatrixRunning.BorderColor = Color.White;\n            comboMatrixRunning.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboMatrixRunning.Dock = DockStyle.Top;\n            comboMatrixRunning.Font = new Font(\"Segoe UI\", 9F);\n            comboMatrixRunning.FormattingEnabled = true;\n            comboMatrixRunning.ItemHeight = 32;\n            comboMatrixRunning.Items.AddRange(new object[] { Properties.Strings.MatrixBanner, Properties.Strings.MatrixLogo, Properties.Strings.MatrixPicture, Properties.Strings.MatrixClock, Properties.Strings.MatrixAudio });\n            comboMatrixRunning.Location = new Point(270, 8);\n            comboMatrixRunning.Margin = new Padding(7, 8, 7, 4);\n            comboMatrixRunning.Name = \"comboMatrixRunning\";\n            comboMatrixRunning.Size = new Size(246, 40);\n            comboMatrixRunning.TabIndex = 17;\n            // \n            // comboInterval\n            // \n            comboInterval.BorderColor = Color.White;\n            comboInterval.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboInterval.Dock = DockStyle.Top;\n            comboInterval.Font = new Font(\"Segoe UI\", 9F);\n            comboInterval.FormattingEnabled = true;\n            comboInterval.ItemHeight = 32;\n            comboInterval.Location = new Point(10, 60);\n            comboInterval.Margin = new Padding(7, 8, 7, 4);\n            comboInterval.Name = \"comboInterval\";\n            comboInterval.Size = new Size(246, 40);\n            comboInterval.TabIndex = 19;\n            comboInterval.Visible = false;\n            // \n            // buttonMatrix\n            // \n            buttonMatrix.Activated = false;\n            buttonMatrix.AutoSize = true;\n            buttonMatrix.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            buttonMatrix.BackColor = SystemColors.ControlLight;\n            buttonMatrix.BorderColor = Color.Transparent;\n            buttonMatrix.BorderRadius = 2;\n            buttonMatrix.Dock = DockStyle.Top;\n            buttonMatrix.FlatAppearance.BorderSize = 0;\n            buttonMatrix.FlatStyle = FlatStyle.Flat;\n            buttonMatrix.Location = new Point(527, 4);\n            buttonMatrix.Margin = new Padding(4);\n            buttonMatrix.MaximumSize = new Size(0, 48);\n            buttonMatrix.MinimumSize = new Size(0, 44);\n            buttonMatrix.Name = \"buttonMatrix\";\n            buttonMatrix.Secondary = true;\n            buttonMatrix.Size = new Size(253, 44);\n            buttonMatrix.TabIndex = 18;\n            buttonMatrix.Text = Properties.Strings.PictureGif;\n            buttonMatrix.UseVisualStyleBackColor = false;\n            // \n            // panelMatrixTitle\n            // \n            panelMatrixTitle.Controls.Add(pictureMatrix);\n            panelMatrixTitle.Controls.Add(labelMatrix);\n            panelMatrixTitle.Dock = DockStyle.Top;\n            panelMatrixTitle.Location = new Point(20, 20);\n            panelMatrixTitle.Margin = new Padding(4);\n            panelMatrixTitle.Name = \"panelMatrixTitle\";\n            panelMatrixTitle.Size = new Size(787, 40);\n            panelMatrixTitle.TabIndex = 45;\n            // \n            // pictureMatrix\n            // \n            pictureMatrix.BackgroundImage = Properties.Resources.icons8_matrix_32;\n            pictureMatrix.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureMatrix.Location = new Point(8, 3);\n            pictureMatrix.Margin = new Padding(4);\n            pictureMatrix.Name = \"pictureMatrix\";\n            pictureMatrix.Size = new Size(32, 32);\n            pictureMatrix.TabIndex = 41;\n            pictureMatrix.TabStop = false;\n            // \n            // labelMatrix\n            // \n            labelMatrix.AutoSize = true;\n            labelMatrix.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelMatrix.Location = new Point(44, 0);\n            labelMatrix.Margin = new Padding(4, 0, 4, 0);\n            labelMatrix.Name = \"labelMatrix\";\n            labelMatrix.Size = new Size(170, 32);\n            labelMatrix.TabIndex = 40;\n            labelMatrix.Text = \"Anime Matrix\";\n            // \n            // panelBattery\n            // \n            panelBattery.AutoSize = true;\n            panelBattery.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelBattery.Controls.Add(buttonBatteryFull);\n            panelBattery.Controls.Add(sliderBattery);\n            panelBattery.Controls.Add(panelBatteryTitle);\n            panelBattery.Dock = DockStyle.Top;\n            panelBattery.Location = new Point(11, 1683);\n            panelBattery.Margin = new Padding(0);\n            panelBattery.Name = \"panelBattery\";\n            panelBattery.Padding = new Padding(20, 15, 20, 0);\n            panelBattery.Size = new Size(827, 104);\n            panelBattery.TabIndex = 5;\n            // \n            // buttonBatteryFull\n            // \n            buttonBatteryFull.Activated = false;\n            buttonBatteryFull.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            buttonBatteryFull.BackColor = SystemColors.ControlLight;\n            buttonBatteryFull.BorderColor = Color.Transparent;\n            buttonBatteryFull.BorderRadius = 2;\n            buttonBatteryFull.FlatAppearance.BorderSize = 0;\n            buttonBatteryFull.FlatStyle = FlatStyle.Flat;\n            buttonBatteryFull.Font = new Font(\"Segoe UI\", 7.125F, FontStyle.Bold);\n            buttonBatteryFull.ForeColor = SystemColors.ControlDark;\n            buttonBatteryFull.Location = new Point(728, 62);\n            buttonBatteryFull.Margin = new Padding(0);\n            buttonBatteryFull.Name = \"buttonBatteryFull\";\n            buttonBatteryFull.Secondary = true;\n            buttonBatteryFull.Size = new Size(73, 36);\n            buttonBatteryFull.TabIndex = 41;\n            buttonBatteryFull.Text = \"100%\";\n            buttonBatteryFull.UseVisualStyleBackColor = false;\n            // \n            // sliderBattery\n            // \n            sliderBattery.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;\n            sliderBattery.Location = new Point(20, 60);\n            sliderBattery.Margin = new Padding(4);\n            sliderBattery.Max = 100;\n            sliderBattery.Min = 40;\n            sliderBattery.Name = \"sliderBattery\";\n            sliderBattery.Size = new Size(707, 40);\n            sliderBattery.Step = 5;\n            sliderBattery.TabIndex = 20;\n            sliderBattery.Text = \"sliderBattery\";\n            sliderBattery.Value = 100;\n            // \n            // panelBatteryTitle\n            // \n            panelBatteryTitle.Controls.Add(labelBattery);\n            panelBatteryTitle.Controls.Add(pictureBattery);\n            panelBatteryTitle.Controls.Add(labelBatteryTitle);\n            panelBatteryTitle.Dock = DockStyle.Top;\n            panelBatteryTitle.Location = new Point(20, 15);\n            panelBatteryTitle.Margin = new Padding(4);\n            panelBatteryTitle.Name = \"panelBatteryTitle\";\n            panelBatteryTitle.Padding = new Padding(0, 0, 0, 4);\n            panelBatteryTitle.Size = new Size(787, 44);\n            panelBatteryTitle.TabIndex = 40;\n            // \n            // labelBattery\n            // \n            labelBattery.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            labelBattery.Location = new Point(455, 0);\n            labelBattery.Margin = new Padding(8, 0, 8, 0);\n            labelBattery.Name = \"labelBattery\";\n            labelBattery.Size = new Size(324, 36);\n            labelBattery.TabIndex = 39;\n            labelBattery.Text = \"                \";\n            labelBattery.TextAlign = ContentAlignment.TopRight;\n            // \n            // pictureBattery\n            // \n            pictureBattery.BackgroundImage = Properties.Resources.icons8_charging_battery_32;\n            pictureBattery.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureBattery.Location = new Point(8, 3);\n            pictureBattery.Margin = new Padding(4);\n            pictureBattery.Name = \"pictureBattery\";\n            pictureBattery.Size = new Size(32, 32);\n            pictureBattery.TabIndex = 38;\n            pictureBattery.TabStop = false;\n            // \n            // labelBatteryTitle\n            // \n            labelBatteryTitle.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelBatteryTitle.Location = new Point(43, 0);\n            labelBatteryTitle.Margin = new Padding(8, 0, 8, 0);\n            labelBatteryTitle.Name = \"labelBatteryTitle\";\n            labelBatteryTitle.Size = new Size(467, 32);\n            labelBatteryTitle.TabIndex = 37;\n            labelBatteryTitle.Text = \"Battery Charge Limit\";\n            // \n            // panelFooter\n            // \n            panelFooter.AutoSize = true;\n            panelFooter.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelFooter.Controls.Add(tableButtons);\n            panelFooter.Dock = DockStyle.Top;\n            panelFooter.Location = new Point(11, 1887);\n            panelFooter.Margin = new Padding(0);\n            panelFooter.Name = \"panelFooter\";\n            panelFooter.Padding = new Padding(20, 10, 20, 20);\n            panelFooter.Size = new Size(827, 88);\n            panelFooter.TabIndex = 7;\n            // \n            // tableButtons\n            // \n            tableButtons.AutoSize = true;\n            tableButtons.ColumnCount = 3;\n            tableButtons.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33.3333321F));\n            tableButtons.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33.3333321F));\n            tableButtons.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33.3333321F));\n            tableButtons.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 27F));\n            tableButtons.Controls.Add(buttonDonate, 0, 0);\n            tableButtons.Controls.Add(buttonQuit, 2, 0);\n            tableButtons.Controls.Add(buttonUpdates, 1, 0);\n            tableButtons.Dock = DockStyle.Top;\n            tableButtons.Location = new Point(20, 10);\n            tableButtons.Margin = new Padding(8, 4, 8, 4);\n            tableButtons.Name = \"tableButtons\";\n            tableButtons.RowCount = 1;\n            tableButtons.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));\n            tableButtons.Size = new Size(787, 58);\n            tableButtons.TabIndex = 25;\n            // \n            // buttonDonate\n            // \n            buttonDonate.Activated = false;\n            buttonDonate.BackColor = SystemColors.ControlLight;\n            buttonDonate.Badge = 0;\n            buttonDonate.BorderColor = Color.Transparent;\n            buttonDonate.BorderRadius = 2;\n            buttonDonate.Dock = DockStyle.Top;\n            buttonDonate.FlatStyle = FlatStyle.Flat;\n            buttonDonate.Image = Properties.Resources.icons8_dollar_32;\n            buttonDonate.ImageAlign = ContentAlignment.MiddleRight;\n            buttonDonate.Location = new Point(4, 5);\n            buttonDonate.Margin = new Padding(4, 5, 4, 5);\n            buttonDonate.Name = \"buttonDonate\";\n            buttonDonate.Secondary = true;\n            buttonDonate.Size = new Size(254, 48);\n            buttonDonate.TabIndex = 3;\n            buttonDonate.Text = \"&Donate\";\n            buttonDonate.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonDonate.UseVisualStyleBackColor = false;\n            // \n            // buttonQuit\n            // \n            buttonQuit.Activated = false;\n            buttonQuit.BackColor = SystemColors.ControlLight;\n            buttonQuit.BorderColor = Color.Transparent;\n            buttonQuit.BorderRadius = 2;\n            buttonQuit.Dock = DockStyle.Top;\n            buttonQuit.FlatStyle = FlatStyle.Flat;\n            buttonQuit.Image = Properties.Resources.icons8_quit_32;\n            buttonQuit.Location = new Point(528, 5);\n            buttonQuit.Margin = new Padding(4, 5, 4, 5);\n            buttonQuit.Name = \"buttonQuit\";\n            buttonQuit.Secondary = true;\n            buttonQuit.Size = new Size(255, 48);\n            buttonQuit.TabIndex = 2;\n            buttonQuit.Text = \"&Quit\";\n            buttonQuit.TextAlign = ContentAlignment.MiddleRight;\n            buttonQuit.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonQuit.UseVisualStyleBackColor = false;\n            // \n            // buttonUpdates\n            // \n            buttonUpdates.Activated = false;\n            buttonUpdates.BackColor = SystemColors.ControlLight;\n            buttonUpdates.BorderColor = Color.Transparent;\n            buttonUpdates.BorderRadius = 2;\n            buttonUpdates.Dock = DockStyle.Top;\n            buttonUpdates.FlatStyle = FlatStyle.Flat;\n            buttonUpdates.Image = Properties.Resources.icons8_software_32_white;\n            buttonUpdates.ImageAlign = ContentAlignment.MiddleRight;\n            buttonUpdates.Location = new Point(266, 5);\n            buttonUpdates.Margin = new Padding(4, 5, 4, 5);\n            buttonUpdates.Name = \"buttonUpdates\";\n            buttonUpdates.Secondary = true;\n            buttonUpdates.Size = new Size(254, 48);\n            buttonUpdates.TabIndex = 1;\n            buttonUpdates.Text = \"&Updates\";\n            buttonUpdates.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonUpdates.UseVisualStyleBackColor = false;\n            // \n            // checkStartup\n            // \n            checkStartup.AutoSize = true;\n            checkStartup.Dock = DockStyle.Left;\n            checkStartup.Location = new Point(20, 0);\n            checkStartup.Margin = new Padding(11, 5, 11, 5);\n            checkStartup.Name = \"checkStartup\";\n            checkStartup.Padding = new Padding(10, 0, 0, 0);\n            checkStartup.Size = new Size(216, 50);\n            checkStartup.TabIndex = 21;\n            checkStartup.Text = Properties.Strings.RunOnStartup;\n            checkStartup.UseVisualStyleBackColor = true;\n            // \n            // panelPerformance\n            // \n            panelPerformance.AccessibleRole = AccessibleRole.Grouping;\n            panelPerformance.AutoSize = true;\n            panelPerformance.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelPerformance.Controls.Add(tablePerf);\n            panelPerformance.Controls.Add(panelCPUTitle);\n            panelPerformance.Dock = DockStyle.Top;\n            panelPerformance.Location = new Point(11, 11);\n            panelPerformance.Margin = new Padding(0);\n            panelPerformance.Name = \"panelPerformance\";\n            panelPerformance.Padding = new Padding(20);\n            panelPerformance.Size = new Size(827, 208);\n            panelPerformance.TabIndex = 0;\n            panelPerformance.TabStop = true;\n            // \n            // tablePerf\n            // \n            tablePerf.AutoSize = true;\n            tablePerf.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            tablePerf.ColumnCount = 4;\n            tablePerf.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tablePerf.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tablePerf.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tablePerf.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tablePerf.Controls.Add(buttonSilent, 0, 0);\n            tablePerf.Controls.Add(buttonBalanced, 1, 0);\n            tablePerf.Controls.Add(buttonTurbo, 2, 0);\n            tablePerf.Controls.Add(buttonFans, 3, 0);\n            tablePerf.Dock = DockStyle.Top;\n            tablePerf.Location = new Point(20, 60);\n            tablePerf.Margin = new Padding(8, 4, 8, 4);\n            tablePerf.Name = \"tablePerf\";\n            tablePerf.RowCount = 1;\n            tablePerf.RowStyles.Add(new RowStyle(SizeType.Absolute, 128F));\n            tablePerf.Size = new Size(787, 128);\n            tablePerf.TabIndex = 29;\n            // \n            // buttonSilent\n            // \n            buttonSilent.Activated = false;\n            buttonSilent.BackColor = SystemColors.ControlLightLight;\n            buttonSilent.BackgroundImageLayout = ImageLayout.None;\n            buttonSilent.BorderColor = Color.Transparent;\n            buttonSilent.BorderRadius = 5;\n            buttonSilent.Dock = DockStyle.Fill;\n            buttonSilent.FlatAppearance.BorderSize = 0;\n            buttonSilent.FlatStyle = FlatStyle.Flat;\n            buttonSilent.ForeColor = SystemColors.ControlText;\n            buttonSilent.Image = Properties.Resources.icons8_bicycle_48__1_;\n            buttonSilent.ImageAlign = ContentAlignment.BottomCenter;\n            buttonSilent.Location = new Point(4, 4);\n            buttonSilent.Margin = new Padding(4);\n            buttonSilent.Name = \"buttonSilent\";\n            buttonSilent.Secondary = false;\n            buttonSilent.Size = new Size(188, 120);\n            buttonSilent.TabIndex = 1;\n            buttonSilent.Text = \"&Silent\";\n            buttonSilent.TextImageRelation = TextImageRelation.ImageAboveText;\n            buttonSilent.UseVisualStyleBackColor = false;\n            // \n            // buttonBalanced\n            // \n            buttonBalanced.Activated = false;\n            buttonBalanced.BackColor = SystemColors.ControlLightLight;\n            buttonBalanced.BorderColor = Color.Transparent;\n            buttonBalanced.BorderRadius = 5;\n            buttonBalanced.Dock = DockStyle.Fill;\n            buttonBalanced.FlatAppearance.BorderSize = 0;\n            buttonBalanced.FlatStyle = FlatStyle.Flat;\n            buttonBalanced.ForeColor = SystemColors.ControlText;\n            buttonBalanced.Image = Properties.Resources.icons8_fiat_500_48;\n            buttonBalanced.ImageAlign = ContentAlignment.BottomCenter;\n            buttonBalanced.Location = new Point(200, 4);\n            buttonBalanced.Margin = new Padding(4);\n            buttonBalanced.Name = \"buttonBalanced\";\n            buttonBalanced.Secondary = false;\n            buttonBalanced.Size = new Size(188, 120);\n            buttonBalanced.TabIndex = 1;\n            buttonBalanced.Text = \"&Balanced\";\n            buttonBalanced.TextImageRelation = TextImageRelation.ImageAboveText;\n            buttonBalanced.UseVisualStyleBackColor = false;\n            // \n            // buttonTurbo\n            // \n            buttonTurbo.Activated = false;\n            buttonTurbo.BackColor = SystemColors.ControlLightLight;\n            buttonTurbo.BorderColor = Color.Transparent;\n            buttonTurbo.BorderRadius = 5;\n            buttonTurbo.Dock = DockStyle.Fill;\n            buttonTurbo.FlatAppearance.BorderSize = 0;\n            buttonTurbo.FlatStyle = FlatStyle.Flat;\n            buttonTurbo.ForeColor = SystemColors.ControlText;\n            buttonTurbo.Image = Properties.Resources.icons8_rocket_48;\n            buttonTurbo.ImageAlign = ContentAlignment.BottomCenter;\n            buttonTurbo.Location = new Point(396, 4);\n            buttonTurbo.Margin = new Padding(4);\n            buttonTurbo.Name = \"buttonTurbo\";\n            buttonTurbo.Secondary = false;\n            buttonTurbo.Size = new Size(188, 120);\n            buttonTurbo.TabIndex = 2;\n            buttonTurbo.Text = \"&Turbo\";\n            buttonTurbo.TextImageRelation = TextImageRelation.ImageAboveText;\n            buttonTurbo.UseVisualStyleBackColor = false;\n            // \n            // buttonFans\n            // \n            buttonFans.Activated = false;\n            buttonFans.BackColor = SystemColors.ControlLight;\n            buttonFans.BorderColor = Color.Transparent;\n            buttonFans.BorderRadius = 5;\n            buttonFans.Dock = DockStyle.Fill;\n            buttonFans.FlatAppearance.BorderSize = 0;\n            buttonFans.FlatStyle = FlatStyle.Flat;\n            buttonFans.Image = Properties.Resources.icons8_fan_48;\n            buttonFans.ImageAlign = ContentAlignment.BottomCenter;\n            buttonFans.Location = new Point(592, 4);\n            buttonFans.Margin = new Padding(4);\n            buttonFans.Name = \"buttonFans\";\n            buttonFans.Secondary = true;\n            buttonFans.Size = new Size(191, 120);\n            buttonFans.TabIndex = 3;\n            buttonFans.Text = \"&Fans + Power\";\n            buttonFans.TextImageRelation = TextImageRelation.ImageAboveText;\n            buttonFans.UseVisualStyleBackColor = false;\n            // \n            // panelCPUTitle\n            // \n            panelCPUTitle.Controls.Add(picturePerf);\n            panelCPUTitle.Controls.Add(labelPerf);\n            panelCPUTitle.Controls.Add(labelCPUFan);\n            panelCPUTitle.Dock = DockStyle.Top;\n            panelCPUTitle.Location = new Point(20, 20);\n            panelCPUTitle.Margin = new Padding(4);\n            panelCPUTitle.Name = \"panelCPUTitle\";\n            panelCPUTitle.Size = new Size(787, 40);\n            panelCPUTitle.TabIndex = 30;\n            // \n            // picturePerf\n            // \n            picturePerf.BackgroundImage = Properties.Resources.icons8_gauge_32;\n            picturePerf.BackgroundImageLayout = ImageLayout.Zoom;\n            picturePerf.InitialImage = null;\n            picturePerf.Location = new Point(8, 0);\n            picturePerf.Margin = new Padding(4);\n            picturePerf.Name = \"picturePerf\";\n            picturePerf.Size = new Size(32, 32);\n            picturePerf.TabIndex = 35;\n            picturePerf.TabStop = false;\n            // \n            // labelPerf\n            // \n            labelPerf.AccessibleRole = AccessibleRole.Caret;\n            labelPerf.AutoSize = true;\n            labelPerf.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelPerf.LiveSetting = System.Windows.Forms.Automation.AutomationLiveSetting.Polite;\n            labelPerf.Location = new Point(40, 0);\n            labelPerf.Margin = new Padding(8, 0, 8, 0);\n            labelPerf.Name = \"labelPerf\";\n            labelPerf.Size = new Size(234, 32);\n            labelPerf.TabIndex = 0;\n            labelPerf.Text = \"Performance Mode\";\n            // \n            // labelCPUFan\n            // \n            labelCPUFan.AccessibleRole = AccessibleRole.TitleBar;\n            labelCPUFan.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            labelCPUFan.Cursor = Cursors.Hand;\n            labelCPUFan.Location = new Point(387, 0);\n            labelCPUFan.Margin = new Padding(8, 0, 8, 0);\n            labelCPUFan.Name = \"labelCPUFan\";\n            labelCPUFan.Size = new Size(400, 36);\n            labelCPUFan.TabIndex = 33;\n            labelCPUFan.Text = \"      \";\n            labelCPUFan.TextAlign = ContentAlignment.TopRight;\n            // \n            // panelGPU\n            // \n            panelGPU.AccessibleRole = AccessibleRole.Grouping;\n            panelGPU.AutoSize = true;\n            panelGPU.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelGPU.Controls.Add(labelTipGPU);\n            panelGPU.Controls.Add(tableAMD);\n            panelGPU.Controls.Add(tableGPU);\n            panelGPU.Controls.Add(panelGPUTitle);\n            panelGPU.Dock = DockStyle.Top;\n            panelGPU.Location = new Point(11, 219);\n            panelGPU.Margin = new Padding(0);\n            panelGPU.Name = \"panelGPU\";\n            panelGPU.Padding = new Padding(20, 20, 20, 0);\n            panelGPU.Size = new Size(827, 432);\n            panelGPU.TabIndex = 1;\n            panelGPU.TabStop = true;\n            // \n            // labelTipGPU\n            // \n            labelTipGPU.Dock = DockStyle.Top;\n            labelTipGPU.ForeColor = SystemColors.GrayText;\n            labelTipGPU.Location = new Point(20, 396);\n            labelTipGPU.Margin = new Padding(4, 0, 4, 0);\n            labelTipGPU.Name = \"labelTipGPU\";\n            labelTipGPU.Size = new Size(787, 36);\n            labelTipGPU.TabIndex = 20;\n            // \n            // tableAMD\n            // \n            tableAMD.AutoSize = true;\n            tableAMD.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            tableAMD.ColumnCount = 3;\n            tableAMD.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33F));\n            tableAMD.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33F));\n            tableAMD.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33F));\n            tableAMD.Controls.Add(buttonAutoTDP, 0, 0);\n            tableAMD.Controls.Add(buttonOverlay, 0, 0);\n            tableAMD.Controls.Add(buttonFPS, 0, 0);\n            tableAMD.Dock = DockStyle.Top;\n            tableAMD.Location = new Point(20, 316);\n            tableAMD.Margin = new Padding(8, 4, 8, 4);\n            tableAMD.Name = \"tableAMD\";\n            tableAMD.RowCount = 1;\n            tableAMD.RowStyles.Add(new RowStyle(SizeType.Absolute, 80F));\n            tableAMD.Size = new Size(787, 80);\n            tableAMD.TabIndex = 24;\n            tableAMD.Visible = false;\n            // \n            // buttonAutoTDP\n            // \n            buttonAutoTDP.Activated = false;\n            buttonAutoTDP.BackColor = SystemColors.ControlLightLight;\n            buttonAutoTDP.BorderColor = Color.Transparent;\n            buttonAutoTDP.BorderRadius = 5;\n            buttonAutoTDP.Dock = DockStyle.Fill;\n            buttonAutoTDP.FlatAppearance.BorderSize = 0;\n            buttonAutoTDP.FlatStyle = FlatStyle.Flat;\n            buttonAutoTDP.ForeColor = SystemColors.ControlText;\n            buttonAutoTDP.Image = Properties.Resources.icons8_gauge_32;\n            buttonAutoTDP.ImageAlign = ContentAlignment.MiddleRight;\n            buttonAutoTDP.Location = new Point(528, 4);\n            buttonAutoTDP.Margin = new Padding(4);\n            buttonAutoTDP.Name = \"buttonAutoTDP\";\n            buttonAutoTDP.Secondary = false;\n            buttonAutoTDP.Size = new Size(255, 72);\n            buttonAutoTDP.TabIndex = 13;\n            buttonAutoTDP.Text = \"AutoTDP\";\n            buttonAutoTDP.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonAutoTDP.UseVisualStyleBackColor = false;\n            // \n            // buttonOverlay\n            // \n            buttonOverlay.Activated = false;\n            buttonOverlay.BackColor = SystemColors.ControlLightLight;\n            buttonOverlay.BorderColor = Color.Transparent;\n            buttonOverlay.BorderRadius = 5;\n            buttonOverlay.Dock = DockStyle.Fill;\n            buttonOverlay.FlatAppearance.BorderSize = 0;\n            buttonOverlay.FlatStyle = FlatStyle.Flat;\n            buttonOverlay.ForeColor = SystemColors.ControlText;\n            buttonOverlay.Image = Properties.Resources.icons8_heartbeat_32;\n            buttonOverlay.ImageAlign = ContentAlignment.MiddleRight;\n            buttonOverlay.Location = new Point(266, 4);\n            buttonOverlay.Margin = new Padding(4);\n            buttonOverlay.Name = \"buttonOverlay\";\n            buttonOverlay.Secondary = false;\n            buttonOverlay.Size = new Size(254, 72);\n            buttonOverlay.TabIndex = 12;\n            buttonOverlay.Text = \"AMD Overlay\";\n            buttonOverlay.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonOverlay.UseVisualStyleBackColor = false;\n            // \n            // buttonFPS\n            // \n            buttonFPS.Activated = false;\n            buttonFPS.BackColor = SystemColors.ControlLightLight;\n            buttonFPS.BorderColor = Color.Transparent;\n            buttonFPS.BorderRadius = 5;\n            buttonFPS.Dock = DockStyle.Fill;\n            buttonFPS.FlatAppearance.BorderSize = 0;\n            buttonFPS.FlatStyle = FlatStyle.Flat;\n            buttonFPS.ForeColor = SystemColors.ControlText;\n            buttonFPS.Image = Properties.Resources.icons8_animation_32;\n            buttonFPS.ImageAlign = ContentAlignment.MiddleRight;\n            buttonFPS.Location = new Point(4, 4);\n            buttonFPS.Margin = new Padding(4);\n            buttonFPS.Name = \"buttonFPS\";\n            buttonFPS.Secondary = false;\n            buttonFPS.Size = new Size(254, 72);\n            buttonFPS.TabIndex = 11;\n            buttonFPS.Text = \"FPS Limit OFF\";\n            buttonFPS.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonFPS.UseVisualStyleBackColor = false;\n            // \n            // tableGPU\n            // \n            tableGPU.AutoSize = true;\n            tableGPU.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            tableGPU.ColumnCount = 4;\n            tableGPU.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableGPU.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableGPU.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableGPU.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableGPU.Controls.Add(buttonStopGPU, 0, 0);\n            tableGPU.Controls.Add(buttonEco, 0, 0);\n            tableGPU.Controls.Add(buttonStandard, 1, 0);\n            tableGPU.Controls.Add(buttonXGM, 2, 0);\n            tableGPU.Controls.Add(buttonOptimized, 2, 0);\n            tableGPU.Controls.Add(buttonUltimate, 2, 0);\n            tableGPU.Dock = DockStyle.Top;\n            tableGPU.Location = new Point(20, 60);\n            tableGPU.Margin = new Padding(8, 4, 8, 4);\n            tableGPU.Name = \"tableGPU\";\n            tableGPU.RowCount = 1;\n            tableGPU.RowStyles.Add(new RowStyle(SizeType.Absolute, 128F));\n            tableGPU.RowStyles.Add(new RowStyle(SizeType.Absolute, 128F));\n            tableGPU.Size = new Size(787, 256);\n            tableGPU.TabIndex = 16;\n            // \n            // buttonStopGPU\n            // \n            buttonStopGPU.Activated = false;\n            buttonStopGPU.BackColor = SystemColors.ControlLightLight;\n            buttonStopGPU.BorderColor = Color.Transparent;\n            buttonStopGPU.BorderRadius = 5;\n            buttonStopGPU.CausesValidation = false;\n            buttonStopGPU.Dock = DockStyle.Top;\n            buttonStopGPU.FlatAppearance.BorderSize = 0;\n            buttonStopGPU.FlatStyle = FlatStyle.Flat;\n            buttonStopGPU.ForeColor = SystemColors.ControlText;\n            buttonStopGPU.Image = Properties.Resources.icons8_leaf_48;\n            buttonStopGPU.ImageAlign = ContentAlignment.BottomCenter;\n            buttonStopGPU.Location = new Point(200, 4);\n            buttonStopGPU.Margin = new Padding(4);\n            buttonStopGPU.Name = \"buttonStopGPU\";\n            buttonStopGPU.Secondary = false;\n            buttonStopGPU.Size = new Size(188, 120);\n            buttonStopGPU.TabIndex = 4;\n            buttonStopGPU.Text = \"Stop GPU applications\";\n            buttonStopGPU.TextImageRelation = TextImageRelation.ImageAboveText;\n            buttonStopGPU.UseVisualStyleBackColor = false;\n            buttonStopGPU.Visible = false;\n            // \n            // buttonEco\n            // \n            buttonEco.Activated = false;\n            buttonEco.BackColor = SystemColors.ControlLightLight;\n            buttonEco.BorderColor = Color.Transparent;\n            buttonEco.BorderRadius = 5;\n            buttonEco.CausesValidation = false;\n            buttonEco.Dock = DockStyle.Top;\n            buttonEco.FlatAppearance.BorderSize = 0;\n            buttonEco.FlatStyle = FlatStyle.Flat;\n            buttonEco.ForeColor = SystemColors.ControlText;\n            buttonEco.Image = Properties.Resources.icons8_leaf_48;\n            buttonEco.ImageAlign = ContentAlignment.BottomCenter;\n            buttonEco.Location = new Point(4, 4);\n            buttonEco.Margin = new Padding(4);\n            buttonEco.Name = \"buttonEco\";\n            buttonEco.Secondary = false;\n            buttonEco.Size = new Size(188, 120);\n            buttonEco.TabIndex = 4;\n            buttonEco.Text = Properties.Strings.EcoMode;\n            buttonEco.TextImageRelation = TextImageRelation.ImageAboveText;\n            buttonEco.UseVisualStyleBackColor = false;\n            // \n            // buttonStandard\n            // \n            buttonStandard.Activated = false;\n            buttonStandard.BackColor = SystemColors.ControlLightLight;\n            buttonStandard.BorderColor = Color.Transparent;\n            buttonStandard.BorderRadius = 5;\n            buttonStandard.Dock = DockStyle.Top;\n            buttonStandard.FlatAppearance.BorderSize = 0;\n            buttonStandard.FlatStyle = FlatStyle.Flat;\n            buttonStandard.ForeColor = SystemColors.ControlText;\n            buttonStandard.Image = Properties.Resources.icons8_spa_flower_48;\n            buttonStandard.ImageAlign = ContentAlignment.BottomCenter;\n            buttonStandard.Location = new Point(396, 4);\n            buttonStandard.Margin = new Padding(4);\n            buttonStandard.Name = \"buttonStandard\";\n            buttonStandard.Secondary = false;\n            buttonStandard.Size = new Size(188, 120);\n            buttonStandard.TabIndex = 5;\n            buttonStandard.Text = Properties.Strings.StandardMode;\n            buttonStandard.TextImageRelation = TextImageRelation.ImageAboveText;\n            buttonStandard.UseVisualStyleBackColor = false;\n            // \n            // buttonXGM\n            // \n            buttonXGM.Activated = false;\n            buttonXGM.BackColor = SystemColors.ControlLightLight;\n            buttonXGM.BorderColor = Color.Transparent;\n            buttonXGM.BorderRadius = 5;\n            buttonXGM.Dock = DockStyle.Top;\n            buttonXGM.FlatAppearance.BorderSize = 0;\n            buttonXGM.FlatStyle = FlatStyle.Flat;\n            buttonXGM.ForeColor = SystemColors.ControlText;\n            buttonXGM.Image = Properties.Resources.icons8_video_48;\n            buttonXGM.ImageAlign = ContentAlignment.BottomCenter;\n            buttonXGM.Location = new Point(200, 132);\n            buttonXGM.Margin = new Padding(4);\n            buttonXGM.Name = \"buttonXGM\";\n            buttonXGM.Secondary = false;\n            buttonXGM.Size = new Size(188, 120);\n            buttonXGM.TabIndex = 8;\n            buttonXGM.Text = \"XG Mobile\";\n            buttonXGM.TextImageRelation = TextImageRelation.ImageAboveText;\n            buttonXGM.UseVisualStyleBackColor = false;\n            buttonXGM.Visible = false;\n            // \n            // buttonOptimized\n            // \n            buttonOptimized.Activated = false;\n            buttonOptimized.BackColor = SystemColors.ControlLightLight;\n            buttonOptimized.BorderColor = Color.Transparent;\n            buttonOptimized.BorderRadius = 5;\n            buttonOptimized.Dock = DockStyle.Top;\n            buttonOptimized.FlatAppearance.BorderSize = 0;\n            buttonOptimized.FlatStyle = FlatStyle.Flat;\n            buttonOptimized.ForeColor = SystemColors.ControlText;\n            buttonOptimized.Image = Properties.Resources.icons8_project_management_48__1_;\n            buttonOptimized.ImageAlign = ContentAlignment.BottomCenter;\n            buttonOptimized.Location = new Point(4, 132);\n            buttonOptimized.Margin = new Padding(4);\n            buttonOptimized.Name = \"buttonOptimized\";\n            buttonOptimized.Secondary = false;\n            buttonOptimized.Size = new Size(188, 120);\n            buttonOptimized.TabIndex = 7;\n            buttonOptimized.Text = Properties.Strings.Optimized;\n            buttonOptimized.TextImageRelation = TextImageRelation.ImageAboveText;\n            buttonOptimized.UseVisualStyleBackColor = false;\n            // \n            // buttonUltimate\n            // \n            buttonUltimate.Activated = false;\n            buttonUltimate.BackColor = SystemColors.ControlLightLight;\n            buttonUltimate.BorderColor = Color.Transparent;\n            buttonUltimate.BorderRadius = 5;\n            buttonUltimate.Dock = DockStyle.Top;\n            buttonUltimate.FlatAppearance.BorderSize = 0;\n            buttonUltimate.FlatStyle = FlatStyle.Flat;\n            buttonUltimate.ForeColor = SystemColors.ControlText;\n            buttonUltimate.Image = Properties.Resources.icons8_game_controller_48;\n            buttonUltimate.ImageAlign = ContentAlignment.BottomCenter;\n            buttonUltimate.Location = new Point(592, 4);\n            buttonUltimate.Margin = new Padding(4);\n            buttonUltimate.Name = \"buttonUltimate\";\n            buttonUltimate.Secondary = false;\n            buttonUltimate.Size = new Size(191, 120);\n            buttonUltimate.TabIndex = 6;\n            buttonUltimate.Text = Properties.Strings.UltimateMode;\n            buttonUltimate.TextImageRelation = TextImageRelation.ImageAboveText;\n            buttonUltimate.UseVisualStyleBackColor = false;\n            // \n            // panelGPUTitle\n            // \n            panelGPUTitle.Controls.Add(pictureGPU);\n            panelGPUTitle.Controls.Add(labelGPU);\n            panelGPUTitle.Controls.Add(labelGPUFan);\n            panelGPUTitle.Dock = DockStyle.Top;\n            panelGPUTitle.Location = new Point(20, 20);\n            panelGPUTitle.Margin = new Padding(4);\n            panelGPUTitle.Name = \"panelGPUTitle\";\n            panelGPUTitle.Size = new Size(787, 40);\n            panelGPUTitle.TabIndex = 21;\n            // \n            // pictureGPU\n            // \n            pictureGPU.BackgroundImage = Properties.Resources.icons8_video_card_32;\n            pictureGPU.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureGPU.Location = new Point(8, 0);\n            pictureGPU.Margin = new Padding(4);\n            pictureGPU.Name = \"pictureGPU\";\n            pictureGPU.Size = new Size(32, 32);\n            pictureGPU.TabIndex = 22;\n            pictureGPU.TabStop = false;\n            // \n            // labelGPU\n            // \n            labelGPU.AutoSize = true;\n            labelGPU.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelGPU.Location = new Point(40, 0);\n            labelGPU.Margin = new Padding(8, 0, 8, 0);\n            labelGPU.Name = \"labelGPU\";\n            labelGPU.Size = new Size(136, 32);\n            labelGPU.TabIndex = 21;\n            labelGPU.Text = \"GPU Mode\";\n            // \n            // labelGPUFan\n            // \n            labelGPUFan.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            labelGPUFan.Location = new Point(387, 0);\n            labelGPUFan.Margin = new Padding(8, 0, 8, 0);\n            labelGPUFan.Name = \"labelGPUFan\";\n            labelGPUFan.Size = new Size(400, 35);\n            labelGPUFan.TabIndex = 20;\n            labelGPUFan.Text = \"         \";\n            labelGPUFan.TextAlign = ContentAlignment.TopRight;\n            // \n            // panelScreen\n            // \n            panelScreen.AccessibleRole = AccessibleRole.Grouping;\n            panelScreen.AutoSize = true;\n            panelScreen.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelScreen.Controls.Add(labelTipScreen);\n            panelScreen.Controls.Add(tableScreen);\n            panelScreen.Controls.Add(panelScreenTitle);\n            panelScreen.Dock = DockStyle.Top;\n            panelScreen.Location = new Point(11, 651);\n            panelScreen.Margin = new Padding(0);\n            panelScreen.Name = \"panelScreen\";\n            panelScreen.Padding = new Padding(20, 11, 20, 0);\n            panelScreen.Size = new Size(827, 187);\n            panelScreen.TabIndex = 2;\n            panelScreen.TabStop = true;\n            // \n            // labelTipScreen\n            // \n            labelTipScreen.Dock = DockStyle.Top;\n            labelTipScreen.ForeColor = SystemColors.GrayText;\n            labelTipScreen.Location = new Point(20, 151);\n            labelTipScreen.Margin = new Padding(4, 0, 4, 0);\n            labelTipScreen.Name = \"labelTipScreen\";\n            labelTipScreen.Size = new Size(787, 36);\n            labelTipScreen.TabIndex = 24;\n            // \n            // tableScreen\n            // \n            tableScreen.AutoSize = true;\n            tableScreen.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            tableScreen.ColumnCount = 4;\n            tableScreen.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableScreen.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableScreen.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableScreen.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableScreen.Controls.Add(buttonScreenAuto, 0, 0);\n            tableScreen.Controls.Add(button60Hz, 1, 0);\n            tableScreen.Controls.Add(button120Hz, 2, 0);\n            tableScreen.Controls.Add(buttonMiniled, 3, 0);\n            tableScreen.Controls.Add(buttonFHD, 3, 0);\n            tableScreen.Controls.Add(buttonHDRControl, 3, 0);\n            tableScreen.Dock = DockStyle.Top;\n            tableScreen.Location = new Point(20, 51);\n            tableScreen.Margin = new Padding(8, 4, 8, 4);\n            tableScreen.Name = \"tableScreen\";\n            tableScreen.RowCount = 1;\n            tableScreen.RowStyles.Add(new RowStyle(SizeType.Absolute, 80F));\n            tableScreen.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F));\n            tableScreen.Size = new Size(787, 100);\n            tableScreen.TabIndex = 23;\n            // \n            // buttonScreenAuto\n            // \n            buttonScreenAuto.Activated = false;\n            buttonScreenAuto.BackColor = SystemColors.ControlLightLight;\n            buttonScreenAuto.BorderColor = Color.Transparent;\n            buttonScreenAuto.BorderRadius = 5;\n            buttonScreenAuto.Dock = DockStyle.Fill;\n            buttonScreenAuto.FlatAppearance.BorderSize = 0;\n            buttonScreenAuto.FlatStyle = FlatStyle.Flat;\n            buttonScreenAuto.ForeColor = SystemColors.ControlText;\n            buttonScreenAuto.Location = new Point(4, 4);\n            buttonScreenAuto.Margin = new Padding(4);\n            buttonScreenAuto.Name = \"buttonScreenAuto\";\n            buttonScreenAuto.Secondary = false;\n            buttonScreenAuto.Size = new Size(188, 72);\n            buttonScreenAuto.TabIndex = 9;\n            buttonScreenAuto.Text = Properties.Strings.AutoMode;\n            buttonScreenAuto.UseVisualStyleBackColor = false;\n            // \n            // button60Hz\n            // \n            button60Hz.Activated = false;\n            button60Hz.BackColor = SystemColors.ControlLightLight;\n            button60Hz.BorderColor = Color.Transparent;\n            button60Hz.BorderRadius = 5;\n            button60Hz.CausesValidation = false;\n            button60Hz.Dock = DockStyle.Fill;\n            button60Hz.FlatAppearance.BorderSize = 0;\n            button60Hz.FlatStyle = FlatStyle.Flat;\n            button60Hz.ForeColor = SystemColors.ControlText;\n            button60Hz.Location = new Point(200, 4);\n            button60Hz.Margin = new Padding(4);\n            button60Hz.Name = \"button60Hz\";\n            button60Hz.Secondary = false;\n            button60Hz.Size = new Size(188, 72);\n            button60Hz.TabIndex = 10;\n            button60Hz.Text = \"60Hz\";\n            button60Hz.UseVisualStyleBackColor = false;\n            // \n            // button120Hz\n            // \n            button120Hz.Activated = false;\n            button120Hz.BackColor = SystemColors.ControlLightLight;\n            button120Hz.BorderColor = Color.Transparent;\n            button120Hz.BorderRadius = 5;\n            button120Hz.Dock = DockStyle.Fill;\n            button120Hz.FlatAppearance.BorderSize = 0;\n            button120Hz.FlatStyle = FlatStyle.Flat;\n            button120Hz.ForeColor = SystemColors.ControlText;\n            button120Hz.Location = new Point(396, 4);\n            button120Hz.Margin = new Padding(4);\n            button120Hz.Name = \"button120Hz\";\n            button120Hz.Secondary = false;\n            button120Hz.Size = new Size(188, 72);\n            button120Hz.TabIndex = 11;\n            button120Hz.Text = \"120Hz + OD\";\n            button120Hz.UseVisualStyleBackColor = false;\n            // \n            // buttonMiniled\n            // \n            buttonMiniled.Activated = false;\n            buttonMiniled.BackColor = SystemColors.ControlLightLight;\n            buttonMiniled.BorderColor = Color.Transparent;\n            buttonMiniled.BorderRadius = 5;\n            buttonMiniled.CausesValidation = false;\n            buttonMiniled.Dock = DockStyle.Fill;\n            buttonMiniled.FlatAppearance.BorderSize = 0;\n            buttonMiniled.FlatStyle = FlatStyle.Flat;\n            buttonMiniled.ForeColor = SystemColors.ControlText;\n            buttonMiniled.Location = new Point(592, 4);\n            buttonMiniled.Margin = new Padding(4);\n            buttonMiniled.Name = \"buttonMiniled\";\n            buttonMiniled.Secondary = false;\n            buttonMiniled.Size = new Size(191, 72);\n            buttonMiniled.TabIndex = 12;\n            buttonMiniled.Text = Properties.Strings.Multizone;\n            buttonMiniled.UseVisualStyleBackColor = false;\n            // \n            // buttonFHD\n            // \n            buttonFHD.Activated = false;\n            buttonFHD.BackColor = SystemColors.ControlLightLight;\n            buttonFHD.BorderColor = Color.Transparent;\n            buttonFHD.BorderRadius = 5;\n            buttonFHD.CausesValidation = false;\n            buttonFHD.Dock = DockStyle.Fill;\n            buttonFHD.FlatAppearance.BorderSize = 0;\n            buttonFHD.FlatStyle = FlatStyle.Flat;\n            buttonFHD.ForeColor = SystemColors.ControlText;\n            buttonFHD.Location = new Point(4, 84);\n            buttonFHD.Margin = new Padding(4);\n            buttonFHD.Name = \"buttonFHD\";\n            buttonFHD.Secondary = false;\n            buttonFHD.Size = new Size(188, 12);\n            buttonFHD.TabIndex = 13;\n            buttonFHD.Text = \"FHD\";\n            buttonFHD.UseVisualStyleBackColor = false;\n            buttonFHD.Visible = false;\n            // \n            // panelScreenTitle\n            // \n            panelScreenTitle.Controls.Add(labelMidFan);\n            panelScreenTitle.Controls.Add(pictureScreen);\n            panelScreenTitle.Controls.Add(labelSreen);\n            panelScreenTitle.Dock = DockStyle.Top;\n            panelScreenTitle.Location = new Point(20, 11);\n            panelScreenTitle.Margin = new Padding(4);\n            panelScreenTitle.Name = \"panelScreenTitle\";\n            panelScreenTitle.Size = new Size(787, 40);\n            panelScreenTitle.TabIndex = 25;\n            // \n            // labelMidFan\n            // \n            labelMidFan.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            labelMidFan.Location = new Point(500, 0);\n            labelMidFan.Margin = new Padding(8, 0, 8, 0);\n            labelMidFan.Name = \"labelMidFan\";\n            labelMidFan.Size = new Size(285, 35);\n            labelMidFan.TabIndex = 28;\n            labelMidFan.Text = \"         \";\n            labelMidFan.TextAlign = ContentAlignment.TopRight;\n            // \n            // pictureScreen\n            // \n            pictureScreen.BackgroundImage = Properties.Resources.icons8_laptop_32;\n            pictureScreen.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureScreen.Location = new Point(8, 3);\n            pictureScreen.Margin = new Padding(4);\n            pictureScreen.Name = \"pictureScreen\";\n            pictureScreen.Size = new Size(32, 32);\n            pictureScreen.TabIndex = 27;\n            pictureScreen.TabStop = false;\n            // \n            // labelSreen\n            // \n            labelSreen.AutoSize = true;\n            labelSreen.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelSreen.Location = new Point(40, 0);\n            labelSreen.Margin = new Padding(4, 0, 4, 0);\n            labelSreen.Name = \"labelSreen\";\n            labelSreen.Size = new Size(176, 32);\n            labelSreen.TabIndex = 26;\n            labelSreen.Text = \"Laptop Screen\";\n            // \n            // panelKeyboard\n            // \n            panelKeyboard.AccessibleRole = AccessibleRole.Grouping;\n            panelKeyboard.AutoSize = true;\n            panelKeyboard.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelKeyboard.Controls.Add(labelBacklight);\n            panelKeyboard.Controls.Add(tableLayoutKeyboard);\n            panelKeyboard.Controls.Add(panelKeyboardTitle);\n            panelKeyboard.Dock = DockStyle.Top;\n            panelKeyboard.Location = new Point(11, 1394);\n            panelKeyboard.Margin = new Padding(0);\n            panelKeyboard.Name = \"panelKeyboard\";\n            panelKeyboard.Padding = new Padding(20, 20, 20, 0);\n            panelKeyboard.Size = new Size(827, 146);\n            panelKeyboard.TabIndex = 4;\n            panelKeyboard.TabStop = true;\n            // \n            // labelBacklight\n            // \n            labelBacklight.Cursor = Cursors.Hand;\n            labelBacklight.Dock = DockStyle.Top;\n            labelBacklight.Font = new Font(\"Segoe UI\", 9F);\n            labelBacklight.ForeColor = SystemColors.GrayText;\n            labelBacklight.Location = new Point(20, 112);\n            labelBacklight.Margin = new Padding(4, 0, 4, 0);\n            labelBacklight.Name = \"labelBacklight\";\n            labelBacklight.Padding = new Padding(4, 0, 4, 0);\n            labelBacklight.Size = new Size(787, 34);\n            labelBacklight.TabIndex = 43;\n            // \n            // tableLayoutKeyboard\n            // \n            tableLayoutKeyboard.AutoSize = true;\n            tableLayoutKeyboard.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            tableLayoutKeyboard.ColumnCount = 3;\n            tableLayoutKeyboard.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33F));\n            tableLayoutKeyboard.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33F));\n            tableLayoutKeyboard.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33F));\n            tableLayoutKeyboard.Controls.Add(buttonKeyboard, 0, 0);\n            tableLayoutKeyboard.Controls.Add(panelColor, 0, 0);\n            tableLayoutKeyboard.Controls.Add(comboKeyboard, 0, 0);\n            tableLayoutKeyboard.Dock = DockStyle.Top;\n            tableLayoutKeyboard.Location = new Point(20, 60);\n            tableLayoutKeyboard.Margin = new Padding(8, 4, 8, 4);\n            tableLayoutKeyboard.Name = \"tableLayoutKeyboard\";\n            tableLayoutKeyboard.RowCount = 1;\n            tableLayoutKeyboard.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));\n            tableLayoutKeyboard.Size = new Size(787, 52);\n            tableLayoutKeyboard.TabIndex = 39;\n            // \n            // buttonKeyboard\n            // \n            buttonKeyboard.Activated = false;\n            buttonKeyboard.AutoSize = true;\n            buttonKeyboard.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            buttonKeyboard.BackColor = SystemColors.ControlLight;\n            buttonKeyboard.BorderColor = Color.Transparent;\n            buttonKeyboard.BorderRadius = 2;\n            buttonKeyboard.Dock = DockStyle.Top;\n            buttonKeyboard.FlatAppearance.BorderSize = 0;\n            buttonKeyboard.FlatStyle = FlatStyle.Flat;\n            buttonKeyboard.Image = Properties.Resources.icons8_settings_32;\n            buttonKeyboard.ImageAlign = ContentAlignment.MiddleRight;\n            buttonKeyboard.Location = new Point(528, 4);\n            buttonKeyboard.Margin = new Padding(4);\n            buttonKeyboard.MaximumSize = new Size(0, 48);\n            buttonKeyboard.MinimumSize = new Size(0, 44);\n            buttonKeyboard.Name = \"buttonKeyboard\";\n            buttonKeyboard.Secondary = true;\n            buttonKeyboard.Size = new Size(255, 44);\n            buttonKeyboard.TabIndex = 37;\n            buttonKeyboard.Text = \"&Extra\";\n            buttonKeyboard.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonKeyboard.UseVisualStyleBackColor = false;\n            // \n            // panelColor\n            // \n            panelColor.AutoSize = true;\n            panelColor.Controls.Add(pictureColor2);\n            panelColor.Controls.Add(pictureColor);\n            panelColor.Controls.Add(buttonKeyboardColor);\n            panelColor.Dock = DockStyle.Fill;\n            panelColor.Location = new Point(266, 4);\n            panelColor.Margin = new Padding(4);\n            panelColor.Name = \"panelColor\";\n            panelColor.Size = new Size(254, 44);\n            panelColor.TabIndex = 36;\n            // \n            // pictureColor2\n            // \n            pictureColor2.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            pictureColor2.Location = new Point(187, 13);\n            pictureColor2.Margin = new Padding(8);\n            pictureColor2.Name = \"pictureColor2\";\n            pictureColor2.Size = new Size(20, 20);\n            pictureColor2.TabIndex = 41;\n            pictureColor2.TabStop = false;\n            // \n            // pictureColor\n            // \n            pictureColor.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            pictureColor.Location = new Point(218, 13);\n            pictureColor.Margin = new Padding(8);\n            pictureColor.Name = \"pictureColor\";\n            pictureColor.Size = new Size(20, 20);\n            pictureColor.TabIndex = 40;\n            pictureColor.TabStop = false;\n            // \n            // buttonKeyboardColor\n            // \n            buttonKeyboardColor.Activated = false;\n            buttonKeyboardColor.AutoSize = true;\n            buttonKeyboardColor.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            buttonKeyboardColor.BackColor = SystemColors.ButtonHighlight;\n            buttonKeyboardColor.BorderColor = Color.Transparent;\n            buttonKeyboardColor.BorderRadius = 2;\n            buttonKeyboardColor.Dock = DockStyle.Top;\n            buttonKeyboardColor.FlatStyle = FlatStyle.Flat;\n            buttonKeyboardColor.ForeColor = SystemColors.ControlText;\n            buttonKeyboardColor.Location = new Point(0, 0);\n            buttonKeyboardColor.Margin = new Padding(4);\n            buttonKeyboardColor.MaximumSize = new Size(0, 48);\n            buttonKeyboardColor.MinimumSize = new Size(0, 44);\n            buttonKeyboardColor.Name = \"buttonKeyboardColor\";\n            buttonKeyboardColor.Secondary = false;\n            buttonKeyboardColor.Size = new Size(254, 44);\n            buttonKeyboardColor.TabIndex = 14;\n            buttonKeyboardColor.Text = Properties.Strings.Color;\n            buttonKeyboardColor.UseVisualStyleBackColor = false;\n            // \n            // comboKeyboard\n            // \n            comboKeyboard.BorderColor = Color.White;\n            comboKeyboard.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboKeyboard.Dock = DockStyle.Top;\n            comboKeyboard.FlatStyle = FlatStyle.Flat;\n            comboKeyboard.Font = new Font(\"Segoe UI\", 9F);\n            comboKeyboard.FormattingEnabled = true;\n            comboKeyboard.ItemHeight = 32;\n            comboKeyboard.Items.AddRange(new object[] { \"Static\", \"Breathe\", \"Rainbow\", \"Strobe\" });\n            comboKeyboard.Location = new Point(7, 7);\n            comboKeyboard.Margin = new Padding(7, 7, 7, 4);\n            comboKeyboard.Name = \"comboKeyboard\";\n            comboKeyboard.Size = new Size(248, 40);\n            comboKeyboard.TabIndex = 13;\n            // \n            // panelKeyboardTitle\n            // \n            panelKeyboardTitle.Controls.Add(buttonFnLock);\n            panelKeyboardTitle.Controls.Add(pictureKeyboard);\n            panelKeyboardTitle.Controls.Add(labelKeyboard);\n            panelKeyboardTitle.Dock = DockStyle.Top;\n            panelKeyboardTitle.Location = new Point(20, 20);\n            panelKeyboardTitle.Margin = new Padding(0);\n            panelKeyboardTitle.Name = \"panelKeyboardTitle\";\n            panelKeyboardTitle.Padding = new Padding(0, 0, 5, 0);\n            panelKeyboardTitle.Size = new Size(787, 40);\n            panelKeyboardTitle.TabIndex = 40;\n            // \n            // buttonFnLock\n            // \n            buttonFnLock.Activated = false;\n            buttonFnLock.BackColor = SystemColors.ControlLight;\n            buttonFnLock.BorderColor = Color.Transparent;\n            buttonFnLock.BorderRadius = 2;\n            buttonFnLock.Dock = DockStyle.Right;\n            buttonFnLock.FlatAppearance.BorderSize = 0;\n            buttonFnLock.FlatStyle = FlatStyle.Flat;\n            buttonFnLock.Font = new Font(\"Segoe UI\", 7.125F, FontStyle.Bold);\n            buttonFnLock.ForeColor = SystemColors.ControlDark;\n            buttonFnLock.Location = new Point(675, 0);\n            buttonFnLock.Margin = new Padding(0);\n            buttonFnLock.Name = \"buttonFnLock\";\n            buttonFnLock.Secondary = true;\n            buttonFnLock.Size = new Size(107, 40);\n            buttonFnLock.TabIndex = 4;\n            buttonFnLock.Text = \"FN-Lock\";\n            buttonFnLock.UseVisualStyleBackColor = false;\n            // \n            // pictureKeyboard\n            // \n            pictureKeyboard.BackgroundImage = Properties.Resources.icons8_keyboard_32__1_;\n            pictureKeyboard.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureKeyboard.Location = new Point(8, 0);\n            pictureKeyboard.Margin = new Padding(4);\n            pictureKeyboard.Name = \"pictureKeyboard\";\n            pictureKeyboard.Size = new Size(32, 32);\n            pictureKeyboard.TabIndex = 35;\n            pictureKeyboard.TabStop = false;\n            // \n            // labelKeyboard\n            // \n            labelKeyboard.AutoSize = true;\n            labelKeyboard.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelKeyboard.Location = new Point(43, 0);\n            labelKeyboard.Margin = new Padding(4, 0, 4, 0);\n            labelKeyboard.Name = \"labelKeyboard\";\n            labelKeyboard.Size = new Size(210, 32);\n            labelKeyboard.TabIndex = 34;\n            labelKeyboard.Text = \"Laptop Keyboard\";\n            // \n            // panelStartup\n            // \n            panelStartup.Controls.Add(labelCharge);\n            panelStartup.Controls.Add(checkStartup);\n            panelStartup.Dock = DockStyle.Top;\n            panelStartup.Location = new Point(11, 1787);\n            panelStartup.Margin = new Padding(0);\n            panelStartup.Name = \"panelStartup\";\n            panelStartup.Padding = new Padding(20, 0, 20, 0);\n            panelStartup.Size = new Size(827, 50);\n            panelStartup.TabIndex = 6;\n            // \n            // labelCharge\n            // \n            labelCharge.Cursor = Cursors.Hand;\n            labelCharge.Dock = DockStyle.Right;\n            labelCharge.ForeColor = SystemColors.ControlDark;\n            labelCharge.Location = new Point(442, 0);\n            labelCharge.Margin = new Padding(0);\n            labelCharge.Name = \"labelCharge\";\n            labelCharge.Size = new Size(365, 50);\n            labelCharge.TabIndex = 40;\n            labelCharge.TextAlign = ContentAlignment.MiddleRight;\n            // \n            // panelPeripherals\n            // \n            panelPeripherals.AutoSize = true;\n            panelPeripherals.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelPeripherals.Controls.Add(tableLayoutPeripherals);\n            panelPeripherals.Dock = DockStyle.Top;\n            panelPeripherals.Location = new Point(11, 1540);\n            panelPeripherals.Margin = new Padding(0);\n            panelPeripherals.Name = \"panelPeripherals\";\n            panelPeripherals.Padding = new Padding(20, 5, 20, 10);\n            panelPeripherals.Size = new Size(827, 143);\n            panelPeripherals.TabIndex = 4;\n            panelPeripherals.Visible = false;\n            // \n            // tableLayoutPeripherals\n            // \n            tableLayoutPeripherals.AutoSize = true;\n            tableLayoutPeripherals.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            tableLayoutPeripherals.ColumnCount = 3;\n            tableLayoutPeripherals.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableLayoutPeripherals.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableLayoutPeripherals.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableLayoutPeripherals.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));\n            tableLayoutPeripherals.Controls.Add(buttonPeripheral3, 0, 0);\n            tableLayoutPeripherals.Controls.Add(buttonPeripheral2, 0, 0);\n            tableLayoutPeripherals.Controls.Add(buttonPeripheral1, 0, 0);\n            tableLayoutPeripherals.Dock = DockStyle.Top;\n            tableLayoutPeripherals.Location = new Point(20, 5);\n            tableLayoutPeripherals.Margin = new Padding(8, 4, 8, 4);\n            tableLayoutPeripherals.Name = \"tableLayoutPeripherals\";\n            tableLayoutPeripherals.RowCount = 1;\n            tableLayoutPeripherals.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));\n            tableLayoutPeripherals.Size = new Size(787, 128);\n            tableLayoutPeripherals.TabIndex = 43;\n            // \n            // buttonPeripheral3\n            // \n            buttonPeripheral3.Activated = false;\n            buttonPeripheral3.BackColor = SystemColors.ControlLightLight;\n            buttonPeripheral3.BorderColor = Color.Transparent;\n            buttonPeripheral3.BorderRadius = 5;\n            buttonPeripheral3.CausesValidation = false;\n            buttonPeripheral3.Dock = DockStyle.Top;\n            buttonPeripheral3.FlatAppearance.BorderSize = 0;\n            buttonPeripheral3.FlatStyle = FlatStyle.Flat;\n            buttonPeripheral3.Font = new Font(\"Segoe UI\", 8F);\n            buttonPeripheral3.ForeColor = SystemColors.ControlText;\n            buttonPeripheral3.Image = Properties.Resources.icons8_maus_48;\n            buttonPeripheral3.ImageAlign = ContentAlignment.MiddleLeft;\n            buttonPeripheral3.Location = new Point(528, 4);\n            buttonPeripheral3.Margin = new Padding(4);\n            buttonPeripheral3.Name = \"buttonPeripheral3\";\n            buttonPeripheral3.Secondary = false;\n            buttonPeripheral3.Size = new Size(255, 120);\n            buttonPeripheral3.TabIndex = 22;\n            buttonPeripheral3.Text = \"Mouse 3\";\n            buttonPeripheral3.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonPeripheral3.UseVisualStyleBackColor = false;\n            // \n            // buttonPeripheral2\n            // \n            buttonPeripheral2.Activated = false;\n            buttonPeripheral2.BackColor = SystemColors.ControlLightLight;\n            buttonPeripheral2.BorderColor = Color.Transparent;\n            buttonPeripheral2.BorderRadius = 5;\n            buttonPeripheral2.CausesValidation = false;\n            buttonPeripheral2.Dock = DockStyle.Top;\n            buttonPeripheral2.FlatAppearance.BorderSize = 0;\n            buttonPeripheral2.FlatStyle = FlatStyle.Flat;\n            buttonPeripheral2.Font = new Font(\"Segoe UI\", 8F);\n            buttonPeripheral2.ForeColor = SystemColors.ControlText;\n            buttonPeripheral2.Image = Properties.Resources.icons8_maus_48;\n            buttonPeripheral2.ImageAlign = ContentAlignment.MiddleLeft;\n            buttonPeripheral2.Location = new Point(266, 4);\n            buttonPeripheral2.Margin = new Padding(4);\n            buttonPeripheral2.Name = \"buttonPeripheral2\";\n            buttonPeripheral2.Secondary = false;\n            buttonPeripheral2.Size = new Size(254, 120);\n            buttonPeripheral2.TabIndex = 19;\n            buttonPeripheral2.Text = \"Mouse 2\";\n            buttonPeripheral2.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonPeripheral2.UseVisualStyleBackColor = false;\n            // \n            // buttonPeripheral1\n            // \n            buttonPeripheral1.Activated = false;\n            buttonPeripheral1.BackColor = SystemColors.ControlLightLight;\n            buttonPeripheral1.BorderColor = Color.Transparent;\n            buttonPeripheral1.BorderRadius = 5;\n            buttonPeripheral1.CausesValidation = false;\n            buttonPeripheral1.Dock = DockStyle.Top;\n            buttonPeripheral1.FlatAppearance.BorderSize = 0;\n            buttonPeripheral1.FlatStyle = FlatStyle.Flat;\n            buttonPeripheral1.Font = new Font(\"Segoe UI\", 8F);\n            buttonPeripheral1.ForeColor = SystemColors.ControlText;\n            buttonPeripheral1.Image = Properties.Resources.icons8_maus_48;\n            buttonPeripheral1.ImageAlign = ContentAlignment.MiddleLeft;\n            buttonPeripheral1.Location = new Point(4, 4);\n            buttonPeripheral1.Margin = new Padding(4);\n            buttonPeripheral1.Name = \"buttonPeripheral1\";\n            buttonPeripheral1.Secondary = false;\n            buttonPeripheral1.Size = new Size(254, 120);\n            buttonPeripheral1.TabIndex = 20;\n            buttonPeripheral1.Text = \"Mouse 1\";\n            buttonPeripheral1.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonPeripheral1.UseVisualStyleBackColor = false;\n            // \n            // panelAlly\n            // \n            panelAlly.AccessibleRole = AccessibleRole.Grouping;\n            panelAlly.AutoSize = true;\n            panelAlly.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelAlly.Controls.Add(tableLayoutAlly);\n            panelAlly.Controls.Add(panelAllyTitle);\n            panelAlly.Dock = DockStyle.Top;\n            panelAlly.Location = new Point(11, 1254);\n            panelAlly.Margin = new Padding(0);\n            panelAlly.Name = \"panelAlly\";\n            panelAlly.Padding = new Padding(20, 20, 20, 0);\n            panelAlly.Size = new Size(827, 140);\n            panelAlly.TabIndex = 8;\n            panelAlly.TabStop = true;\n            panelAlly.Visible = false;\n            // \n            // tableLayoutAlly\n            // \n            tableLayoutAlly.AutoSize = true;\n            tableLayoutAlly.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            tableLayoutAlly.ColumnCount = 3;\n            tableLayoutAlly.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33F));\n            tableLayoutAlly.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33F));\n            tableLayoutAlly.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33F));\n            tableLayoutAlly.Controls.Add(buttonController, 0, 0);\n            tableLayoutAlly.Controls.Add(buttonBacklight, 0, 0);\n            tableLayoutAlly.Controls.Add(buttonControllerMode, 0, 0);\n            tableLayoutAlly.Dock = DockStyle.Top;\n            tableLayoutAlly.Location = new Point(20, 60);\n            tableLayoutAlly.Margin = new Padding(8, 4, 8, 4);\n            tableLayoutAlly.Name = \"tableLayoutAlly\";\n            tableLayoutAlly.RowCount = 1;\n            tableLayoutAlly.RowStyles.Add(new RowStyle(SizeType.Absolute, 80F));\n            tableLayoutAlly.Size = new Size(787, 80);\n            tableLayoutAlly.TabIndex = 23;\n            // \n            // buttonController\n            // \n            buttonController.Activated = false;\n            buttonController.BackColor = SystemColors.ControlLight;\n            buttonController.BorderColor = Color.Transparent;\n            buttonController.BorderRadius = 5;\n            buttonController.Dock = DockStyle.Fill;\n            buttonController.FlatAppearance.BorderSize = 0;\n            buttonController.FlatStyle = FlatStyle.Flat;\n            buttonController.ForeColor = SystemColors.ControlText;\n            buttonController.Image = Properties.Resources.icons8_controls_32;\n            buttonController.ImageAlign = ContentAlignment.MiddleRight;\n            buttonController.Location = new Point(528, 4);\n            buttonController.Margin = new Padding(4);\n            buttonController.Name = \"buttonController\";\n            buttonController.Secondary = true;\n            buttonController.Size = new Size(255, 72);\n            buttonController.TabIndex = 11;\n            buttonController.Text = \"Controller\";\n            buttonController.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonController.UseVisualStyleBackColor = false;\n            // \n            // buttonBacklight\n            // \n            buttonBacklight.Activated = false;\n            buttonBacklight.BackColor = SystemColors.ControlLightLight;\n            buttonBacklight.BorderColor = Color.Transparent;\n            buttonBacklight.BorderRadius = 5;\n            buttonBacklight.Dock = DockStyle.Fill;\n            buttonBacklight.FlatAppearance.BorderSize = 0;\n            buttonBacklight.FlatStyle = FlatStyle.Flat;\n            buttonBacklight.ForeColor = SystemColors.ControlText;\n            buttonBacklight.Image = Properties.Resources.backlight;\n            buttonBacklight.ImageAlign = ContentAlignment.MiddleRight;\n            buttonBacklight.Location = new Point(266, 4);\n            buttonBacklight.Margin = new Padding(4);\n            buttonBacklight.Name = \"buttonBacklight\";\n            buttonBacklight.Secondary = false;\n            buttonBacklight.Size = new Size(254, 72);\n            buttonBacklight.TabIndex = 10;\n            buttonBacklight.Text = \"100%\";\n            buttonBacklight.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonBacklight.UseVisualStyleBackColor = false;\n            // \n            // buttonControllerMode\n            // \n            buttonControllerMode.Activated = false;\n            buttonControllerMode.BackColor = SystemColors.ControlLightLight;\n            buttonControllerMode.BorderColor = Color.Transparent;\n            buttonControllerMode.BorderRadius = 5;\n            buttonControllerMode.Dock = DockStyle.Fill;\n            buttonControllerMode.FlatAppearance.BorderSize = 0;\n            buttonControllerMode.FlatStyle = FlatStyle.Flat;\n            buttonControllerMode.ForeColor = SystemColors.ControlText;\n            buttonControllerMode.Image = Properties.Resources.icons8_game_controller_48;\n            buttonControllerMode.ImageAlign = ContentAlignment.MiddleRight;\n            buttonControllerMode.Location = new Point(4, 4);\n            buttonControllerMode.Margin = new Padding(4);\n            buttonControllerMode.Name = \"buttonControllerMode\";\n            buttonControllerMode.Secondary = false;\n            buttonControllerMode.Size = new Size(254, 72);\n            buttonControllerMode.TabIndex = 9;\n            buttonControllerMode.Text = Properties.Strings.AutoMode;\n            buttonControllerMode.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonControllerMode.UseVisualStyleBackColor = false;\n            // \n            // panelAllyTitle\n            // \n            panelAllyTitle.Controls.Add(pictureAlly);\n            panelAllyTitle.Controls.Add(labelAlly);\n            panelAllyTitle.Dock = DockStyle.Top;\n            panelAllyTitle.Location = new Point(20, 20);\n            panelAllyTitle.Margin = new Padding(4);\n            panelAllyTitle.Name = \"panelAllyTitle\";\n            panelAllyTitle.Size = new Size(787, 40);\n            panelAllyTitle.TabIndex = 25;\n            // \n            // pictureAlly\n            // \n            pictureAlly.BackgroundImage = Properties.Resources.icons8_controller_32;\n            pictureAlly.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureAlly.Location = new Point(8, 0);\n            pictureAlly.Margin = new Padding(4);\n            pictureAlly.Name = \"pictureAlly\";\n            pictureAlly.Size = new Size(32, 32);\n            pictureAlly.TabIndex = 27;\n            pictureAlly.TabStop = false;\n            // \n            // labelAlly\n            // \n            labelAlly.AutoSize = true;\n            labelAlly.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelAlly.Location = new Point(43, 0);\n            labelAlly.Margin = new Padding(4, 0, 4, 0);\n            labelAlly.Name = \"labelAlly\";\n            labelAlly.Size = new Size(181, 32);\n            labelAlly.TabIndex = 26;\n            labelAlly.Text = \"Ally Controller\";\n            // \n            // panelGamma\n            // \n            panelGamma.AutoSize = true;\n            panelGamma.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelGamma.Controls.Add(labelVisual);\n            panelGamma.Controls.Add(tableVisual);\n            panelGamma.Controls.Add(sliderGamma);\n            panelGamma.Controls.Add(panelGammaTitle);\n            panelGamma.Dock = DockStyle.Top;\n            panelGamma.Location = new Point(11, 838);\n            panelGamma.Margin = new Padding(0);\n            panelGamma.Name = \"panelGamma\";\n            panelGamma.Padding = new Padding(20, 11, 20, 11);\n            panelGamma.Size = new Size(827, 233);\n            panelGamma.TabIndex = 9;\n            panelGamma.Visible = false;\n            // \n            // labelVisual\n            // \n            labelVisual.Cursor = Cursors.Hand;\n            labelVisual.ForeColor = SystemColors.GrayText;\n            labelVisual.Location = new Point(20, 170);\n            labelVisual.Margin = new Padding(4, 0, 4, 0);\n            labelVisual.Name = \"labelVisual\";\n            labelVisual.Padding = new Padding(4);\n            labelVisual.Size = new Size(800, 52);\n            labelVisual.TabIndex = 42;\n            labelVisual.Text = \"Visual Modes are not available when HDR is active\";\n            labelVisual.Visible = false;\n            // \n            // tableVisual\n            // \n            tableVisual.AutoSize = true;\n            tableVisual.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            tableVisual.ColumnCount = 3;\n            tableVisual.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33.3333321F));\n            tableVisual.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33.3333321F));\n            tableVisual.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33.3333321F));\n            tableVisual.Controls.Add(buttonInstallColor, 0, 0);\n            tableVisual.Controls.Add(comboVisual, 0, 0);\n            tableVisual.Controls.Add(comboColorTemp, 1, 0);\n            tableVisual.Controls.Add(comboGamut, 2, 0);\n            tableVisual.Dock = DockStyle.Top;\n            tableVisual.Location = new Point(20, 91);\n            tableVisual.Margin = new Padding(8, 4, 8, 4);\n            tableVisual.Name = \"tableVisual\";\n            tableVisual.Padding = new Padding(3, 0, 3, 0);\n            tableVisual.RowCount = 1;\n            tableVisual.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));\n            tableVisual.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F));\n            tableVisual.Size = new Size(787, 79);\n            tableVisual.TabIndex = 41;\n            tableVisual.Visible = false;\n            // \n            // buttonInstallColor\n            // \n            buttonInstallColor.Activated = false;\n            buttonInstallColor.BackColor = SystemColors.ControlLight;\n            buttonInstallColor.BorderColor = Color.Transparent;\n            buttonInstallColor.BorderRadius = 2;\n            buttonInstallColor.Dock = DockStyle.Top;\n            buttonInstallColor.FlatAppearance.BorderSize = 0;\n            buttonInstallColor.FlatStyle = FlatStyle.Flat;\n            buttonInstallColor.Image = Properties.Resources.icons8_color_32;\n            buttonInstallColor.ImageAlign = ContentAlignment.MiddleRight;\n            buttonInstallColor.Location = new Point(267, 4);\n            buttonInstallColor.Margin = new Padding(4);\n            buttonInstallColor.Name = \"buttonInstallColor\";\n            buttonInstallColor.Secondary = true;\n            buttonInstallColor.Size = new Size(252, 51);\n            buttonInstallColor.TabIndex = 38;\n            buttonInstallColor.Text = \"Install Colors\";\n            buttonInstallColor.TextImageRelation = TextImageRelation.ImageBeforeText;\n            buttonInstallColor.UseVisualStyleBackColor = false;\n            buttonInstallColor.Visible = false;\n            // \n            // comboVisual\n            // \n            comboVisual.BorderColor = Color.White;\n            comboVisual.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboVisual.Dock = DockStyle.Top;\n            comboVisual.FlatStyle = FlatStyle.Flat;\n            comboVisual.Font = new Font(\"Segoe UI\", 9F);\n            comboVisual.FormattingEnabled = true;\n            comboVisual.ItemHeight = 32;\n            comboVisual.Location = new Point(10, 8);\n            comboVisual.Margin = new Padding(7, 8, 7, 4);\n            comboVisual.Name = \"comboVisual\";\n            comboVisual.Size = new Size(246, 40);\n            comboVisual.TabIndex = 14;\n            comboVisual.Visible = false;\n            // \n            // comboColorTemp\n            // \n            comboColorTemp.BorderColor = Color.White;\n            comboColorTemp.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboColorTemp.Dock = DockStyle.Top;\n            comboColorTemp.FlatStyle = FlatStyle.Flat;\n            comboColorTemp.Font = new Font(\"Segoe UI\", 9F);\n            comboColorTemp.FormattingEnabled = true;\n            comboColorTemp.ItemHeight = 32;\n            comboColorTemp.Location = new Point(530, 8);\n            comboColorTemp.Margin = new Padding(7, 8, 7, 4);\n            comboColorTemp.Name = \"comboColorTemp\";\n            comboColorTemp.Size = new Size(247, 40);\n            comboColorTemp.TabIndex = 15;\n            comboColorTemp.Visible = false;\n            // \n            // comboGamut\n            // \n            comboGamut.BorderColor = Color.White;\n            comboGamut.ButtonColor = Color.FromArgb(255, 255, 255);\n            comboGamut.Dock = DockStyle.Top;\n            comboGamut.FlatStyle = FlatStyle.Flat;\n            comboGamut.Font = new Font(\"Segoe UI\", 9F);\n            comboGamut.FormattingEnabled = true;\n            comboGamut.ItemHeight = 32;\n            comboGamut.Location = new Point(10, 67);\n            comboGamut.Margin = new Padding(7, 8, 7, 4);\n            comboGamut.Name = \"comboGamut\";\n            comboGamut.Size = new Size(246, 40);\n            comboGamut.TabIndex = 13;\n            comboGamut.Visible = false;\n            // \n            // sliderGamma\n            // \n            sliderGamma.Dock = DockStyle.Top;\n            sliderGamma.Location = new Point(20, 51);\n            sliderGamma.Margin = new Padding(4);\n            sliderGamma.Max = 100;\n            sliderGamma.Min = 0;\n            sliderGamma.Name = \"sliderGamma\";\n            sliderGamma.Size = new Size(787, 40);\n            sliderGamma.Step = 5;\n            sliderGamma.TabIndex = 20;\n            sliderGamma.Text = \"sliderGamma\";\n            sliderGamma.Value = 100;\n            sliderGamma.Visible = false;\n            // \n            // panelGammaTitle\n            // \n            panelGammaTitle.Controls.Add(labelGamma);\n            panelGammaTitle.Controls.Add(pictureGamma);\n            panelGammaTitle.Controls.Add(labelGammaTitle);\n            panelGammaTitle.Dock = DockStyle.Top;\n            panelGammaTitle.Location = new Point(20, 11);\n            panelGammaTitle.Margin = new Padding(4);\n            panelGammaTitle.Name = \"panelGammaTitle\";\n            panelGammaTitle.Size = new Size(787, 40);\n            panelGammaTitle.TabIndex = 40;\n            // \n            // labelGamma\n            // \n            labelGamma.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            labelGamma.Location = new Point(675, 0);\n            labelGamma.Margin = new Padding(4, 0, 4, 0);\n            labelGamma.Name = \"labelGamma\";\n            labelGamma.Size = new Size(107, 32);\n            labelGamma.TabIndex = 39;\n            labelGamma.Text = \"                \";\n            labelGamma.TextAlign = ContentAlignment.TopRight;\n            // \n            // pictureGamma\n            // \n            pictureGamma.BackgroundImage = Properties.Resources.icons8_brightness_32;\n            pictureGamma.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureGamma.Location = new Point(8, 3);\n            pictureGamma.Margin = new Padding(4);\n            pictureGamma.Name = \"pictureGamma\";\n            pictureGamma.Size = new Size(32, 32);\n            pictureGamma.TabIndex = 38;\n            pictureGamma.TabStop = false;\n            // \n            // labelGammaTitle\n            // \n            labelGammaTitle.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelGammaTitle.Location = new Point(43, 0);\n            labelGammaTitle.Margin = new Padding(4, 0, 4, 0);\n            labelGammaTitle.Name = \"labelGammaTitle\";\n            labelGammaTitle.Size = new Size(540, 32);\n            labelGammaTitle.TabIndex = 37;\n            labelGammaTitle.Text = \"Flicker-free Dimming\";\n            // \n            // panelVersion\n            // \n            panelVersion.AutoSize = true;\n            panelVersion.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            panelVersion.Controls.Add(buttonEnergySaver);\n            panelVersion.Controls.Add(buttonAmdOled);\n            panelVersion.Controls.Add(buttonArmoury);\n            panelVersion.Controls.Add(labelVersion);\n            panelVersion.Dock = DockStyle.Top;\n            panelVersion.Location = new Point(11, 1837);\n            panelVersion.MinimumSize = new Size(0, 50);\n            panelVersion.Name = \"panelVersion\";\n            panelVersion.Padding = new Padding(20, 5, 24, 5);\n            panelVersion.Size = new Size(827, 50);\n            panelVersion.TabIndex = 10;\n            // \n            // buttonEnergySaver\n            // \n            buttonEnergySaver.Activated = false;\n            buttonEnergySaver.BackColor = SystemColors.ControlLight;\n            buttonEnergySaver.BorderColor = Color.Transparent;\n            buttonEnergySaver.BorderRadius = 2;\n            buttonEnergySaver.Dock = DockStyle.Right;\n            buttonEnergySaver.FlatAppearance.BorderSize = 0;\n            buttonEnergySaver.FlatStyle = FlatStyle.Flat;\n            buttonEnergySaver.Font = new Font(\"Segoe UI\", 7.125F, FontStyle.Bold);\n            buttonEnergySaver.ForeColor = SystemColors.ControlDark;\n            buttonEnergySaver.ImageAlign = ContentAlignment.MiddleLeft;\n            buttonEnergySaver.Location = new Point(640, 5);\n            buttonEnergySaver.Margin = new Padding(0);\n            buttonEnergySaver.Name = \"buttonEnergySaver\";\n            buttonEnergySaver.Secondary = true;\n            buttonEnergySaver.Size = new Size(163, 40);\n            buttonEnergySaver.TabIndex = 39;\n            buttonEnergySaver.Text = \"Energy Saver\";\n            buttonEnergySaver.UseVisualStyleBackColor = false;\n            // \n            // buttonAmdOled\n            // \n            buttonAmdOled.Activated = false;\n            buttonAmdOled.BackColor = SystemColors.ControlLight;\n            buttonAmdOled.BorderColor = Color.Transparent;\n            buttonAmdOled.BorderRadius = 2;\n            buttonAmdOled.Dock = DockStyle.Right;\n            buttonAmdOled.FlatAppearance.BorderSize = 0;\n            buttonAmdOled.FlatStyle = FlatStyle.Flat;\n            buttonAmdOled.Font = new Font(\"Segoe UI\", 7.125F, FontStyle.Bold);\n            buttonAmdOled.ForeColor = SystemColors.ControlDark;\n            buttonAmdOled.ImageAlign = ContentAlignment.MiddleLeft;\n            buttonAmdOled.Location = new Point(640, 5);\n            buttonAmdOled.Margin = new Padding(0);\n            buttonAmdOled.Name = \"buttonAmdOled\";\n            buttonAmdOled.Secondary = true;\n            buttonAmdOled.Size = new Size(180, 40);\n            buttonAmdOled.TabIndex = 39;\n            buttonAmdOled.Text = \"AMD OledSaver\";\n            buttonAmdOled.UseVisualStyleBackColor = false;\n            buttonAmdOled.Visible = false;\n            // \n            // buttonArmoury\n            // \n            buttonArmoury.Activated = false;\n            buttonArmoury.BackColor = SystemColors.ControlLight;\n            buttonArmoury.BorderColor = Color.Transparent;\n            buttonArmoury.BorderRadius = 2;\n            buttonArmoury.Dock = DockStyle.Right;\n            buttonArmoury.FlatAppearance.BorderSize = 0;\n            buttonArmoury.FlatStyle = FlatStyle.Flat;\n            buttonArmoury.Font = new Font(\"Segoe UI\", 7.125F, FontStyle.Bold);\n            buttonArmoury.ForeColor = SystemColors.ControlDark;\n            buttonArmoury.ImageAlign = ContentAlignment.MiddleLeft;\n            buttonArmoury.Location = new Point(640, 5);\n            buttonArmoury.Margin = new Padding(0);\n            buttonArmoury.Name = \"buttonArmoury\";\n            buttonArmoury.Secondary = true;\n            buttonArmoury.Size = new Size(180, 40);\n            buttonArmoury.TabIndex = 40;\n            buttonArmoury.Text = \"ArmouryCrate\";\n            buttonArmoury.UseVisualStyleBackColor = false;\n            buttonArmoury.Visible = false;            \n            // \n            // labelVersion\n            // \n            labelVersion.Cursor = Cursors.Hand;\n            labelVersion.Dock = DockStyle.Left;\n            labelVersion.Font = new Font(\"Segoe UI\", 9F, FontStyle.Underline);\n            labelVersion.ForeColor = SystemColors.ControlDark;\n            labelVersion.Location = new Point(20, 5);\n            labelVersion.Margin = new Padding(0);\n            labelVersion.Name = \"labelVersion\";\n            labelVersion.Padding = new Padding(5, 0, 5, 0);\n            labelVersion.Size = new Size(399, 40);\n            labelVersion.TabIndex = 38;\n            labelVersion.Text = \"v.0\";\n            labelVersion.TextAlign = ContentAlignment.MiddleLeft;\n            // \n            // buttonHDRControl\n            // \n            buttonHDRControl.Activated = false;\n            buttonHDRControl.BackColor = SystemColors.ControlLightLight;\n            buttonHDRControl.BorderColor = Color.Transparent;\n            buttonHDRControl.BorderRadius = 5;\n            buttonHDRControl.CausesValidation = false;\n            buttonHDRControl.Dock = DockStyle.Fill;\n            buttonHDRControl.FlatAppearance.BorderSize = 0;\n            buttonHDRControl.FlatStyle = FlatStyle.Flat;\n            buttonHDRControl.ForeColor = SystemColors.ControlText;\n            buttonHDRControl.Location = new Point(200, 84);\n            buttonHDRControl.Margin = new Padding(4);\n            buttonHDRControl.Name = \"buttonHDRControl\";\n            buttonHDRControl.Secondary = false;\n            buttonHDRControl.Size = new Size(188, 12);\n            buttonHDRControl.TabIndex = 14;\n            buttonHDRControl.Text = \"HDR Color Control\";\n            buttonHDRControl.UseVisualStyleBackColor = false;\n            buttonHDRControl.Visible = false;\n            // \n            // SettingsForm\n            // \n            AutoScaleDimensions = new SizeF(192F, 192F);\n            AutoScaleMode = AutoScaleMode.Dpi;\n            AutoSize = true;\n            AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            ClientSize = new Size(849, 2075);\n            Controls.Add(panelFooter);\n            Controls.Add(panelVersion);\n            Controls.Add(panelStartup);\n            Controls.Add(panelBattery);\n            Controls.Add(panelPeripherals);\n            Controls.Add(panelKeyboard);\n            Controls.Add(panelAlly);\n            Controls.Add(panelMatrix);\n            Controls.Add(panelGamma);\n            Controls.Add(panelScreen);\n            Controls.Add(panelGPU);\n            Controls.Add(panelPerformance);\n            Margin = new Padding(8, 4, 8, 4);\n            MaximizeBox = false;\n            MdiChildrenMinimizedAnchorBottom = false;\n            MinimizeBox = false;\n            MinimumSize = new Size(821, 71);\n            Name = \"SettingsForm\";\n            Padding = new Padding(11);\n            ShowIcon = false;\n            StartPosition = FormStartPosition.CenterScreen;\n            Text = \"G-Helper\";\n            panelMatrix.ResumeLayout(false);\n            panelMatrix.PerformLayout();\n            panelMatrixAuto.ResumeLayout(false);\n            panelMatrixAuto.PerformLayout();\n            tableLayoutMatrix.ResumeLayout(false);\n            tableLayoutMatrix.PerformLayout();\n            panelMatrixTitle.ResumeLayout(false);\n            panelMatrixTitle.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureMatrix).EndInit();\n            panelBattery.ResumeLayout(false);\n            panelBatteryTitle.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)pictureBattery).EndInit();\n            panelFooter.ResumeLayout(false);\n            panelFooter.PerformLayout();\n            tableButtons.ResumeLayout(false);\n            panelPerformance.ResumeLayout(false);\n            panelPerformance.PerformLayout();\n            tablePerf.ResumeLayout(false);\n            panelCPUTitle.ResumeLayout(false);\n            panelCPUTitle.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)picturePerf).EndInit();\n            panelGPU.ResumeLayout(false);\n            panelGPU.PerformLayout();\n            tableAMD.ResumeLayout(false);\n            tableGPU.ResumeLayout(false);\n            panelGPUTitle.ResumeLayout(false);\n            panelGPUTitle.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureGPU).EndInit();\n            panelScreen.ResumeLayout(false);\n            panelScreen.PerformLayout();\n            tableScreen.ResumeLayout(false);\n            panelScreenTitle.ResumeLayout(false);\n            panelScreenTitle.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureScreen).EndInit();\n            panelKeyboard.ResumeLayout(false);\n            panelKeyboard.PerformLayout();\n            tableLayoutKeyboard.ResumeLayout(false);\n            tableLayoutKeyboard.PerformLayout();\n            panelColor.ResumeLayout(false);\n            panelColor.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureColor2).EndInit();\n            ((System.ComponentModel.ISupportInitialize)pictureColor).EndInit();\n            panelKeyboardTitle.ResumeLayout(false);\n            panelKeyboardTitle.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureKeyboard).EndInit();\n            panelStartup.ResumeLayout(false);\n            panelStartup.PerformLayout();\n            panelPeripherals.ResumeLayout(false);\n            panelPeripherals.PerformLayout();\n            tableLayoutPeripherals.ResumeLayout(false);\n            panelAlly.ResumeLayout(false);\n            panelAlly.PerformLayout();\n            tableLayoutAlly.ResumeLayout(false);\n            panelAllyTitle.ResumeLayout(false);\n            panelAllyTitle.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureAlly).EndInit();\n            panelGamma.ResumeLayout(false);\n            panelGamma.PerformLayout();\n            tableVisual.ResumeLayout(false);\n            panelGammaTitle.ResumeLayout(false);\n            ((System.ComponentModel.ISupportInitialize)pictureGamma).EndInit();\n            panelVersion.ResumeLayout(false);\n            ResumeLayout(false);\n            PerformLayout();\n        }\n\n        #endregion\n        private Panel panelMatrix;\n        private Panel panelBattery;\n        private Panel panelFooter;\n        private RButton buttonQuit;\n        private CheckBox checkStartup;\n        private Panel panelPerformance;\n        private TableLayoutPanel tablePerf;\n        private RButton buttonTurbo;\n        private RButton buttonBalanced;\n        private RButton buttonSilent;\n        private Panel panelGPU;\n        private TableLayoutPanel tableGPU;\n        private RButton buttonXGM;\n        private RButton buttonUltimate;\n        private RButton buttonStandard;\n        private RButton buttonEco;\n        private Panel panelScreen;\n        private TableLayoutPanel tableScreen;\n        private RButton buttonScreenAuto;\n        private RButton button60Hz;\n        private Panel panelKeyboard;\n        private TableLayoutPanel tableLayoutMatrix;\n        private RComboBox comboMatrixRunning;\n        private RComboBox comboMatrix;\n        private TableLayoutPanel tableLayoutKeyboard;\n        private RComboBox comboKeyboard;\n        private Panel panelColor;\n        private PictureBox pictureColor2;\n        private PictureBox pictureColor;\n        private CheckBox checkMatrix;\n        private RButton button120Hz;\n        private RButton buttonOptimized;\n        private Label labelTipGPU;\n        private Label labelTipScreen;\n        private RButton buttonMiniled;\n        private RButton buttonMatrix;\n        private RButton buttonKeyboardColor;\n        private RButton buttonFans;\n        private Slider sliderBattery;\n        private Panel panelGPUTitle;\n        private PictureBox pictureGPU;\n        private Label labelGPU;\n        private Label labelGPUFan;\n        private Panel panelCPUTitle;\n        private PictureBox picturePerf;\n        private Label labelPerf;\n        private Label labelCPUFan;\n        private Panel panelScreenTitle;\n        private Label labelMidFan;\n        private PictureBox pictureScreen;\n        private Label labelSreen;\n        private Panel panelKeyboardTitle;\n        private PictureBox pictureKeyboard;\n        private Label labelKeyboard;\n        private Panel panelMatrixTitle;\n        private PictureBox pictureMatrix;\n        private Label labelMatrix;\n        private Panel panelBatteryTitle;\n        private Label labelBattery;\n        private PictureBox pictureBattery;\n        private Label labelBatteryTitle;\n        private Panel panelStartup;\n        private RButton buttonStopGPU;\n        private TableLayoutPanel tableButtons;\n        private Panel panelPeripherals;\n        private TableLayoutPanel tableLayoutPeripherals;\n        private RButton buttonPeripheral2;\n        private RButton buttonPeripheral3;\n        private RButton buttonPeripheral1;\n        private RButton buttonKeyboard;\n        private RButton buttonUpdates;\n        private Label labelCharge;\n        private RButton buttonFnLock;\n        private RButton buttonBatteryFull;\n        private Panel panelAlly;\n        private TableLayoutPanel tableLayoutAlly;\n        private RButton buttonControllerMode;\n        private Panel panelAllyTitle;\n        private Label labelAlly;\n        private PictureBox pictureAlly;\n        private RButton buttonBacklight;\n        private TableLayoutPanel tableAMD;\n        private RButton buttonFPS;\n        private RButton buttonController;\n        private RButton buttonOverlay;\n        private RComboBox comboInterval;\n        private Panel panelGamma;\n        private Slider sliderGamma;\n        private Panel panelGammaTitle;\n        private Label labelGamma;\n        private PictureBox pictureGamma;\n        private Label labelGammaTitle;\n        private CheckBox checkMatrixLid;\n        private Panel panelMatrixAuto;\n        private TableLayoutPanel tableVisual;\n        private RComboBox comboVisual;\n        private RComboBox comboGamut;\n        private RComboBox comboColorTemp;\n        private RButton buttonInstallColor;\n        private Label labelVisual;\n        private RButton buttonFHD;\n        private RButton buttonAutoTDP;\n        private Label labelBacklight;\n        private Panel panelVersion;\n        private Label labelVersion;\n        private RBadgeButton buttonDonate;\n        private RButton buttonEnergySaver;\n        private RButton buttonAmdOled;\n        private RButton buttonArmoury;\n        private RButton buttonHDRControl;\n    }\n}\n"
  },
  {
    "path": "app/Settings.cs",
    "content": "﻿using GHelper.Ally;\nusing GHelper.AnimeMatrix;\nusing GHelper.AutoUpdate;\nusing GHelper.Battery;\nusing GHelper.Display;\nusing GHelper.Fan;\nusing GHelper.Gpu;\nusing GHelper.Helpers;\nusing GHelper.Input;\nusing GHelper.Mode;\nusing GHelper.Peripherals;\nusing GHelper.Peripherals.Mouse;\nusing GHelper.Properties;\nusing GHelper.UI;\nusing GHelper.USB;\nusing System.Diagnostics;\nusing System.Timers;\n\nnamespace GHelper\n{\n    public partial class SettingsForm : RForm\n    {\n        ContextMenuStrip contextMenuStrip = new CustomContextMenu();\n        ToolStripMenuItem menuEco, menuStandard, menuUltimate, menuOptimized;\n\n        public GPUModeControl gpuControl;\n        public AllyControl allyControl;\n        AutoUpdateControl updateControl;\n\n        AsusMouseSettings? mouseSettings;\n\n        public AniMatrixControl matrixControl;\n\n        public static System.Timers.Timer sensorTimer = default!;\n\n        public Matrix? matrixForm;\n        public Fans? fansForm;\n        public Extra? extraForm;\n        public Updates? updatesForm;\n        public Handheld? handheldForm;\n\n        static long lastRefresh;\n        static long lastBatteryRefresh;\n        static long lastLostFocus;\n\n        bool isGpuSection = true;\n\n        bool batteryMouseOver = false;\n        bool batteryFullMouseOver = false;\n\n        bool sliderGammaIgnore = false;\n        bool activateCheck = false;\n\n        public SettingsForm()\n        {\n\n            InitializeComponent();\n            InitTheme(true);\n\n            gpuControl = new GPUModeControl(this);\n            updateControl = new AutoUpdateControl(this);\n            matrixControl = new AniMatrixControl(this);\n            allyControl = new AllyControl(this);\n\n            buttonSilent.Text = Properties.Strings.Silent;\n            buttonBalanced.Text = Properties.Strings.Balanced;\n            buttonTurbo.Text = Properties.Strings.Turbo;\n            buttonFans.Text = Properties.Strings.FansPower;\n\n            buttonEco.Text = Properties.Strings.EcoMode;\n            buttonUltimate.Text = Properties.Strings.UltimateMode;\n            buttonStandard.Text = Properties.Strings.StandardMode;\n            buttonOptimized.Text = Properties.Strings.Optimized;\n            buttonStopGPU.Text = Properties.Strings.StopGPUApps;\n\n            buttonScreenAuto.Text = Properties.Strings.AutoMode;\n            buttonMiniled.Text = Properties.Strings.Multizone;\n\n            buttonKeyboardColor.Text = Properties.Strings.Color;\n            buttonKeyboard.Text = Properties.Strings.Extra;\n\n            labelPerf.Text = Properties.Strings.PerformanceMode;\n            labelGPU.Text = Properties.Strings.GPUMode;\n            labelSreen.Text = Properties.Strings.LaptopScreen;\n            labelKeyboard.Text = Properties.Strings.LaptopKeyboard;\n            labelMatrix.Text = Properties.Strings.AnimeMatrix;\n            labelBatteryTitle.Text = Properties.Strings.BatteryChargeLimit;\n\n            checkMatrix.Text = Properties.Strings.TurnOffOnBattery;\n            checkMatrixLid.Text = Properties.Strings.DisableOnLidClose;\n            checkStartup.Text = Properties.Strings.RunOnStartup;\n\n            buttonMatrix.Text = Properties.Strings.PictureGif;\n            buttonQuit.Text = Properties.Strings.Quit;\n            buttonUpdates.Text = Properties.Strings.Updates;\n            buttonDonate.Text = Properties.Strings.Donate;\n\n            buttonController.Text = Properties.Strings.Controller;\n            labelAlly.Text = Properties.Strings.AllyController;\n\n            // Accessible Labels\n\n            panelMatrix.AccessibleName = Properties.Strings.AnimeMatrix;\n            sliderBattery.AccessibleName = Properties.Strings.BatteryChargeLimit;\n            buttonQuit.AccessibleName = Properties.Strings.Quit;\n            buttonUpdates.AccessibleName = Properties.Strings.BiosAndDriverUpdates;\n            panelPerformance.AccessibleName = Properties.Strings.PerformanceMode;\n            buttonSilent.AccessibleName = Properties.Strings.Silent;\n            buttonBalanced.AccessibleName = Properties.Strings.Balanced;\n            buttonTurbo.AccessibleName = Properties.Strings.Turbo;\n            buttonFans.AccessibleName = Properties.Strings.FansAndPower;\n            panelGPU.AccessibleName = Properties.Strings.GPUMode;\n            buttonEco.AccessibleName = Properties.Strings.EcoMode;\n            buttonStandard.AccessibleName = Properties.Strings.StandardMode;\n            buttonOptimized.AccessibleName = Properties.Strings.Optimized;\n            buttonUltimate.AccessibleName = Properties.Strings.UltimateMode;\n            panelScreen.AccessibleName = Properties.Strings.LaptopScreen;\n\n            buttonScreenAuto.AccessibleName = Properties.Strings.AutoMode;\n            //button60Hz.AccessibleName = \"60Hz Refresh Rate\";\n            //button120Hz.AccessibleName = \"Maximum Refresh Rate\";\n\n            panelKeyboard.AccessibleName = Properties.Strings.LaptopKeyboard;\n            buttonKeyboard.AccessibleName = Properties.Strings.ExtraSettings;\n            buttonKeyboardColor.AccessibleName = Properties.Strings.LaptopKeyboard + \" \" + Properties.Strings.Color;\n            comboKeyboard.AccessibleName = Properties.Strings.LaptopBacklight;\n\n            FormClosing += SettingsForm_FormClosing;\n            Deactivate += SettingsForm_LostFocus;\n            Activated += SettingsForm_Focused;\n\n            buttonSilent.BorderColor = colorEco;\n            buttonBalanced.BorderColor = colorStandard;\n            buttonTurbo.BorderColor = colorTurbo;\n            buttonFans.BorderColor = colorCustom;\n\n            buttonEco.BorderColor = colorEco;\n            buttonStandard.BorderColor = colorStandard;\n            buttonUltimate.BorderColor = colorTurbo;\n            buttonOptimized.BorderColor = colorEco;\n            buttonXGM.BorderColor = colorTurbo;\n\n            button60Hz.BorderColor = colorGray;\n            button120Hz.BorderColor = colorGray;\n            buttonScreenAuto.BorderColor = colorGray;\n            buttonMiniled.BorderColor = colorTurbo;\n\n            buttonEnergySaver.BackColor = colorEco;\n            buttonEnergySaver.ForeColor = SystemColors.ControlLightLight;\n            buttonEnergySaver.Click += ButtonEnergySaver_Click;\n\n            buttonAmdOled.BackColor = colorTurbo;\n            buttonAmdOled.ForeColor = SystemColors.ControlLightLight;\n            buttonAmdOled.Click += ButtonAmdOled_Click;\n\n            buttonArmoury.BackColor = colorTurbo;\n            buttonArmoury.ForeColor = SystemColors.ControlLightLight;\n            buttonArmoury.Click += ButtonArmoury_Click;\n\n            buttonSilent.Click += ButtonSilent_Click;\n            buttonBalanced.Click += ButtonBalanced_Click;\n            buttonTurbo.Click += ButtonTurbo_Click;\n\n            buttonEco.Click += ButtonEco_Click;\n            buttonStandard.Click += ButtonStandard_Click;\n            buttonUltimate.Click += ButtonUltimate_Click;\n            buttonOptimized.Click += ButtonOptimized_Click;\n            buttonStopGPU.Click += ButtonStopGPU_Click;\n\n            VisibleChanged += SettingsForm_VisibleChanged;\n\n            button60Hz.Click += Button60Hz_Click;\n            button120Hz.Click += Button120Hz_Click;\n            buttonScreenAuto.Click += ButtonScreenAuto_Click;\n            buttonMiniled.Click += ButtonMiniled_Click;\n            buttonFHD.Click += ButtonFHD_Click;\n            buttonHDRControl.Click += ButtonHDRControl_Click;\n\n            buttonQuit.Click += ButtonQuit_Click;\n\n            buttonKeyboardColor.Click += ButtonKeyboardColor_Click;\n\n            buttonFans.Click += ButtonFans_Click;\n            buttonKeyboard.Click += ButtonKeyboard_Click;\n            buttonController.Click += ButtonHandheld_Click;\n\n            pictureColor.Click += PictureColor_Click;\n            pictureColor2.Click += PictureColor2_Click;\n\n            labelCPUFan.Click += LabelCPUFan_Click;\n            labelGPUFan.Click += LabelCPUFan_Click;\n\n            comboMatrix.DropDownStyle = ComboBoxStyle.DropDownList;\n            comboMatrixRunning.DropDownStyle = ComboBoxStyle.DropDownList;\n            comboInterval.DropDownStyle = ComboBoxStyle.DropDownList;\n\n            comboMatrix.DropDownClosed += ComboMatrix_SelectedValueChanged;\n            comboMatrixRunning.DropDownClosed += ComboMatrixRunning_SelectedValueChanged;\n            comboInterval.DropDownClosed += ComboInterval_DropDownClosed;\n\n            buttonMatrix.Click += ButtonMatrix_Click;\n\n            checkStartup.Checked = Startup.IsScheduled();\n            checkStartup.CheckedChanged += CheckStartup_CheckedChanged;\n\n            labelVersion.Click += LabelVersion_Click;\n            labelVersion.ForeColor = Color.FromArgb(128, Color.Gray);\n\n            buttonOptimized.MouseMove += ButtonOptimized_MouseHover;\n            buttonOptimized.MouseLeave += ButtonGPU_MouseLeave;\n\n            buttonEco.MouseMove += ButtonEco_MouseHover;\n            buttonEco.MouseLeave += ButtonGPU_MouseLeave;\n\n            buttonStandard.MouseMove += ButtonStandard_MouseHover;\n            buttonStandard.MouseLeave += ButtonGPU_MouseLeave;\n\n            buttonUltimate.MouseMove += ButtonUltimate_MouseHover;\n            buttonUltimate.MouseLeave += ButtonGPU_MouseLeave;\n\n            tableGPU.MouseMove += ButtonXGM_MouseMove;\n            tableGPU.MouseLeave += ButtonGPU_MouseLeave;\n\n            buttonXGM.Click += ButtonXGM_Click;\n\n            buttonScreenAuto.MouseMove += ButtonScreenAuto_MouseHover;\n            buttonScreenAuto.MouseLeave += ButtonScreen_MouseLeave;\n\n            button60Hz.MouseMove += Button60Hz_MouseHover;\n            button60Hz.MouseLeave += ButtonScreen_MouseLeave;\n\n            button120Hz.MouseMove += Button120Hz_MouseHover;\n            button120Hz.MouseLeave += ButtonScreen_MouseLeave;\n\n            buttonFHD.MouseMove += ButtonFHD_MouseHover;\n            buttonFHD.MouseLeave += ButtonScreen_MouseLeave;\n\n            buttonUpdates.Click += ButtonUpdates_Click;\n\n            sliderBattery.MouseUp += SliderBattery_MouseUp;\n            sliderBattery.KeyUp += SliderBattery_KeyUp;\n            sliderBattery.ValueChanged += SliderBattery_ValueChanged;\n\n            sensorTimer = new System.Timers.Timer(AppConfig.Get(\"sensor_timer\", 1000));\n            sensorTimer.Elapsed += OnTimedEvent;\n            sensorTimer.Enabled = true;\n\n            labelCharge.MouseEnter += PanelBattery_MouseEnter;\n            labelCharge.MouseLeave += PanelBattery_MouseLeave;\n            labelBattery.Click += LabelBattery_Click;\n\n            buttonPeripheral1.Click += ButtonPeripheral_Click;\n            buttonPeripheral2.Click += ButtonPeripheral_Click;\n            buttonPeripheral3.Click += ButtonPeripheral_Click;\n\n            buttonPeripheral1.MouseEnter += ButtonPeripheral_MouseEnter;\n            buttonPeripheral2.MouseEnter += ButtonPeripheral_MouseEnter;\n            buttonPeripheral3.MouseEnter += ButtonPeripheral_MouseEnter;\n\n            buttonBatteryFull.MouseEnter += ButtonBatteryFull_MouseEnter;\n            buttonBatteryFull.MouseLeave += ButtonBatteryFull_MouseLeave;\n            buttonBatteryFull.Click += ButtonBatteryFull_Click;\n\n            buttonControllerMode.Click += ButtonControllerMode_Click;\n            buttonBacklight.Click += ButtonBacklight_Click;\n\n            buttonFPS.Click += ButtonFPS_Click;\n            buttonOverlay.Click += ButtonOverlay_Click;\n\n            buttonAutoTDP.Click += ButtonAutoTDP_Click;\n            buttonAutoTDP.BorderColor = colorTurbo;\n\n            Text = \"G-Helper \" + (ProcessHelper.IsUserAdministrator() ? \"—\" : \"-\") + \" \" + AppConfig.GetModelShort();\n            TopMost = AppConfig.Is(\"topmost\");\n\n            //This will auto position the window again when it resizes. Might mess with position if people drag the window somewhere else.\n            this.Resize += SettingsForm_Resize;\n\n            VisualiseFnLock();\n            buttonFnLock.Click += ButtonFnLock_Click;\n\n            labelVisual.Click += LabelVisual_Click;\n            labelCharge.Click += LabelCharge_Click;\n\n            buttonDonate.Click += ButtonDonate_Click;\n\n            int click = AppConfig.Get(\"donate_click\");\n            int startCount = AppConfig.Get(\"start_count\");\n            if (startCount >= ((click < 10) ? 10 : click + 50))\n            {\n                buttonDonate.BorderColor = colorTurbo;\n                buttonDonate.Badge = Math.Clamp((startCount - click) / 50, 1, 9);\n            }\n\n            labelBacklight.ForeColor = colorStandard;\n            labelBacklight.Click += LabelBacklight_Click;\n\n            panelPerformance.Focus();\n            InitVisual();\n        }\n\n        private void ButtonArmoury_Click(object? sender, EventArgs e)\n        {\n            var dialogResult = MessageBox.Show(this, \"Armoury Crate is active, download official uninstaller app?\", \"Armoury Crate\", MessageBoxButtons.YesNo);\n            if (dialogResult == DialogResult.Yes) AsusService.RunArmouryUninstaller();\n        }\n\n\n        private void ButtonAmdOled_Click(object? sender, EventArgs e)\n        {\n            AmdDisplay.RunAdrenaline();\n            activateCheck = true;\n        }\n\n        private void LabelBattery_Click(object? sender, EventArgs e)\n        {\n            HardwareControl.chargeWatt = !HardwareControl.chargeWatt;\n            RefreshSensors(true);\n        }\n\n        private void ButtonEnergySaver_Click(object? sender, EventArgs e)\n        {\n            KeyboardHook.KeyKeyPress(Keys.LWin, Keys.A);\n            activateCheck = true;\n        }\n\n        private void ButtonDonate_Click(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"donate_click\", AppConfig.Get(\"start_count\"));\n            buttonDonate.Badge = 0;\n            Process.Start(new ProcessStartInfo(\"https://g-helper.com/support\") { UseShellExecute = true });\n        }\n\n        private void LabelBacklight_Click(object? sender, EventArgs e)\n        {\n            if (AppConfig.IsDynamicLighting() && DynamicLightingHelper.IsEnabled()) DynamicLightingHelper.OpenSettings();\n        }\n\n        private void ButtonFHD_Click(object? sender, EventArgs e)\n        {\n            ScreenControl.ToogleFHD();\n        }\n\n        private void ButtonHDRControl_Click(object? sender, EventArgs e)\n        {\n            ScreenControl.ToogleHDRControl();\n        }\n\n        private void SliderBattery_ValueChanged(object? sender, EventArgs e)\n        {\n            VisualiseBatteryTitle(sliderBattery.Value);\n        }\n\n        private void SliderBattery_KeyUp(object? sender, KeyEventArgs e)\n        {\n            BatteryControl.SetBatteryChargeLimit(sliderBattery.Value);\n        }\n\n        private void SliderBattery_MouseUp(object? sender, MouseEventArgs e)\n        {\n            BatteryControl.SetBatteryChargeLimit(sliderBattery.Value);\n        }\n\n        private void ButtonAutoTDP_Click(object? sender, EventArgs e)\n        {\n            allyControl.ToggleAutoTDP();\n        }\n\n        private void LabelCharge_Click(object? sender, EventArgs e)\n        {\n            BatteryControl.BatteryReport();\n        }\n\n        private void LabelVisual_Click(object? sender, EventArgs e)\n        {\n            labelVisual.Visible = false;\n            VisualControl.forceVisual = true;\n        }\n\n        public void InitVisual()\n        {\n\n            if (AppConfig.Is(\"hide_visual\")) return;\n\n            if (AppConfig.IsOLED())\n            {\n                panelGamma.Visible = true;\n                sliderGamma.Visible = true;\n                labelGammaTitle.Text = Properties.Strings.FlickerFreeDimming + \" / \" + Properties.Strings.VisualMode;\n\n                VisualiseBrightness();\n\n                sliderGamma.ValueChanged += SliderGamma_ValueChanged;\n                sliderGamma.MouseUp += SliderGamma_ValueChanged;\n\n            }\n            else\n            {\n                labelGammaTitle.Text = Properties.Strings.VisualMode;\n            }\n\n            var gamuts = VisualControl.GetGamutModes();\n\n            // Color profiles exist\n            if (gamuts.Count > 0)\n            {\n                tableVisual.ColumnCount = 3;\n                buttonInstallColor.Visible = false;\n            }\n            else\n            {\n                // If it's possible to retrieve color profiles\n                if (ColorProfileHelper.ProfileExists())\n                {\n                    tableVisual.ColumnCount = 2;\n\n                    buttonInstallColor.Text = Properties.Strings.DownloadColorProfiles;\n                    buttonInstallColor.Visible = true;\n                    buttonInstallColor.Click += ButtonInstallColorProfile_Click;\n\n                    panelGamma.Visible = true;\n                    tableVisual.Visible = true;\n                }\n\n                return;\n            }\n\n            panelGamma.Visible = true;\n            tableVisual.Visible = true;\n\n            var visualValue = (SplendidCommand)AppConfig.Get(\"visual\", (int)VisualControl.GetDefaultVisualMode());\n            var colorTempValue = AppConfig.Get(\"color_temp\", VisualControl.DefaultColorTemp);\n\n            comboVisual.DropDownStyle = ComboBoxStyle.DropDownList;\n            comboVisual.DataSource = new BindingSource(VisualControl.GetVisualModes(), null);\n            comboVisual.DisplayMember = \"Value\";\n            comboVisual.ValueMember = \"Key\";\n            comboVisual.SelectedValue = visualValue;\n\n            comboColorTemp.DropDownStyle = ComboBoxStyle.DropDownList;\n            comboColorTemp.DataSource = new BindingSource(VisualControl.GetTemperatures(), null);\n            comboColorTemp.DisplayMember = \"Value\";\n            comboColorTemp.ValueMember = \"Key\";\n            comboColorTemp.SelectedValue = colorTempValue;\n\n            VisualControl.SetVisual(visualValue, colorTempValue, true);\n\n            comboVisual.SelectedValueChanged += ComboVisual_SelectedValueChanged;\n            comboVisual.Visible = true;\n            VisualiseDisabled();\n\n            comboColorTemp.SelectedValueChanged += ComboVisual_SelectedValueChanged;\n            comboColorTemp.Visible = true;\n\n            if (gamuts.Count <= 1) return;\n\n            comboGamut.DropDownStyle = ComboBoxStyle.DropDownList;\n            comboGamut.DataSource = new BindingSource(gamuts, null);\n            comboGamut.DisplayMember = \"Value\";\n            comboGamut.ValueMember = \"Key\";\n            comboGamut.SelectedValue = (SplendidGamut)AppConfig.Get(\"gamut\", (int)VisualControl.GetDefaultGamut());\n\n            comboGamut.SelectedValueChanged += ComboGamut_SelectedValueChanged;\n            comboGamut.Visible = true;\n\n        }\n\n        public void CycleVisualMode(int delta)\n        {\n\n            if (comboVisual.Items.Count < 1) return;\n\n            if (delta > 0)\n            {\n                if (comboVisual.SelectedIndex < comboVisual.Items.Count - 1)\n                    comboVisual.SelectedIndex += 1;\n                else\n                    comboVisual.SelectedIndex = 0;\n            }\n            else\n            {\n                if (comboVisual.SelectedIndex > 0)\n                    comboVisual.SelectedIndex -= 1;\n                else\n                    comboVisual.SelectedIndex = comboVisual.Items.Count - 1;\n            }\n\n            Program.toast.RunToast(comboVisual.GetItemText(comboVisual.SelectedItem), ToastIcon.BrightnessUp);\n        }\n\n        private async void ButtonInstallColorProfile_Click(object? sender, EventArgs e)\n        {\n            await ColorProfileHelper.InstallProfile();\n            InitVisual();\n        }\n\n        private void ComboGamut_SelectedValueChanged(object? sender, EventArgs e)\n        {\n            VisualControl.SetGamut((int)comboGamut.SelectedValue);\n        }\n\n        private void ComboVisual_SelectedValueChanged(object? sender, EventArgs e)\n        {\n            VisualControl.SetVisual((SplendidCommand)comboVisual.SelectedValue, (int)comboColorTemp.SelectedValue);\n            VisualiseDisabled();\n        }\n\n        public void VisualiseBrightness()\n        {\n            Invoke(delegate\n            {\n                sliderGammaIgnore = true;\n                sliderGamma.Value = VisualControl.GetBrightness();\n                labelGamma.Text = sliderGamma.Value + \"%\";\n                sliderGammaIgnore = false;\n            });\n        }\n\n        public void VisualiseAmdOled(bool status = false)\n        {\n            Invoke(delegate\n            {\n                buttonAmdOled.Visible = status;\n            });\n        }\n\n        public void VisualiseArmoury(bool status = false)\n        {\n            Invoke(delegate\n            {\n                buttonArmoury.Visible = status;\n            });\n        }\n\n        public void VisualiseDisabled()\n        {\n            comboGamut.Enabled = comboColorTemp.Enabled = (SplendidCommand)AppConfig.Get(\"visual\") != SplendidCommand.Disabled;\n        }\n\n        public void VisualiseGamut()\n        {\n            Invoke(delegate\n            {\n                if (comboGamut.Items.Count > 0) comboGamut.SelectedIndex = 0;\n            });\n        }\n\n        private void SliderGamma_ValueChanged(object? sender, EventArgs e)\n        {\n            if (sliderGammaIgnore) return;\n            VisualControl.SetBrightness(sliderGamma.Value);\n        }\n\n        private void ButtonOverlay_Click(object? sender, EventArgs e)\n        {\n            KeyboardHook.KeyKeyKeyPress(Keys.LControlKey, Keys.LShiftKey, Keys.O);\n        }\n\n        private void ButtonHandheld_Click(object? sender, EventArgs e)\n        {\n            if (handheldForm == null || handheldForm.Text == \"\")\n            {\n                handheldForm = new Handheld();\n                AddOwnedForm(handheldForm);\n            }\n\n            if (handheldForm.Visible)\n            {\n                handheldForm.Close();\n            }\n            else\n            {\n                //handheldForm.FormPosition();\n                handheldForm.Show();\n            }\n        }\n\n        private void ButtonFPS_Click(object? sender, EventArgs e)\n        {\n            allyControl.ToggleFPSLimit();\n        }\n\n        private void ButtonBacklight_Click(object? sender, EventArgs e)\n        {\n            allyControl.ToggleBacklight();\n        }\n\n        private void ButtonControllerMode_Click(object? sender, EventArgs e)\n        {\n            allyControl.ToggleMode();\n        }\n\n        public void VisualiseAlly(bool visible = false)\n        {\n            if (!visible) return;\n\n            panelAlly.Visible = true;\n            panelKeyboardTitle.Visible = false;\n            panelKeyboard.Padding = new Padding(panelKeyboard.Padding.Left, 0, panelKeyboard.Padding.Right, panelKeyboard.Padding.Bottom);\n\n            tableAMD.Visible = true;\n        }\n\n        public void VisualiseController(ControllerMode mode)\n        {\n            switch (mode)\n            {\n                case ControllerMode.Gamepad:\n                    buttonControllerMode.Text = \"Gamepad\";\n                    break;\n                case ControllerMode.Mouse:\n                    buttonControllerMode.Text = \"Mouse\";\n                    break;\n                case ControllerMode.Skip:\n                    buttonControllerMode.Text = \"Skip\";\n                    break;\n                default:\n                    buttonControllerMode.Text = \"Auto\";\n                    break;\n            }\n        }\n\n        public void VisualiseBacklight(int backlight)\n        {\n            buttonBacklight.Text = Math.Round((double)backlight * 33.33).ToString() + \"%\";\n        }\n\n        public void VisualiseFPSLimit(int limit)\n        {\n            buttonFPS.Text = \"FPS Limit \" + ((limit > 0 && limit <= 120) ? limit : \"OFF\");\n        }\n\n        public void VisualiseAutoTDP(bool status)\n        {\n            Logger.WriteLine($\"Auto TDP: {status}\");\n            buttonAutoTDP.Activated = status;\n        }\n\n        private void SettingsForm_Focused(object? sender, EventArgs e)\n        {\n            if (activateCheck)\n            {\n                buttonEnergySaver.Visible = PowerNative.GetBatterySaverStatus();\n                buttonAmdOled.Visible = AmdDisplay.IsOledPowerOptimization();\n                activateCheck = false;\n            }\n        }\n        private void SettingsForm_LostFocus(object? sender, EventArgs e)\n        {\n            lastLostFocus = DateTimeOffset.Now.ToUnixTimeMilliseconds();\n        }\n\n        private void ButtonBatteryFull_Click(object? sender, EventArgs e)\n        {\n            BatteryControl.ToggleBatteryLimitFull();\n        }\n\n        private void ButtonBatteryFull_MouseLeave(object? sender, EventArgs e)\n        {\n            batteryFullMouseOver = false;\n            RefreshSensors(true);\n        }\n\n        private void ButtonBatteryFull_MouseEnter(object? sender, EventArgs e)\n        {\n            batteryFullMouseOver = true;\n            labelCharge.Text = Properties.Strings.BatteryLimitFull;\n        }\n\n        private void SettingsForm_Resize(object? sender, EventArgs e)\n        {\n            Left = Screen.FromControl(this).WorkingArea.Width - 10 - Width;\n            Top = Screen.FromControl(this).WorkingArea.Height - 10 - Height;\n        }\n\n        private void PanelBattery_MouseEnter(object? sender, EventArgs e)\n        {\n            batteryMouseOver = true;\n            ShowBatteryWear();\n        }\n\n        private void PanelBattery_MouseLeave(object? sender, EventArgs e)\n        {\n            batteryMouseOver = false;\n            RefreshSensors(true);\n        }\n\n        private void ShowBatteryWear()\n        {\n            //Refresh again only after 15 Minutes since the last refresh\n            if (lastBatteryRefresh == 0 || Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastBatteryRefresh) > 15 * 60_000)\n            {\n                lastBatteryRefresh = DateTimeOffset.Now.ToUnixTimeMilliseconds();\n                HardwareControl.RefreshBatteryHealth();\n            }\n\n            if (HardwareControl.batteryHealth != -1)\n            {\n                labelCharge.Text = Properties.Strings.BatteryHealth + \": \" + Math.Round(HardwareControl.batteryHealth, 1) + \"%\";\n            }\n        }\n\n        private void SettingsForm_VisibleChanged(object? sender, EventArgs e)\n        {\n            sensorTimer.Enabled = this.Visible;\n            if (this.Visible)\n            {\n                ScreenControl.InitScreen();\n                VisualizeXGM();\n                buttonEnergySaver.Visible = PowerNative.GetBatterySaverStatus();\n                Task.Run((Action)RefreshPeripheralsBattery);\n                updateControl.CheckForUpdates();\n            }\n        }\n\n        private void RefreshPeripheralsBattery()\n        {\n            PeripheralsProvider.RefreshBatteryForAllDevices(true);\n        }\n\n        private void ButtonUpdates_Click(object? sender, EventArgs e)\n        {\n            if (updatesForm == null || updatesForm.Text == \"\")\n            {\n                updatesForm = new Updates();\n                AddOwnedForm(updatesForm);\n            }\n\n            if (updatesForm.Visible)\n            {\n                updatesForm.Close();\n            }\n            else\n            {\n                updatesForm.Show();\n            }\n        }\n\n        public void VisualiseMatrixPicture(string image)\n        {\n            if (matrixForm == null || matrixForm.Text == \"\") return;\n            matrixForm.VisualiseMatrix(image);\n        }\n\n        protected override void WndProc(ref Message m)\n        {\n\n            if (m.Msg == NativeMethods.WM_POWERBROADCAST && m.WParam == (IntPtr)NativeMethods.PBT_POWERSETTINGCHANGE)\n            {\n                var settings = (NativeMethods.POWERBROADCAST_SETTING)m.GetLParam(typeof(NativeMethods.POWERBROADCAST_SETTING));\n                if (settings.PowerSetting == NativeMethods.PowerSettingGuid.LIDSWITCH_STATE_CHANGE)\n                {\n                    switch (settings.Data)\n                    {\n                        case 0:\n                            Logger.WriteLine(\"Lid Closed\");\n                            InputDispatcher.lidClose = AniMatrixControl.lidClose = true;\n                            Aura.ApplyBrightness(0, \"Lid\");\n                            matrixControl.SetLidMode();\n                            break;\n                        case 1:\n                            Logger.WriteLine(\"Lid Open\");\n                            InputDispatcher.InitFNLock();\n                            InputDispatcher.lidClose = AniMatrixControl.lidClose = false;\n                            Aura.ApplyBrightness(InputDispatcher.GetBacklight(), \"Lid\");\n                            matrixControl.SetLidMode();\n                            break;\n                    }\n\n                }\n                else\n                {\n                    switch (settings.Data)\n                    {\n                        case 0:\n                            Logger.WriteLine(\"Monitor Power Off\");\n                            Aura.SleepBrightness();\n                            break;\n                        case 1:\n                            Logger.WriteLine(\"Monitor Power On\");\n                            if (!Program.SetAutoModes(wakeup: true)) BatteryControl.AutoBattery();\n                            break;\n                        case 2:\n                            Logger.WriteLine(\"Monitor Dimmed\");\n                            break;\n                    }\n                }\n                m.Result = (IntPtr)1;\n            }\n\n            if (m.Msg == Program.WM_TASKBARCREATED)\n            {\n                Logger.WriteLine(\"Taskbar created, re-creating tray icon\");\n                if (Program.trayIcon is not null) Program.trayIcon.Visible = true;\n            }\n\n            try\n            {\n                base.WndProc(ref m);\n            }\n            catch (Exception ex)\n            {\n                Debug.WriteLine(ex.ToString());\n            }\n        }\n\n        public void SetContextMenu()\n        {\n            var currentMode = Modes.GetCurrent();\n\n            foreach (ToolStripItem item in contextMenuStrip.Items.Cast<ToolStripItem>().ToList())\n            {\n                if (item is ToolStripMenuItem menuItem) menuItem.Dispose();\n            }\n            contextMenuStrip.Items.Clear();\n            contextMenuStrip.ShowCheckMargin = true;\n            contextMenuStrip.ImageScalingSize = new Size(16, 16);\n            contextMenuStrip.ShowImageMargin = false;\n            Padding padding = new Padding(15, 5, 5, 5);\n\n            var title = new ToolStripMenuItem(Properties.Strings.PerformanceMode);\n            title.Margin = padding;\n            title.Enabled = false;\n            contextMenuStrip.Items.Add(title);\n\n            foreach (var mode in Modes.GetDictonary())\n            {\n                var menuMode = new ToolStripMenuItem(mode.Value);\n                menuMode.Tag = mode.Key;\n                menuMode.Click += (sender, args) => { Program.modeControl.SetPerformanceMode(mode.Key); };\n                menuMode.Margin = padding;\n                menuMode.Checked = (mode.Key == currentMode);\n                contextMenuStrip.Items.Add(menuMode);\n            }\n\n            contextMenuStrip.Items.Add(\"-\");\n\n            if (isGpuSection)\n            {\n                var titleGPU = new ToolStripMenuItem(Properties.Strings.GPUMode);\n                titleGPU.Margin = padding;\n                titleGPU.Enabled = false;\n                contextMenuStrip.Items.Add(titleGPU);\n\n                menuEco = new ToolStripMenuItem(Properties.Strings.EcoMode);\n                menuEco.Click += ButtonEco_Click;\n                menuEco.Margin = padding;\n                contextMenuStrip.Items.Add(menuEco);\n\n                menuStandard = new ToolStripMenuItem(Properties.Strings.StandardMode);\n                menuStandard.Click += ButtonStandard_Click;\n                menuStandard.Margin = padding;\n                contextMenuStrip.Items.Add(menuStandard);\n\n                menuUltimate = new ToolStripMenuItem(Properties.Strings.UltimateMode);\n                menuUltimate.Click += ButtonUltimate_Click;\n                menuUltimate.Margin = padding;\n                contextMenuStrip.Items.Add(menuUltimate);\n\n                menuOptimized = new ToolStripMenuItem(Properties.Strings.Optimized);\n                menuOptimized.Click += ButtonOptimized_Click;\n                menuOptimized.Margin = padding;\n                contextMenuStrip.Items.Add(menuOptimized);\n\n                contextMenuStrip.Items.Add(\"-\");\n            }\n\n\n            var quit = new ToolStripMenuItem(Properties.Strings.Quit);\n            quit.Click += ButtonQuit_Click;\n            quit.Margin = padding;\n            contextMenuStrip.Items.Add(quit);\n\n            //contextMenuStrip.ShowCheckMargin = true;\n            contextMenuStrip.RenderMode = ToolStripRenderMode.System;\n\n            InitContextMenuTheme();\n\n            if (Program.trayIcon is not null) Program.trayIcon.ContextMenuStrip = contextMenuStrip;\n\n\n        }\n\n        public void InitContextMenuTheme()\n        {\n            if (contextMenuStrip is not null)\n            {\n                contextMenuStrip.BackColor = this.BackColor;\n                contextMenuStrip.ForeColor = this.ForeColor;\n            }\n        }\n\n        private void ButtonXGM_Click(object? sender, EventArgs e)\n        {\n            gpuControl.ToggleXGM();\n        }\n\n\n        public void SetVersionLabel(string label, bool update = false)\n        {\n            if (InvokeRequired)\n                Invoke(delegate\n                {\n                    labelVersion.Text = label;\n                    if (update) labelVersion.ForeColor = colorTurbo;\n                });\n            else\n            {\n                labelVersion.Text = label;\n                if (update) labelVersion.ForeColor = colorTurbo;\n            }\n        }\n\n\n        private void LabelVersion_Click(object? sender, EventArgs e)\n        {\n            updateControl.Update();\n        }\n\n\n        private static void OnTimedEvent(Object? source, ElapsedEventArgs? e)\n        {\n            Program.settingsForm.RefreshSensors();\n        }\n\n        private void ButtonFHD_MouseHover(object? sender, EventArgs e)\n        {\n            labelTipScreen.Text = \"Switch to \" + ((buttonFHD.Text == \"FHD\") ? \"UHD\" : \"FHD\") + \" Mode\";\n        }\n\n        private void Button120Hz_MouseHover(object? sender, EventArgs e)\n        {\n            labelTipScreen.Text = Properties.Strings.MaxRefreshTooltip;\n        }\n\n        private void Button60Hz_MouseHover(object? sender, EventArgs e)\n        {\n            labelTipScreen.Text = Properties.Strings.MinRefreshTooltip.Replace(\"60\", ScreenControl.MIN_RATE.ToString());\n        }\n\n        private void ButtonScreen_MouseLeave(object? sender, EventArgs e)\n        {\n            labelTipScreen.Text = \"\";\n        }\n\n        private void ButtonScreenAuto_MouseHover(object? sender, EventArgs e)\n        {\n            labelTipScreen.Text = Properties.Strings.AutoRefreshTooltip.Replace(\"60\", ScreenControl.MIN_RATE.ToString());\n        }\n\n        private void ButtonUltimate_MouseHover(object? sender, EventArgs e)\n        {\n            labelTipGPU.Text = Properties.Strings.UltimateGPUTooltip;\n        }\n\n        private void ButtonStandard_MouseHover(object? sender, EventArgs e)\n        {\n            labelTipGPU.Text = Properties.Strings.StandardGPUTooltip;\n        }\n\n        private void ButtonEco_MouseHover(object? sender, EventArgs e)\n        {\n            labelTipGPU.Text = Properties.Strings.EcoGPUTooltip;\n        }\n\n        private void ButtonOptimized_MouseHover(object? sender, EventArgs e)\n        {\n            labelTipGPU.Text = Properties.Strings.OptimizedGPUTooltip;\n        }\n\n        private void ButtonGPU_MouseLeave(object? sender, EventArgs e)\n        {\n            labelTipGPU.Text = \"\";\n        }\n\n        private void ButtonXGM_MouseMove(object? sender, MouseEventArgs e)\n        {\n            if (sender is null) return;\n            TableLayoutPanel table = (TableLayoutPanel)sender;\n\n            if (!buttonXGM.Visible) return;\n\n            labelTipGPU.Text = buttonXGM.Bounds.Contains(table.PointToClient(Cursor.Position)) ?\n                \"XGMobile toggle works only in Standard mode\" : \"\";\n\n        }\n\n\n        private void ButtonScreenAuto_Click(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"screen_auto\", 1);\n            ScreenControl.AutoScreen();\n        }\n\n\n        private void CheckStartup_CheckedChanged(object? sender, EventArgs e)\n        {\n            if (sender is null) return;\n            CheckBox chk = (CheckBox)sender;\n\n            if (chk.Checked)\n                Startup.Schedule();\n            else\n                Startup.UnSchedule();\n        }\n\n        private void CheckMatrix_CheckedChanged(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"matrix_auto\", checkMatrix.Checked ? 1 : 0);\n            matrixControl.SetBatteryAuto();\n        }\n\n        private void CheckMatrixLid_CheckedChanged(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"matrix_lid\", checkMatrixLid.Checked ? 1 : 0);\n            matrixControl.SetLidMode(true);\n        }\n\n\n        private void ButtonMatrix_Click(object? sender, EventArgs e)\n        {\n\n            if (matrixForm == null || matrixForm.Text == \"\")\n            {\n                matrixForm = new Matrix();\n                AddOwnedForm(matrixForm);\n            }\n\n            if (matrixForm.Visible)\n            {\n                matrixForm.Close();\n            }\n            else\n            {\n                matrixForm.FormPosition();\n                matrixForm.Show();\n            }\n\n        }\n\n        public void VisualiseMatrixRunning(int mode)\n        {\n            Invoke(delegate\n            {\n                comboMatrixRunning.SelectedIndex = mode;\n                if (comboMatrix.SelectedIndex == 0) comboMatrix.SelectedIndex = 3;\n            });\n        }\n\n        private void ComboInterval_DropDownClosed(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"matrix_interval\", comboInterval.SelectedIndex);\n            matrixControl.SetDevice();\n        }\n\n        private void ComboMatrixRunning_SelectedValueChanged(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"matrix_running\", comboMatrixRunning.SelectedIndex);\n            matrixControl.SetDevice();\n        }\n\n\n        private void ComboMatrix_SelectedValueChanged(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"matrix_brightness\", comboMatrix.SelectedIndex);\n            matrixControl.SetDevice();\n        }\n\n\n        private void LabelCPUFan_Click(object? sender, EventArgs e)\n        {\n            FanSensorControl.fanRpm = !FanSensorControl.fanRpm;\n            RefreshSensors(true);\n        }\n\n        private void PictureColor2_Click(object? sender, EventArgs e)\n        {\n            SetColorPicker(\"aura_color2\");\n        }\n\n        private void PictureColor_Click(object? sender, EventArgs e)\n        {\n            buttonKeyboardColor.PerformClick();\n        }\n\n        private void ButtonKeyboard_Click(object? sender, EventArgs e)\n        {\n            if (extraForm == null || extraForm.Text == \"\")\n            {\n                extraForm = new Extra();\n                AddOwnedForm(extraForm);\n            }\n\n            if (extraForm.Visible)\n            {\n                extraForm.Close();\n            }\n            else\n            {\n                extraForm.Show();\n            }\n        }\n\n        public void FansInit()\n        {\n            if (fansForm == null || fansForm.Text == \"\") return;\n            Invoke(fansForm.InitAll);\n        }\n\n        public void GPUInit()\n        {\n            if (fansForm == null || fansForm.Text == \"\") return;\n            Invoke(fansForm.InitGPU);\n        }\n\n        public void FansToggle(int index = 0)\n        {\n            if (fansForm == null || fansForm.Text == \"\")\n            {\n                fansForm = new Fans();\n                AddOwnedForm(fansForm);\n            }\n\n            if (fansForm.Visible)\n            {\n                fansForm.Close();\n            }\n            else\n            {\n                fansForm.FormPosition();\n                fansForm.Show();\n                fansForm.ToggleNavigation(index);\n            }\n\n        }\n\n        private void ButtonFans_Click(object? sender, EventArgs e)\n        {\n            FansToggle();\n        }\n\n        private void SetColorPicker(string colorField = \"aura_color\")\n        {\n            ColorDialog colorDlg = new ColorDialog();\n            colorDlg.AllowFullOpen = true;\n            colorDlg.Color = pictureColor.BackColor;\n\n            try\n            {\n                colorDlg.CustomColors = AppConfig.GetString(\"aura_color_custom\", \"\").Split('-').Select(int.Parse).ToArray();\n            }\n            catch (Exception ex) { }\n\n            if (colorDlg.ShowDialog() == DialogResult.OK)\n            {\n                AppConfig.Set(\"aura_color_custom\", string.Join(\"-\", colorDlg.CustomColors));\n                AppConfig.Set(colorField, colorDlg.Color.ToArgb());\n                SetAura();\n            }\n        }\n\n        private void ButtonKeyboardColor_Click(object? sender, EventArgs e)\n        {\n            SetColorPicker(\"aura_color\");\n        }\n\n        public void InitAura()\n        {\n            Aura.Mode = (AuraMode)AppConfig.Get(\"aura_mode\");\n            Aura.Speed = (AuraSpeed)AppConfig.Get(\"aura_speed\");\n            Aura.SetColor(AppConfig.Get(\"aura_color\"));\n            Aura.SetColor2(AppConfig.Get(\"aura_color2\"));\n\n            comboKeyboard.DropDownStyle = ComboBoxStyle.DropDownList;\n            comboKeyboard.DataSource = new BindingSource(Aura.GetModes(), null);\n            comboKeyboard.DisplayMember = \"Value\";\n            comboKeyboard.ValueMember = \"Key\";\n            comboKeyboard.SelectedValue = Aura.Mode;\n            comboKeyboard.SelectedValueChanged += ComboKeyboard_SelectedValueChanged;\n\n\n            if (AppConfig.IsSingleColor())\n            {\n                panelColor.Visible = false;\n            }\n\n            if (AppConfig.NoAura())\n            {\n                comboKeyboard.Visible = false;\n            }\n\n            VisualiseAura();\n\n        }\n\n        public void SetAura()\n        {\n            Task.Run(() =>\n            {\n                Aura.ApplyAura();\n                VisualiseAura();\n            });\n        }\n\n        private void _VisualiseAura()\n        {\n            pictureColor.BackColor = Aura.Color1;\n            pictureColor2.BackColor = Aura.Color2;\n            pictureColor2.Visible = Aura.HasSecondColor();\n\n            bool dynamic = AppConfig.IsDynamicLighting() && DynamicLightingHelper.IsEnabled() && !AppConfig.IsDynamicLightingOnly();\n\n            if (dynamic)\n            {\n                labelBacklight.Cursor = Cursors.Hand;\n                labelBacklight.Text = Strings.DisableDynamicLighting;\n            } else if (Aura.Mode == AuraMode.AMBIENT)\n            {\n                labelBacklight.Cursor = Cursors.Default;\n                labelBacklight.Text = Strings.AmbientModeResources;\n            } else\n            {\n                labelBacklight.Cursor = Cursors.Default;\n                labelBacklight.Text = \"\";\n            }\n        }\n\n        public void VisualiseAura()\n        {\n            if (InvokeRequired)\n                Invoke(_VisualiseAura);\n            else\n                _VisualiseAura();\n        }\n\n        public void InitMatrix()\n        {\n\n            if (!matrixControl.IsValid)\n            {\n                panelMatrix.Visible = false;\n                return;\n            }\n\n            if (matrixControl.IsSlash)\n            {\n                labelMatrix.Text = \"Slash Lighting\";\n                comboMatrixRunning.Items.Clear();\n\n                foreach (var item in SlashDevice.Modes)\n                {\n                    comboMatrixRunning.Items.Add(item.Value);\n                }\n\n                comboInterval.Visible = true;\n                comboInterval.Items.Add(Properties.Strings.IntervalOff);\n                for (int i = 1; i <= 5; i++) comboInterval.Items.Add(string.Format(Properties.Strings.IntervalSeconds, i));\n\n                buttonMatrix.Visible = false;\n            }\n\n            comboMatrix.SelectedIndex = Math.Max(0, Math.Min(AppConfig.Get(\"matrix_brightness\", 0), comboMatrix.Items.Count - 1));\n            comboMatrixRunning.SelectedIndex = Math.Min(AppConfig.Get(\"matrix_running\", 0), comboMatrixRunning.Items.Count - 1);\n            comboInterval.SelectedIndex = Math.Min(AppConfig.Get(\"matrix_interval\", 0), comboInterval.Items.Count - 1);\n\n            checkMatrix.Checked = AppConfig.Is(\"matrix_auto\");\n            checkMatrix.CheckedChanged += CheckMatrix_CheckedChanged;\n\n            checkMatrixLid.Checked = AppConfig.Is(\"matrix_lid\");\n            checkMatrixLid.CheckedChanged += CheckMatrixLid_CheckedChanged;\n\n\n        }\n\n\n        public void CycleMatrix(int delta)\n        {\n            comboMatrix.SelectedIndex = Math.Min(Math.Max(0, comboMatrix.SelectedIndex + delta), comboMatrix.Items.Count - 1);\n            AppConfig.Set(\"matrix_brightness\", comboMatrix.SelectedIndex);\n            matrixControl.SetDevice();\n            Program.toast.RunToast(comboMatrix.GetItemText(comboMatrix.SelectedItem), delta > 0 ? ToastIcon.BacklightUp : ToastIcon.BacklightDown);\n        }\n\n\n        public void CycleAuraMode(int delta)\n        {\n            if (delta > 0)\n            {\n                if (comboKeyboard.SelectedIndex < comboKeyboard.Items.Count - 1)\n                    comboKeyboard.SelectedIndex += 1;\n                else\n                    comboKeyboard.SelectedIndex = 0;\n            }\n            else\n            {\n                if (comboKeyboard.SelectedIndex > 0)\n                    comboKeyboard.SelectedIndex -= 1;\n                else\n                    comboKeyboard.SelectedIndex = comboKeyboard.Items.Count - 1;\n            }\n\n            Program.toast.RunToast(comboKeyboard.GetItemText(comboKeyboard.SelectedItem), ToastIcon.BacklightUp);\n        }\n\n        private void ComboKeyboard_SelectedValueChanged(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"aura_mode\", (int)comboKeyboard.SelectedValue);\n            SetAura();\n        }\n\n\n        private void Button120Hz_Click(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"screen_auto\", 0);\n            ScreenControl.SetScreen(ScreenControl.MAX_REFRESH, 1);\n        }\n\n        private void Button60Hz_Click(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"screen_auto\", 0);\n            ScreenControl.SetScreen(ScreenControl.MIN_RATE, 0);\n        }\n\n\n        private void ButtonMiniled_Click(object? sender, EventArgs e)\n        {\n            ScreenControl.ToogleMiniled();\n        }\n\n\n\n        public void VisualiseScreen(bool screenEnabled, bool screenAuto, int frequency, int maxFrequency, int overdrive, bool overdriveSetting, int miniled1, int miniled2, bool hdr, int fhd, int hdrControl)\n        {\n\n            ButtonEnabled(button60Hz, screenEnabled);\n            ButtonEnabled(button120Hz, screenEnabled);\n            ButtonEnabled(buttonScreenAuto, screenEnabled);\n            ButtonEnabled(buttonMiniled, screenEnabled);\n\n            labelSreen.Text = screenEnabled\n                ? Properties.Strings.LaptopScreen + \": \" + frequency + \"Hz\" + ((overdrive == 1) ? \" + \" + Properties.Strings.Overdrive : \"\")\n                : Properties.Strings.LaptopScreen + \": \" + Properties.Strings.TurnedOff;\n\n            button60Hz.Activated = false;\n            button120Hz.Activated = false;\n            buttonScreenAuto.Activated = false;\n\n            if (screenAuto)\n            {\n                buttonScreenAuto.Activated = true;\n            }\n            else if (frequency == ScreenControl.MIN_RATE)\n            {\n                button60Hz.Activated = true;\n            }\n            else if (frequency > ScreenControl.MIN_RATE)\n            {\n                button120Hz.Activated = true;\n            }\n\n            button60Hz.Text = ScreenControl.MIN_RATE + \"Hz\";\n\n            if (maxFrequency > ScreenControl.MIN_RATE)\n            {\n                button120Hz.Text = maxFrequency.ToString() + \"Hz\" + (overdriveSetting ? \" + OD\" : \"\");\n                panelScreen.Visible = true;\n            }\n            else if (maxFrequency > 0)\n            {\n                panelScreen.Visible = false;\n            }\n\n            if (fhd >= 0)\n            {\n                buttonFHD.Visible = true;\n                buttonFHD.Text = fhd > 0 ? \"FHD\" : \"UHD\";\n            }\n\n            bool hdrControlVisible = (hdr && hdrControl >= 0);\n\n            if (miniled1 >= 0)\n            {\n                buttonMiniled.Visible = !hdrControlVisible;\n                buttonMiniled.Enabled = !hdr;\n                buttonMiniled.Activated = miniled1 == 1 || hdr;\n            }\n            else if (miniled2 >= 0)\n            {\n                buttonMiniled.Visible = !hdrControlVisible;\n                buttonMiniled.Enabled = !hdr;\n                if (hdr) miniled2 = 1; // Show HDR as Multizone Strong\n\n                switch (miniled2)\n                {\n                    // Multizone On\n                    case 0:\n                        buttonMiniled.Text = Properties.Strings.Multizone;\n                        buttonMiniled.BorderColor = colorStandard;\n                        buttonMiniled.Activated = true;\n                        break;\n                    // Multizone Strong\n                    case 1:\n                        buttonMiniled.Text = Properties.Strings.MultizoneStrong;\n                        buttonMiniled.BorderColor = colorTurbo;\n                        buttonMiniled.Activated = true;\n                        break;\n                    // Multizone Off\n                    case 2:\n                        buttonMiniled.Text = Properties.Strings.OneZone;\n                        buttonMiniled.BorderColor = colorStandard;\n                        buttonMiniled.Activated = false;\n                        break;\n                }\n            }\n            else\n            {\n                buttonMiniled.Visible = false;\n            }\n\n            if (hdrControlVisible)\n            {\n                buttonHDRControl.Visible = true;\n                buttonHDRControl.Activated = hdrControl > 0;\n                buttonHDRControl.BorderColor = colorTurbo;\n            } else\n            {\n                buttonHDRControl.Visible = false;\n            }\n\n            if (hdr) labelVisual.Text = Properties.Strings.VisualModesHDR;\n            if (!screenEnabled) labelVisual.Text = Properties.Strings.VisualModesScreen;\n\n            if (!screenEnabled || hdr)\n            {\n                labelVisual.Location = tableVisual.Location;\n                labelVisual.Width = tableVisual.Width;\n                labelVisual.Height = tableVisual.Height;\n                labelVisual.Visible = true;\n            }\n            else\n            {\n                labelVisual.Visible = false;\n            }\n\n\n        }\n\n        private void ButtonQuit_Click(object? sender, EventArgs e)\n        {\n            matrixControl.Dispose();\n            Close();\n            Program.trayIcon.Visible = false;\n            Application.Exit();\n        }\n\n        /// <summary>\n        /// Closes all forms except the settings. Hides the settings\n        /// </summary>\n        public void HideAll()\n        {\n            this.Hide();\n            if (fansForm != null && fansForm.Text != \"\") fansForm.Close();\n            if (extraForm != null && extraForm.Text != \"\") extraForm.Close();\n            if (updatesForm != null && updatesForm.Text != \"\") updatesForm.Close();\n            if (matrixForm != null && matrixForm.Text != \"\") matrixForm.Close();\n            if (handheldForm != null && handheldForm.Text != \"\") handheldForm.Close();\n            if (mouseSettings != null && mouseSettings.Text != \"\") mouseSettings.Close();\n\n        }\n\n        /// <summary>\n        /// Brings all visible windows to the top, with settings being the focus\n        /// </summary>\n        public void ShowAll()\n        {\n            this.Activate();\n            this.TopMost = true;\n            this.TopMost = AppConfig.Is(\"topmost\");\n        }\n\n        /// <summary>\n        /// Check if any of fans, keyboard, update, or itself has focus\n        /// </summary>\n        /// <returns>Focus state</returns>\n        public bool HasAnyFocus(bool lostFocusCheck = false)\n        {\n            return (fansForm != null && fansForm.ContainsFocus) ||\n                   (extraForm != null && extraForm.ContainsFocus) ||\n                   (updatesForm != null && updatesForm.ContainsFocus) ||\n                   (matrixForm != null && matrixForm.ContainsFocus) ||\n                   (handheldForm != null && handheldForm.ContainsFocus) ||\n                   this.ContainsFocus ||\n                   (lostFocusCheck && Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastLostFocus) < 300);\n        }\n\n        private void SettingsForm_FormClosing(object? sender, FormClosingEventArgs e)\n        {\n            if (e.CloseReason == CloseReason.UserClosing)\n            {\n                e.Cancel = true;\n                HideAll();\n            }\n        }\n\n        private void ButtonUltimate_Click(object? sender, EventArgs e)\n        {\n            gpuControl.SetGPUMode(AsusACPI.GPUModeUltimate);\n        }\n\n        private void ButtonStandard_Click(object? sender, EventArgs e)\n        {\n            gpuControl.SetGPUMode(AsusACPI.GPUModeStandard);\n        }\n\n        private void ButtonEco_Click(object? sender, EventArgs e)\n        {\n            gpuControl.SetGPUMode(AsusACPI.GPUModeEco);\n        }\n\n\n        private void ButtonOptimized_Click(object? sender, EventArgs e)\n        {\n            AppConfig.Set(\"gpu_auto\", (AppConfig.Get(\"gpu_auto\") == 1) ? 0 : 1);\n            VisualiseGPUMode();\n            gpuControl.AutoGPUMode(true);\n        }\n\n        private void ButtonStopGPU_Click(object? sender, EventArgs e)\n        {\n            gpuControl.KillGPUApps();\n        }\n\n        public async void RefreshSensors(bool force = false)\n        {\n\n            if (!force && Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastRefresh) < 2000) return;\n            lastRefresh = DateTimeOffset.Now.ToUnixTimeMilliseconds();\n\n            string cpuTemp = \"\";\n            string gpuTemp = \"\";\n            string battery = \"\";\n            string charge = \"\";\n\n            HardwareControl.ReadSensors();\n            Task.Run((Action)PeripheralsProvider.RefreshBatteryForAllDevices);\n\n            if (HardwareControl.cpuTemp > 0)\n                cpuTemp = \": \" + Math.Round((decimal)HardwareControl.cpuTemp).ToString() + \"°C\";\n\n            if (HardwareControl.batteryCapacity > 0)\n            {\n                charge = Properties.Strings.BatteryCharge + \": \" + HardwareControl.batteryCharge;\n            }\n\n            if (HardwareControl.batteryRate < 0)\n                battery = Properties.Strings.Discharging + \": \" + Math.Round(-(decimal)HardwareControl.batteryRate, 1).ToString() + \"W\";\n            else if (HardwareControl.batteryRate > 0)\n                battery = Properties.Strings.Charging + \": \" + Math.Round((decimal)HardwareControl.batteryRate, 1).ToString() + \"W\";\n\n\n            if (HardwareControl.gpuTemp > 0)\n            {\n                gpuTemp = $\": {HardwareControl.gpuTemp}°C\";\n            }\n\n            string trayTip = \"CPU\" + cpuTemp + \" \" + HardwareControl.cpuFan;\n            if (gpuTemp.Length > 0) trayTip += \"\\nGPU\" + gpuTemp + \" \" + HardwareControl.gpuFan;\n            if (battery.Length > 0) trayTip += \"\\n\" + battery;\n\n            if (Program.settingsForm.IsHandleCreated)\n                Program.settingsForm.BeginInvoke(delegate\n                {\n                    labelCPUFan.Text = \"CPU\" + cpuTemp + \" \" + HardwareControl.cpuFan;\n                    labelGPUFan.Text = \"GPU\" + gpuTemp + \" \" + HardwareControl.gpuFan;\n                    if (HardwareControl.gpuFan is not null && AppConfig.NoGpu())\n                    {\n                        labelMidFan.Text = \"GPU\" + gpuTemp + \" \" + HardwareControl.gpuFan;\n                    }\n\n                    if (HardwareControl.midFan is not null)\n                        labelMidFan.Text = \"Mid \" + HardwareControl.midFan;\n\n                    labelBattery.Text = battery;\n                    if (!batteryMouseOver && !batteryFullMouseOver) labelCharge.Text = charge;\n\n                    //panelPerformance.AccessibleName = labelPerf.Text + \" \" + trayTip;\n                });\n\n\n            if (Program.trayIcon is not null) Program.trayIcon.Text = trayTip;\n\n        }\n\n        public void LabelFansResult(string text)\n        {\n            if (fansForm != null && fansForm.Text != \"\")\n                fansForm.LabelFansResult(text);\n        }\n\n        public void ShowMode(int mode)\n        {\n            if (InvokeRequired)\n                Invoke(delegate\n                {\n                    VisualiseMode(mode);\n                });\n            else\n                VisualiseMode(mode);\n        }\n\n        protected void VisualiseMode(int mode)\n        {\n            buttonSilent.Activated = false;\n            buttonBalanced.Activated = false;\n            buttonTurbo.Activated = false;\n            buttonFans.Activated = false;\n\n            switch (mode)\n            {\n                case AsusACPI.PerformanceSilent:\n                    buttonSilent.Activated = true;\n                    break;\n                case AsusACPI.PerformanceTurbo:\n                    buttonTurbo.Activated = true;\n                    break;\n                case AsusACPI.PerformanceBalanced:\n                    buttonBalanced.Activated = true;\n                    break;\n                default:\n                    buttonFans.Activated = true;\n                    buttonFans.BorderColor = Modes.GetBase(mode) switch\n                    {\n                        AsusACPI.PerformanceSilent => colorEco,\n                        AsusACPI.PerformanceTurbo => colorTurbo,\n                        _ => colorStandard,\n                    };\n                    break;\n            }\n\n            foreach (var item in contextMenuStrip.Items)\n            {\n                if (item is ToolStripMenuItem menuItem && menuItem.Tag is not null)\n                {\n                    menuItem.Checked = ((int)menuItem.Tag == mode);\n                }\n            }\n        }\n\n\n        public void SetModeLabel(string modeText)\n        {\n            if (InvokeRequired)\n            {\n                Invoke(delegate\n                {\n                    labelPerf.Text = modeText;\n                    panelPerformance.AccessibleName = labelPerf.Text;\n                });\n            }\n            else\n            {\n                labelPerf.Text = modeText;\n                panelPerformance.AccessibleName = labelPerf.Text;\n            }\n\n        }\n\n\n\n        public void VisualizeXGM(int GPUMode = -1)\n        {\n\n            bool connected = Program.acpi.IsXGConnected();\n            buttonXGM.Enabled = buttonXGM.Visible = connected;\n\n            if (!connected) return;\n\n            if (GPUMode != -1)\n                ButtonEnabled(buttonXGM, AppConfig.IsAMDiGPU() || GPUMode != AsusACPI.GPUModeEco);\n\n\n            int activated = Program.acpi.DeviceGet(AsusACPI.GPUXG);\n            Logger.WriteLine(\"XGM Activated flag: \" + activated);\n\n            buttonXGM.Activated = activated == 1;\n\n            if (activated == 1)\n            {\n                ButtonEnabled(buttonOptimized, false);\n                ButtonEnabled(buttonEco, false);\n                ButtonEnabled(buttonStandard, false);\n                ButtonEnabled(buttonUltimate, false);\n            }\n            else\n            {\n                ButtonEnabled(buttonOptimized, true);\n                ButtonEnabled(buttonEco, true);\n                ButtonEnabled(buttonStandard, true);\n                ButtonEnabled(buttonUltimate, true);\n            }\n\n        }\n\n        public void VisualiseGPUButtons(bool eco = true, bool ultimate = true)\n        {\n            if (!eco)\n            {\n                menuEco.Visible = buttonEco.Visible = false;\n                menuOptimized.Visible = buttonOptimized.Visible = false;\n                buttonStopGPU.Visible = true;\n                tableGPU.ColumnCount = 3;\n                tableScreen.ColumnCount = 3;\n            }\n            else\n            {\n                buttonStopGPU.Visible = false;\n            }\n\n            if (!ultimate)\n            {\n                menuUltimate.Visible = buttonUltimate.Visible = false;\n                tableGPU.ColumnCount = 3;\n                tableScreen.ColumnCount = 3;\n            }\n        }\n\n        public void HideGPUModes(bool gpuExists)\n        {\n            isGpuSection = false;\n\n            buttonEco.Visible = false;\n            buttonStandard.Visible = false;\n            buttonUltimate.Visible = false;\n            buttonOptimized.Visible = false;\n            buttonStopGPU.Visible = true;\n\n            tableGPU.ColumnCount = 0;\n\n            SetContextMenu();\n\n            panelGPU.Visible = gpuExists;\n\n        }\n\n\n        public void LockGPUModes(string text = null)\n        {\n            Invoke(delegate\n            {\n                if (text is null) text = Properties.Strings.GPUMode + \": \" + Properties.Strings.GPUChanging + \" ...\";\n\n                ButtonEnabled(buttonOptimized, false);\n                ButtonEnabled(buttonEco, false);\n                ButtonEnabled(buttonStandard, false);\n                ButtonEnabled(buttonUltimate, false);\n                ButtonEnabled(buttonXGM, false);\n\n                labelGPU.Text = text;\n            });\n        }\n\n        public void VisualiseGPUMode(int GPUMode = -1)\n        {\n            if (AppConfig.IsAlly())\n            {\n                tableGPU.Visible = false;\n                labelGPU.Text = \"GPU\";\n                if (Program.acpi.IsXGConnected())\n                {\n                    tableAMD.Controls.Add(buttonXGM, 1, 0);\n                    VisualizeXGM();\n                }\n                VisualiseIcon();\n                return;\n            }\n\n            ButtonEnabled(buttonOptimized, true);\n            ButtonEnabled(buttonEco, true);\n            ButtonEnabled(buttonStandard, true);\n            ButtonEnabled(buttonUltimate, true);\n\n            if (GPUMode == -1)\n                GPUMode = AppConfig.Get(\"gpu_mode\");\n\n            bool GPUAuto = AppConfig.Is(\"gpu_auto\");\n\n            buttonEco.Activated = false;\n            buttonStandard.Activated = false;\n            buttonUltimate.Activated = false;\n            buttonOptimized.Activated = false;\n\n            switch (GPUMode)\n            {\n                case AsusACPI.GPUModeEco:\n                    buttonOptimized.BorderColor = colorEco;\n                    buttonEco.Activated = !GPUAuto;\n                    buttonOptimized.Activated = GPUAuto;\n                    labelGPU.Text = Properties.Strings.GPUMode + \": \" + Properties.Strings.GPUModeEco;\n                    panelGPU.AccessibleName = Properties.Strings.GPUMode + \" - \" + (GPUAuto ? Properties.Strings.Optimized : Properties.Strings.EcoMode);\n                    break;\n                case AsusACPI.GPUModeUltimate:\n                    buttonUltimate.Activated = true;\n                    labelGPU.Text = Properties.Strings.GPUMode + \": \" + Properties.Strings.GPUModeUltimate;\n                    panelGPU.AccessibleName = Properties.Strings.GPUMode + \" - \" + Properties.Strings.UltimateMode;\n                    break;\n                default:\n                    buttonOptimized.BorderColor = colorStandard;\n                    buttonStandard.Activated = !GPUAuto;\n                    buttonOptimized.Activated = GPUAuto;\n                    labelGPU.Text = Properties.Strings.GPUMode + \": \" + (AppConfig.IsAlwaysUltimate() ? Properties.Strings.GPUModeUltimate : Properties.Strings.GPUModeStandard);\n                    panelGPU.AccessibleName = Properties.Strings.GPUMode + \" - \" + (GPUAuto ? Properties.Strings.Optimized : Properties.Strings.StandardMode);\n                    break;\n            }\n\n            VisualiseIcon();\n            VisualizeXGM(GPUMode);\n\n            if (isGpuSection)\n            {\n                menuEco.Checked = buttonEco.Activated;\n                menuStandard.Checked = buttonStandard.Activated;\n                menuUltimate.Checked = buttonUltimate.Activated;\n                menuOptimized.Checked = buttonOptimized.Activated;\n            }\n\n            // UI Fix for small screeens\n            if (Top < 0)\n            {\n                labelTipGPU.Visible = false;\n                labelTipScreen.Visible = false;\n                Top = 5;\n            }\n\n        }\n\n\n        public void VisualiseIcon()\n        {\n            if (Program.trayIcon is null) return;\n            int GPUMode = AppConfig.Get(\"gpu_mode\");\n            bool isDark = CheckSystemDarkModeStatus();\n\n            switch (GPUMode)\n            {\n                case AsusACPI.GPUModeEco:\n                    Program.trayIcon.Icon = AppConfig.IsBWIcon() ? (!isDark ? Properties.Resources.dark_eco : Properties.Resources.light_eco) : Properties.Resources.eco;\n                    break;\n                case AsusACPI.GPUModeUltimate:\n                    Program.trayIcon.Icon = AppConfig.IsBWIcon() ? (!isDark ? Properties.Resources.dark_standard : Properties.Resources.light_standard) : Properties.Resources.ultimate;\n                    break;\n                default:\n                    Program.trayIcon.Icon = AppConfig.IsBWIcon() ? (!isDark ? Properties.Resources.dark_standard : Properties.Resources.light_standard) : Properties.Resources.standard;\n                    break;\n            }\n        }\n\n        private void ButtonSilent_Click(object? sender, EventArgs e)\n        {\n            Program.modeControl.SetPerformanceMode(AsusACPI.PerformanceSilent);\n        }\n\n        private void ButtonBalanced_Click(object? sender, EventArgs e)\n        {\n            Program.modeControl.SetPerformanceMode(AsusACPI.PerformanceBalanced);\n        }\n\n        private void ButtonTurbo_Click(object? sender, EventArgs e)\n        {\n            Program.modeControl.SetPerformanceMode(AsusACPI.PerformanceTurbo);\n        }\n\n\n        public void ButtonEnabled(RButton but, bool enabled)\n        {\n            but.Enabled = enabled;\n            but.BackColor = but.Enabled ? Color.FromArgb(255, but.BackColor) : Color.FromArgb(100, but.BackColor);\n        }\n\n        public void VisualiseBatteryTitle(int limit)\n        {\n            labelBatteryTitle.Text = Properties.Strings.BatteryChargeLimit + \": \" + limit.ToString() + \"%\";\n        }\n\n        public void VisualiseBattery(int limit)\n        {\n            VisualiseBatteryTitle(limit);\n            sliderBattery.Value = limit;\n\n            sliderBattery.AccessibleName = Properties.Strings.BatteryChargeLimit + \": \" + limit.ToString() + \"%\";\n            //sliderBattery.AccessibilityObject.Select(AccessibleSelection.TakeFocus);\n\n            VisualiseBatteryFull();\n        }\n\n        public void VisualiseBatteryFull()\n        {\n            if (BatteryControl.chargeFull)\n            {\n                buttonBatteryFull.BackColor = colorStandard;\n                buttonBatteryFull.ForeColor = SystemColors.ControlLightLight;\n                buttonBatteryFull.AccessibleName = Properties.Strings.BatteryChargeLimit + \"100% on\";\n            }\n            else\n            {\n                buttonBatteryFull.BackColor = buttonSecond;\n                buttonBatteryFull.ForeColor = SystemColors.ControlDark;\n                buttonBatteryFull.AccessibleName = Properties.Strings.BatteryChargeLimit + \"100% off\";\n            }\n\n        }\n\n\n        public void VisualizePeripherals()\n        {\n            if (!PeripheralsProvider.IsAnyPeripheralConnect())\n            {\n                panelPeripherals.Visible = false;\n                return;\n            }\n\n            Button[] buttons = new Button[] { buttonPeripheral1, buttonPeripheral2, buttonPeripheral3 };\n\n            //we only support 4 devces for now. Who has more than 4 mice connected to the same PC anyways....\n            List<IPeripheral> lp = PeripheralsProvider.AllPeripherals();\n\n            for (int i = 0; i < lp.Count && i < buttons.Length; ++i)\n            {\n                IPeripheral m = lp.ElementAt(i);\n                Button b = buttons[i];\n\n                if (m.IsDeviceReady)\n                {\n                    if (m.HasBattery())\n                    {\n                        b.Text = m.GetDisplayName() + \"\\n\" + m.Battery + \"%\"\n                                            + (m.Charging ? \"(\" + Properties.Strings.Charging + \")\" : \"\");\n                    }\n                    else\n                    {\n                        b.Text = m.GetDisplayName();\n                    }\n\n                }\n                else\n                {\n                    //Mouse is either not connected or in standby\n                    b.Text = m.GetDisplayName() + \"\\n(\" + Properties.Strings.NotConnected + \")\";\n                }\n\n                switch (m.DeviceType())\n                {\n                    case PeripheralType.Mouse:\n                        b.Image = ControlHelper.ResizeImage(ControlHelper.TintImage(Properties.Resources.icons8_maus_48, b.ForeColor), ControlHelper.Scale);\n                        break;\n\n                    case PeripheralType.Keyboard:\n                        b.Image = ControlHelper.ResizeImage(ControlHelper.TintImage(Properties.Resources.icons8_keyboard_32, b.ForeColor), ControlHelper.Scale);\n                        break;\n                }\n\n                b.Visible = true;\n            }\n\n            for (int i = lp.Count; i < buttons.Length; ++i)\n            {\n                buttons[i].Visible = false;\n            }\n\n            panelPeripherals.Visible = true;\n        }\n\n        private void ButtonPeripheral_MouseEnter(object? sender, EventArgs e)\n        {\n            int index = 0;\n            if (sender == buttonPeripheral2) index = 1;\n            if (sender == buttonPeripheral3) index = 2;\n            IPeripheral iph = PeripheralsProvider.AllPeripherals().ElementAt(index);\n\n\n            if (iph is null)\n            {\n                return;\n            }\n\n            if (!iph.IsDeviceReady)\n            {\n                //Refresh battery on hover if the device is marked as \"Not Ready\"\n                iph.ReadBattery();\n            }\n        }\n\n        private void ButtonPeripheral_Click(object? sender, EventArgs e)\n        {\n            if (mouseSettings is not null)\n            {\n                mouseSettings.Close();\n                return;\n            }\n\n            int index = 0;\n            if (sender == buttonPeripheral2) index = 1;\n            if (sender == buttonPeripheral3) index = 2;\n\n            IPeripheral iph = PeripheralsProvider.AllPeripherals().ElementAt(index);\n\n            if (iph is null)\n            {\n                //Can only happen when the user hits the button in the exact moment a device is disconnected.\n                return;\n            }\n\n            if (iph.DeviceType() == PeripheralType.Mouse)\n            {\n                AsusMouse? am = iph as AsusMouse;\n                if (am is null || !am.IsDeviceReady)\n                {\n                    //Should not happen if all device classes are implemented correctly. But better safe than sorry.\n                    return;\n                }\n                mouseSettings = new AsusMouseSettings(am);\n                mouseSettings.TopMost = AppConfig.Is(\"topmost\");\n                mouseSettings.FormClosed += MouseSettings_FormClosed;\n                mouseSettings.Disposed += MouseSettings_Disposed;\n                if (!mouseSettings.IsDisposed)\n                {\n                    mouseSettings.Show();\n                }\n                else\n                {\n                    mouseSettings = null;\n                }\n\n            }\n        }\n\n        private void MouseSettings_Disposed(object? sender, EventArgs e)\n        {\n            mouseSettings = null;\n        }\n\n        private void MouseSettings_FormClosed(object? sender, FormClosedEventArgs e)\n        {\n            mouseSettings = null;\n        }\n\n        public void VisualiseAudio(double level)\n        {\n            int filledSquares = (int)Math.Round(level/2);\n            string squares = new string('|', filledSquares);\n            Invoke(delegate\n            {\n                labelMatrix.Text = $\"Slash Lighting: {squares}\";\n            });\n        }\n\n        public void VisualiseFnLock()\n        {\n\n            if (AppConfig.Is(\"fn_lock\"))\n            {\n                buttonFnLock.BackColor = colorStandard;\n                buttonFnLock.ForeColor = SystemColors.ControlLightLight;\n                buttonFnLock.AccessibleName = \"Fn-Lock on\";\n            }\n            else\n            {\n                buttonFnLock.BackColor = buttonSecond;\n                buttonFnLock.ForeColor = SystemColors.ControlDark;\n                buttonFnLock.AccessibleName = \"Fn-Lock off\";\n            }\n        }\n\n\n        private void ButtonFnLock_Click(object? sender, EventArgs e)\n        {\n            InputDispatcher.ToggleFnLock();\n        }\n\n    }\n\n\n}\n"
  },
  {
    "path": "app/Settings.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!--\n    Microsoft ResX Schema\n\n    Version 2.0\n\n    The primary goals of this format is to allow a simple XML format\n    that is mostly human readable. The generation and parsing of the\n    various data types are done through the TypeConverter classes\n    associated with the data types.\n\n    Example:\n\n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n\n    There are any number of \"resheader\" rows that contain simple\n    name/value pairs.\n\n    Each data row contains a name, and value. The row also contains a\n    type or mimetype. Type corresponds to a .NET class that support\n    text/value conversion through the TypeConverter architecture.\n    Classes that don't support this are serialized and stored with the\n    mimetype set.\n\n    The mimetype is used for serialized objects, and tells the\n    ResXResourceReader how to depersist the object. This is currently not\n    extensible. For a given mimetype the value must be set accordingly:\n\n    Note - application/x-microsoft.net.object.binary.base64 is the format\n    that the ResXResourceWriter will generate, however the reader can\n    read any of the formats listed below.\n\n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array\n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "app/UI/ControlHelper.cs",
    "content": "﻿using GHelper.UI;\nusing System.Drawing.Drawing2D;\nusing System.Windows.Forms.DataVisualization.Charting;\n\npublic static class ControlHelper\n{\n\n    static bool _invert = false;\n    static float _scale = 1;\n\n    public static float Scale => _scale;\n\n    public static void Adjust(RForm container, bool invert = false)\n    {\n\n        container.BackColor = RForm.formBack;\n        container.ForeColor = RForm.foreMain;\n\n        _invert = invert;\n        AdjustControls(container.Controls);\n        _invert = false;\n\n    }\n\n    public static void Resize(RForm container, float baseScale = 2)\n    {\n        _scale = GetDpiScale(container).Value / baseScale;\n        if (Math.Abs(_scale - 1) > 0.2) ResizeControls(container.Controls);\n\n    }\n\n    private static void ResizeControls(Control.ControlCollection controls)\n    {\n        foreach (Control control in controls)\n        {\n            var button = control as RButton;\n            if (button != null && button.Image is not null)\n                button.Image = ResizeImage(button.Image);\n\n            /*\n            var pictureBox = control as PictureBox;\n            if (pictureBox != null && pictureBox.BackgroundImage is not null)\n                pictureBox.BackgroundImage = ResizeImage(pictureBox.BackgroundImage);\n            */\n\n            ResizeControls(control.Controls);\n        }\n    }\n\n\n    private static void AdjustControls(Control.ControlCollection controls)\n    {\n        foreach (Control control in controls)\n        {\n\n            AdjustControls(control.Controls);\n\n            var button = control as RButton;\n            if (button != null)\n            {\n                button.BackColor = button.Secondary ? RForm.buttonSecond : RForm.buttonMain;\n                button.ForeColor = RForm.foreMain;\n\n                button.FlatStyle = FlatStyle.Flat;\n                button.FlatAppearance.BorderColor = RForm.borderMain;\n\n                if (button.Image is not null)\n                    button.Image = AdjustImage(button.Image);\n            }\n\n            var pictureBox = control as PictureBox;\n            if (pictureBox != null && pictureBox.BackgroundImage is not null)\n                pictureBox.BackgroundImage = AdjustImage(pictureBox.BackgroundImage);\n\n\n            var combo = control as RComboBox;\n            if (combo != null)\n            {\n                combo.BackColor = RForm.buttonMain;\n                combo.ForeColor = RForm.foreMain;\n                combo.BorderColor = RForm.buttonMain;\n                combo.ButtonColor = RForm.buttonMain;\n                combo.ArrowColor = RForm.foreMain;\n            }\n            var numbericUpDown = control as NumericUpDown;\n            if(numbericUpDown is not null)\n            {\n                numbericUpDown.ForeColor = RForm.foreMain;\n                numbericUpDown.BackColor = RForm.buttonMain;\n            }\n\n            var gb = control as GroupBox;\n            if (gb != null)\n            {\n                gb.ForeColor = RForm.foreMain;\n            }\n\n            var pn = control as Panel;\n            if (pn != null && pn.Name.Contains(\"Header\"))\n            {\n                pn.BackColor = RForm.buttonSecond;\n            }\n\n            var sl = control as Slider;\n            if (sl != null)\n            {\n                sl.borderColor = RForm.buttonMain;\n            }\n\n            var chk = control as CheckBox;\n            if (chk != null && chk.BackColor != RForm.formBack)\n            {\n                chk.BackColor = RForm.buttonSecond;\n            }\n\n            var chart = control as Chart;\n            if (chart != null)\n            {\n                chart.BackColor = RForm.chartMain;\n                chart.ChartAreas[0].BackColor = RForm.chartMain;\n\n                chart.ChartAreas[0].AxisX.TitleForeColor = RForm.foreMain;\n                chart.ChartAreas[0].AxisY.TitleForeColor = RForm.foreMain;\n\n                chart.ChartAreas[0].AxisX.LabelStyle.ForeColor = RForm.foreMain;\n                chart.ChartAreas[0].AxisY.LabelStyle.ForeColor = RForm.foreMain;\n\n                chart.ChartAreas[0].AxisX.MajorTickMark.LineColor = RForm.foreMain;\n                chart.ChartAreas[0].AxisY.MajorTickMark.LineColor = RForm.foreMain;\n\n                chart.ChartAreas[0].AxisX.MajorGrid.LineColor = RForm.chartGrid;\n                chart.ChartAreas[0].AxisY.MajorGrid.LineColor = RForm.chartGrid;\n                chart.ChartAreas[0].AxisX.LineColor = RForm.chartGrid;\n                chart.ChartAreas[0].AxisY.LineColor = RForm.chartGrid;\n\n                chart.Titles[0].ForeColor = RForm.foreMain;\n\n            }\n\n        }\n    }\n\n    public static Lazy<float> GetDpiScale(Control control)\n    {\n        return new Lazy<float>(() =>\n        {\n            using (var graphics = control.CreateGraphics())\n                return graphics.DpiX / 96.0f;\n        });\n    }\n\n    private static Image ResizeImage(Image image)\n    {\n        return ResizeImage(image, _scale);\n    }\n\n    public static Image ResizeImage(Image image, float scale)\n    {\n        if (Math.Abs(scale - 1) < 0.1) return image;\n\n        var newSize = new Size((int)(image.Width * scale), (int)(image.Height * scale));\n        var pic = new Bitmap(newSize.Width, newSize.Height);\n\n        using (var g = Graphics.FromImage(pic))\n        {\n            g.InterpolationMode = InterpolationMode.HighQualityBicubic;\n            g.DrawImage(image, new Rectangle(new Point(), newSize));\n        }\n        return pic;\n    }\n\n    private static Image AdjustImage(Image image)\n    {\n        var pic = new Bitmap(image);\n\n        if (_invert)\n        {\n            for (int y = 0; (y <= (pic.Height - 1)); y++)\n            {\n                for (int x = 0; (x <= (pic.Width - 1)); x++)\n                {\n                    Color col = pic.GetPixel(x, y);\n                    pic.SetPixel(x, y, Color.FromArgb(col.A, (255 - col.R), (255 - col.G), (255 - col.B)));\n                }\n            }\n        }\n\n        return pic;\n\n    }\n\n    public static Image TintImage(Image image, Color tintColor)\n    {\n        var pic = new Bitmap(image);\n\n        for (int y = 0; (y <= (pic.Height - 1)); y++)\n        {\n            for (int x = 0; (x <= (pic.Width - 1)); x++)\n            {\n                Color col = pic.GetPixel(x, y);\n                pic.SetPixel(x, y, Color.FromArgb(col.A, tintColor.R, tintColor.G, tintColor.B));\n            }\n        }\n\n        return pic;\n    }\n\n}\n"
  },
  {
    "path": "app/UI/CustomContextMenu.cs",
    "content": "﻿using System.Runtime.InteropServices;\n\nnamespace GHelper.UI\n{\n    class CustomContextMenu : ContextMenuStrip\n    {\n        [DllImport(\"dwmapi.dll\", CharSet = CharSet.Unicode, SetLastError = true)]\n        private static extern long DwmSetWindowAttribute(nint hwnd,\n                                                            DWMWINDOWATTRIBUTE attribute,\n                                                            ref DWM_WINDOW_CORNER_PREFERENCE pvAttribute,\n                                                            uint cbAttribute);\n\n        public CustomContextMenu()\n        {\n            var preference = DWM_WINDOW_CORNER_PREFERENCE.DWMWCP_ROUNDSMALL;     //change as you want\n            DwmSetWindowAttribute(Handle,\n                                  DWMWINDOWATTRIBUTE.DWMWA_WINDOW_CORNER_PREFERENCE,\n                                  ref preference,\n                                  sizeof(uint));\n        }\n\n        public enum DWMWINDOWATTRIBUTE\n        {\n            DWMWA_WINDOW_CORNER_PREFERENCE = 33\n        }\n        public enum DWM_WINDOW_CORNER_PREFERENCE\n        {\n            DWMWA_DEFAULT = 0,\n            DWMWCP_DONOTROUND = 1,\n            DWMWCP_ROUND = 2,\n            DWMWCP_ROUNDSMALL = 3,\n        }\n    }\n\n}"
  },
  {
    "path": "app/UI/IconHelper.cs",
    "content": "﻿using System.Diagnostics;\nusing System.Runtime.InteropServices;\n\nnamespace GHelper.UI\n{\n    public class IconHelper\n    {\n\n        [DllImport(\"user32.dll\", CharSet = CharSet.Auto)]\n        private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);\n\n        private const uint WM_SETICON = 0x80u;\n        private const int ICON_SMALL = 0;\n        private const int ICON_BIG = 1;\n\n\n        public static void SetIcon(Form form, Bitmap icon)\n        {\n            try\n            {\n                SendMessage(form.Handle, WM_SETICON, ICON_BIG, Icon.ExtractAssociatedIcon(Application.ExecutablePath)!.Handle);\n                SendMessage(form.Handle, WM_SETICON, ICON_SMALL, icon.GetHicon());\n            }\n            catch (Exception ex)\n            {\n                Debug.WriteLine($\"Error setting icon {ex.Message}\");\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "app/UI/NumericUpDownWithUnit.cs",
    "content": "﻿using System.Globalization;\nusing System.Text.RegularExpressions;\n\npublic class NumericUpDownWithUnit : NumericUpDown\n{\n    #region| Fields |\n\n    private string unit = null;\n    private bool unitFirst = false;\n\n    #endregion\n\n    #region| Properties |\n\n    public string Unit\n    {\n        get => unit;\n        set\n        {\n            unit = value;\n\n            UpdateEditText();\n        }\n    }\n\n    public bool UnitFirst\n    {\n        get => unitFirst;\n        set\n        {\n            unitFirst = value;\n\n            UpdateEditText();\n        }\n    }\n\n    #endregion\n\n    #region| Methods |\n\n    /// <summary>\n    /// Method called when updating the numeric updown text.\n    /// </summary>\n    protected override void UpdateEditText()\n    {\n        // If there is a unit we handle it ourselfs, if there is not we leave it to the base class.\n        if (Unit != null && Unit != string.Empty)\n        {\n            if (UnitFirst)\n            {\n                Text = $\"({Unit}) {Value}\";\n            }\n            else\n            {\n                Text = $\"{Value} ({Unit})\";\n            }\n        }\n        else\n        {\n            base.UpdateEditText();\n        }\n    }\n\n    /// <summary>\n    /// Validate method called before actually updating the text.\n    /// This is exactly the same as the base class but it will use the new ParseEditText from this class instead.\n    /// </summary>\n    protected override void ValidateEditText()\n    {\n        // See if the edit text parses to a valid decimal considering the label unit\n        ParseEditText();\n        UpdateEditText();\n    }\n\n    /// <summary>\n    /// Converts the text displayed in the up-down control to a numeric value and evaluates it.\n    /// </summary>\n    protected new void ParseEditText()\n    {\n        try\n        {\n            // The only difference of this methods to the base one is that text is replaced directly\n            // with the property Text instead of using the regex.\n            // We now that the only characters that may be on the textbox are from the unit we provide.\n            // because the NumericUpDown handles invalid input from user for us.\n            // This is where the magic happens. This regex will match all characters from the unit\n            // (so your unit cannot have numbers). You can change this regex to fill your needs\n            var regex = new Regex($@\"[^(?!{Unit} )]+\");\n            var match = regex.Match(Text);\n\n            if (match.Success)\n            {\n                var text = match.Value;\n\n                // VSWhidbey 173332: Verify that the user is not starting the string with a \"-\"\n                // before attempting to set the Value property since a \"-\" is a valid character with\n                // which to start a string representing a negative number.\n                if (!string.IsNullOrEmpty(text) && !(text.Length == 1 && text == \"-\"))\n                {\n                    if (Hexadecimal)\n                    {\n                        Value = Constrain(Convert.ToDecimal(Convert.ToInt32(Text, 16)));\n                    }\n                    else\n                    {\n                        Value = Constrain(Decimal.Parse(text, CultureInfo.CurrentCulture));\n                    }\n                }\n            }\n        }\n        catch\n        {\n            // Leave value as it is\n        }\n        finally\n        {\n            UserEdit = false;\n        }\n    }\n\n    /// </summary>\n    /// Returns the provided value constrained to be within the min and max.\n    /// This is exactly the same as the one in base class (which is private so we can't directly use it).\n    /// </summary>\n    private decimal Constrain(decimal value)\n    {\n        if (value < Minimum)\n        {\n            value = Minimum;\n        }\n\n        if (value > Maximum)\n        {\n            value = Maximum;\n        }\n\n        return value;\n    }\n\n    #endregion\n}"
  },
  {
    "path": "app/UI/RBadgeButton.cs",
    "content": "using System.Drawing.Drawing2D;\n\nnamespace GHelper.UI\n{\n    public class RBadgeButton : RButton\n    {\n        private int badge = 0;\n        public int Badge\n        {\n            get => badge;\n            set\n            {\n                if (badge != value)\n                {\n                    badge = value;\n                    Invalidate();\n                }\n            }\n        }\n\n        protected override void OnPaint(PaintEventArgs pevent)\n        {\n            base.OnPaint(pevent);\n\n            if (badge <= 0) return;\n\n            float ratio = pevent.Graphics.DpiX / 192.0f;\n            var rectSurface = ClientRectangle;\n\n            using (Brush brush = new SolidBrush(BorderColor))\n            {\n                var radius = ratio * 14;\n                var badgeRect = new RectangleF(\n                    rectSurface.Width - rectSurface.Height / 2f - radius,\n                    rectSurface.Height / 2f - radius,\n                    radius + radius,\n                    radius + radius\n                );\n\n                pevent.Graphics.SmoothingMode = SmoothingMode.AntiAlias;\n                pevent.Graphics.FillEllipse(brush, badgeRect);\n\n                using (Font badgeFont = new Font(\"Arial\", (float)(0.8 * Font.Size), FontStyle.Bold))\n                using (StringFormat sf = new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center })\n                {\n                    badgeRect.Width = (float)Math.Ceiling(badgeRect.Width*ratio)/ratio;\n                    badgeRect.Height = (float)Math.Ceiling(badgeRect.Height*ratio)/ratio;\n                    pevent.Graphics.DrawString(badge.ToString(), badgeFont, Brushes.White, badgeRect, sf);\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "app/UI/RButton.cs",
    "content": "﻿using System.Drawing.Drawing2D;\n\nnamespace GHelper.UI\n{\n    public class RButton : Button\n    {\n\n        //Fields\n        private int borderSize = 5;\n\n        private int borderRadius = 5;\n        public int BorderRadius\n        {\n            get { return borderRadius; }\n            set\n            {\n                borderRadius = value;\n            }\n        }\n\n        private Color borderColor = Color.Transparent;\n        public Color BorderColor\n        {\n            get { return borderColor; }\n            set\n            {\n                borderColor = value;\n            }\n        }\n\n\n        private bool activated = false;\n        public bool Activated\n        {\n            get { return activated; }\n            set\n            {\n                if (activated != value)\n                    Invalidate();\n                activated = value;\n\n            }\n        }\n\n        private bool secondary = false;\n        public bool Secondary\n        {\n            get { return secondary; }\n            set\n            {\n                secondary = value;\n            }\n        }\n\n        public RButton()\n        {\n            DoubleBuffered = true;\n            FlatStyle = FlatStyle.Flat;\n            FlatAppearance.BorderSize = 0;\n        }\n\n        private GraphicsPath GetFigurePath(Rectangle rect, int radius)\n        {\n            GraphicsPath path = new GraphicsPath();\n            float curveSize = radius * 2F;\n\n            path.StartFigure();\n            path.AddArc(rect.X, rect.Y, curveSize, curveSize, 180, 90);\n            path.AddArc(rect.Right - curveSize, rect.Y, curveSize, curveSize, 270, 90);\n            path.AddArc(rect.Right - curveSize, rect.Bottom - curveSize, curveSize, curveSize, 0, 90);\n            path.AddArc(rect.X, rect.Bottom - curveSize, curveSize, curveSize, 90, 90);\n            path.CloseFigure();\n            return path;\n        }\n\n\n        protected override void OnPaint(PaintEventArgs pevent)\n        {\n\n            base.OnPaint(pevent);\n\n            float ratio = pevent.Graphics.DpiX / 192.0f;\n            int border = (int)(ratio * borderSize);\n\n            Rectangle rectSurface = ClientRectangle;\n            Rectangle rectBorder = Rectangle.Inflate(rectSurface, -border, -border);\n\n            Color borderDrawColor = activated ? borderColor : Color.Transparent;\n\n            using (GraphicsPath pathSurface = GetFigurePath(rectSurface, borderRadius + border))\n            using (GraphicsPath pathBorder = GetFigurePath(rectBorder, borderRadius))\n            using (Pen penSurface = new Pen(Parent.BackColor, border))\n            using (Pen penBorder = new Pen(borderDrawColor, border))\n            {\n                penBorder.Alignment = PenAlignment.Outset;\n                pevent.Graphics.SmoothingMode = SmoothingMode.AntiAlias;\n                Region = new Region(pathSurface);\n                pevent.Graphics.DrawPath(penSurface, pathSurface);\n                pevent.Graphics.DrawPath(penBorder, pathBorder);\n            }\n\n            if (!Enabled && ForeColor != SystemColors.ControlText)\n            {\n                var rect = pevent.ClipRectangle;\n                if (Image is not null)\n                {\n                    rect.Y += Image.Height;\n                    rect.Height -= Image.Height;\n                }\n                TextFormatFlags flags = TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter | TextFormatFlags.WordBreak;\n                TextRenderer.DrawText(pevent.Graphics, Text, Font, rect, Color.Gray, flags);\n            }\n\n\n        }\n\n    }\n}\n"
  },
  {
    "path": "app/UI/RCheckBox.cs",
    "content": "﻿namespace GHelper.UI\n{\n    public class RCheckBox : CheckBox\n    {\n\n    }\n}\n"
  },
  {
    "path": "app/UI/RComboBox.cs",
    "content": "﻿using System.ComponentModel;\nusing System.Drawing.Drawing2D;\nusing System.Runtime.InteropServices;\n\nnamespace GHelper.UI\n{\n    public class RComboBox : ComboBox\n    {\n\n        private Color borderColor = Color.Gray;\n        [DefaultValue(typeof(Color), \"Gray\")]\n        public Color BorderColor\n        {\n            get { return borderColor; }\n            set\n            {\n                if (borderColor != value)\n                {\n                    borderColor = value;\n                    Invalidate();\n                }\n            }\n        }\n\n\n        private Color buttonColor = Color.FromArgb(255, 255, 255, 255);\n        [DefaultValue(typeof(Color), \"255, 255, 255\")]\n        public Color ButtonColor\n        {\n            get { return buttonColor; }\n            set\n            {\n                if (buttonColor != value)\n                {\n                    buttonColor = value;\n                    Invalidate();\n                }\n            }\n        }\n\n        private Color arrowColor = Color.Black;\n        [DefaultValue(typeof(Color), \"Black\")]\n        public Color ArrowColor\n        {\n            get { return arrowColor; }\n            set\n            {\n                if (arrowColor != value)\n                {\n                    arrowColor = value;\n                    Invalidate();\n                }\n            }\n        }\n\n\n        public static GraphicsPath RoundedRect(Rectangle bounds, int radiusL, int radiusR)\n        {\n            int diameterL = radiusL * 2;\n            int diameterR = radiusR * 2;\n\n            Size sizeL = new Size(diameterL, diameterL);\n            Size sizeR = new Size(diameterR, diameterR);\n\n            Rectangle arcL = new Rectangle(bounds.Location, sizeL);\n            Rectangle arcR = new Rectangle(bounds.Location, sizeR);\n\n            GraphicsPath path = new GraphicsPath();\n\n            // top left arc  \n            path.AddArc(arcL, 180, 90);\n\n            // top right arc  \n            arcR.X = bounds.Right - diameterR;\n            arcR.Y = bounds.Top;\n            path.AddArc(arcR, 270, 90);\n\n            // bottom right arc  \n            arcR.Y = bounds.Bottom - diameterR;\n            arcR.X = bounds.Right - diameterR;\n            path.AddArc(arcR, 0, 90);\n\n            // bottom left arc \n            arcL.X = bounds.Left;\n            arcL.Y = bounds.Bottom - diameterL;\n            path.AddArc(arcL, 90, 90);\n\n            path.CloseFigure();\n            return path;\n        }\n\n        public static void DrawRoundedRectangle(Graphics graphics, Pen pen, Rectangle bounds, int cornerRadiusL = 5, int cornerRadiusR = 5)\n        {\n            if (graphics == null)\n                throw new ArgumentNullException(nameof(graphics));\n            if (pen == null)\n                throw new ArgumentNullException(nameof(pen));\n\n            using (GraphicsPath path = RoundedRect(bounds, cornerRadiusL, cornerRadiusR))\n            {\n                graphics.DrawPath(pen, path);\n            }\n        }\n\n        public static void FillRoundedRectangle(Graphics graphics, Brush brush, Rectangle bounds, int cornerRadiusL = 5, int cornerRadiusR = 5)\n        {\n            if (graphics == null)\n                throw new ArgumentNullException(nameof(graphics));\n            if (brush == null)\n                throw new ArgumentNullException(nameof(brush));\n\n            using (GraphicsPath path = RoundedRect(bounds, cornerRadiusL, cornerRadiusR))\n            {\n                graphics.FillPath(brush, path);\n            }\n        }\n\n        protected override void WndProc(ref Message m)\n        {\n            if (m.Msg == WM_PAINT && DropDownStyle != ComboBoxStyle.Simple)\n            {\n                var clientRect = ClientRectangle;\n                var dropDownButtonWidth = SystemInformation.HorizontalScrollBarArrowWidth;\n                var outerBorder = new Rectangle(clientRect.Location,\n                    new Size(clientRect.Width - 1, clientRect.Height - 1));\n                var innerBorder = new Rectangle(outerBorder.X + 1, outerBorder.Y + 1,\n                    outerBorder.Width - dropDownButtonWidth - 2, outerBorder.Height - 2);\n                var innerInnerBorder = new Rectangle(innerBorder.X + 1, innerBorder.Y + 1,\n                    innerBorder.Width - 2, innerBorder.Height - 2);\n                var dropDownRect = new Rectangle(innerBorder.Right + 1, innerBorder.Y,\n                    dropDownButtonWidth, innerBorder.Height + 1);\n                if (RightToLeft == RightToLeft.Yes)\n                {\n                    innerBorder.X = clientRect.Width - innerBorder.Right;\n                    innerInnerBorder.X = clientRect.Width - innerInnerBorder.Right;\n                    dropDownRect.X = clientRect.Width - dropDownRect.Right;\n                    dropDownRect.Width += 1;\n                }\n                var innerBorderColor = BackColor;\n                var outerBorderColor = BorderColor;\n                var buttonColor = ButtonColor;\n                var middle = new Point(dropDownRect.Left + dropDownRect.Width / 2,\n                    dropDownRect.Top + dropDownRect.Height / 2);\n                var arrow = new Point[]\n                {\n                new Point(middle.X - 3, middle.Y - 2),\n                new Point(middle.X + 4, middle.Y - 2),\n                new Point(middle.X, middle.Y + 2)\n                };\n                var ps = new PAINTSTRUCT();\n                bool shoulEndPaint = false;\n                nint dc;\n                if (m.WParam == nint.Zero)\n                {\n                    dc = BeginPaint(Handle, ref ps);\n                    m.WParam = dc;\n                    shoulEndPaint = true;\n                }\n                else\n                {\n                    dc = m.WParam;\n                }\n\n                var rgn = CreateRectRgn(innerInnerBorder.Left, innerInnerBorder.Top,\n                    innerInnerBorder.Right, innerInnerBorder.Bottom);\n\n                SelectClipRgn(dc, rgn);\n                DefWndProc(ref m);\n                DeleteObject(rgn);\n                rgn = CreateRectRgn(clientRect.Left, clientRect.Top,\n                    clientRect.Right, clientRect.Bottom);\n                SelectClipRgn(dc, rgn);\n                using (var g = Graphics.FromHdc(dc))\n                {\n                    using (var b = new SolidBrush(buttonColor))\n                    {\n                        //FillRoundedRectangle(g, b, dropDownRect, 1, 3);\n                        g.FillRectangle(b, dropDownRect);\n                    }\n                    using (var b = new SolidBrush(arrowColor))\n                    {\n                        g.FillPolygon(b, arrow);\n                    }\n                    using (var p = new Pen(innerBorderColor, 2))\n                    {\n                        DrawRoundedRectangle(g, p, innerBorder, 3, 1);\n                        //DrawRoundedRectangle(g, p, innerInnerBorder, 3, 1);\n\n                        //g.DrawRectangle(p, innerBorder);\n                        //g.DrawRectangle(p, innerInnerBorder);\n                    }\n                    using (var p = new Pen(outerBorderColor))\n                    {\n                        DrawRoundedRectangle(g, p, outerBorder, 4, 4);\n                        //g.DrawRectangle(p, outerBorder);\n                    }\n                }\n                if (shoulEndPaint)\n                    EndPaint(Handle, ref ps);\n                DeleteObject(rgn);\n            }\n            else\n                base.WndProc(ref m);\n        }\n\n        private const int WM_PAINT = 0xF;\n        [StructLayout(LayoutKind.Sequential)]\n        public struct RECT\n        {\n            public int L, T, R, B;\n        }\n        [StructLayout(LayoutKind.Sequential)]\n        public struct PAINTSTRUCT\n        {\n            public nint hdc;\n            public bool fErase;\n            public int rcPaint_left;\n            public int rcPaint_top;\n            public int rcPaint_right;\n            public int rcPaint_bottom;\n            public bool fRestore;\n            public bool fIncUpdate;\n            public int reserved1;\n            public int reserved2;\n            public int reserved3;\n            public int reserved4;\n            public int reserved5;\n            public int reserved6;\n            public int reserved7;\n            public int reserved8;\n        }\n        [DllImport(\"user32.dll\")]\n        private static extern nint BeginPaint(nint hWnd,\n            [In, Out] ref PAINTSTRUCT lpPaint);\n\n        [DllImport(\"user32.dll\")]\n        private static extern bool EndPaint(nint hWnd, ref PAINTSTRUCT lpPaint);\n\n        [DllImport(\"gdi32.dll\")]\n        public static extern int SelectClipRgn(nint hDC, nint hRgn);\n\n        [DllImport(\"user32.dll\")]\n        public static extern int GetUpdateRgn(nint hwnd, nint hrgn, bool fErase);\n        public enum RegionFlags\n        {\n            ERROR = 0,\n            NULLREGION = 1,\n            SIMPLEREGION = 2,\n            COMPLEXREGION = 3,\n        }\n        [DllImport(\"gdi32.dll\")]\n        internal static extern bool DeleteObject(nint hObject);\n\n        [DllImport(\"gdi32.dll\")]\n        private static extern nint CreateRectRgn(int x1, int y1, int x2, int y2);\n    }\n}\n"
  },
  {
    "path": "app/UI/RForm.cs",
    "content": "﻿using Microsoft.Win32;\nusing System.Runtime.InteropServices;\n\nnamespace GHelper.UI\n{\n    public class RForm : Form\n    {\n\n        public static Color colorEco = Color.FromArgb(255, 6, 180, 138);\n        public static Color colorStandard = Color.FromArgb(255, 58, 174, 239);\n        public static Color colorTurbo = Color.FromArgb(255, 255, 32, 32);\n        public static Color colorCustom = Color.FromArgb(255, 255, 128, 0);\n        public static Color colorGray = Color.FromArgb(255, 168, 168, 168);\n\n\n        public static Color buttonMain;\n        public static Color buttonSecond;\n\n        public static Color formBack;\n        public static Color foreMain;\n        public static Color borderMain;\n        public static Color chartMain;\n        public static Color chartGrid;\n\n        [DllImport(\"UXTheme.dll\", SetLastError = true, EntryPoint = \"#138\")]\n        public static extern bool CheckSystemDarkModeStatus();\n\n        [DllImport(\"DwmApi\")] //System.Runtime.InteropServices\n        private static extern int DwmSetWindowAttribute(nint hwnd, int attr, int[] attrValue, int attrSize);\n\n        public bool darkTheme = false;\n        protected override CreateParams CreateParams\n        {\n            get\n            {\n                var parms = base.CreateParams;\n                parms.Style &= ~0x02000000;  // Turn off WS_CLIPCHILDREN\n                parms.ClassStyle &= ~0x00020000;\n                return parms;\n            }\n        }\n        public static void InitColors(bool darkTheme)\n        {\n            if (darkTheme)\n            {\n                buttonMain = Color.FromArgb(255, 55, 55, 55);\n                buttonSecond = Color.FromArgb(255, 38, 38, 38);\n\n                formBack = Color.FromArgb(255, 28, 28, 28);\n                foreMain = Color.FromArgb(255, 240, 240, 240);\n                borderMain = Color.FromArgb(255, 50, 50, 50);\n\n                chartMain = Color.FromArgb(255, 35, 35, 35);\n                chartGrid = Color.FromArgb(255, 70, 70, 70);\n            }\n            else\n            {\n                buttonMain = SystemColors.ControlLightLight;\n                buttonSecond = SystemColors.ControlLight;\n\n                formBack = SystemColors.Control;\n                foreMain = SystemColors.ControlText;\n                borderMain = Color.LightGray;\n\n                chartMain = SystemColors.ControlLightLight;\n                chartGrid = Color.LightGray;\n            }\n        }\n\n        private static bool IsDarkTheme()\n        {\n            string? uiMode = AppConfig.GetString(\"ui_mode\");\n\n            if (uiMode is not null && uiMode.ToLower() == \"dark\")\n            {\n                return true;\n            }\n\n            if (uiMode is not null && uiMode.ToLower() == \"light\")\n            {\n                return false;\n            }\n\n            if (uiMode is not null && uiMode.ToLower() == \"windows\")\n            {\n                return CheckSystemDarkModeStatus();\n            }\n\n            using var key = Registry.CurrentUser.OpenSubKey(@\"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize\");\n            var registryValueObject = key?.GetValue(\"AppsUseLightTheme\");\n\n            if (registryValueObject == null) return false;\n            return (int)registryValueObject <= 0;\n        }\n\n        public bool InitTheme(bool setDPI = false)\n        {\n            bool newDarkTheme = IsDarkTheme();\n            bool changed = darkTheme != newDarkTheme;\n            darkTheme = newDarkTheme;\n\n            InitColors(darkTheme);\n\n            if (setDPI)\n                ControlHelper.Resize(this);\n\n            if (changed)\n            {\n                DwmSetWindowAttribute(Handle, 20, new[] { darkTheme ? 1 : 0 }, 4);\n                ControlHelper.Adjust(this, changed);\n                this.Invalidate();\n            }\n\n\n            return changed;\n\n        }\n\n    }\n}\n"
  },
  {
    "path": "app/UI/RForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "app/UI/Slider.cs",
    "content": "﻿using System.Drawing.Drawing2D;\n\nnamespace GHelper.UI\n{\n    public static class GraphicsExtensions\n    {\n        public static void DrawCircle(this Graphics g, Pen pen,\n                                      float centerX, float centerY, float radius)\n        {\n            g.DrawEllipse(pen, centerX - radius, centerY - radius,\n                          radius + radius, radius + radius);\n        }\n\n        public static void FillCircle(this Graphics g, Brush brush,\n                                      float centerX, float centerY, float radius)\n        {\n            g.FillEllipse(brush, centerX - radius, centerY - radius,\n                          radius + radius, radius + radius);\n        }\n    }\n\n    public class Slider : Control\n    {\n        private float _radius;\n        private PointF _thumbPos;\n        private SizeF _barSize;\n        private PointF _barPos;\n\n\n        public Color accentColor = Color.FromArgb(255, 58, 174, 239);\n        public Color borderColor = Color.White;\n\n        public event EventHandler ValueChanged;\n\n        public Slider()\n        {\n            // This reduces flicker\n            DoubleBuffered = true;\n            TabStop = true;\n        }\n\n\n        private int _min = 0;\n        public int Min\n        {\n            get => _min;\n            set\n            {\n                _min = value;\n                RecalculateParameters();\n            }\n        }\n\n        private int _max = 100;\n        public int Max\n        {\n            get => _max;\n            set\n            {\n                _max = value;\n                RecalculateParameters();\n            }\n        }\n\n\n        private int _step = 1;\n        public int Step\n        {\n            get => _step;\n            set\n            {\n                _step = value;\n            }\n        }\n        private int _value = 50;\n        public int Value\n        {\n            get => _value;\n            set\n            {\n\n                value = (int)Math.Round(value / (float)_step) * _step;\n\n                if (_value != value)\n                {\n                    _value = value;\n                    ValueChanged?.Invoke(this, EventArgs.Empty);\n                    RecalculateParameters();\n                }\n            }\n        }\n\n\n        protected override bool IsInputKey(Keys keyData)\n        {\n            switch (keyData)\n            {\n                case Keys.Right:\n                case Keys.Left:\n                case Keys.Up:\n                case Keys.Down:\n                    return true;\n            }\n\n            return base.IsInputKey(keyData);\n        }\n\n        protected override void OnKeyDown(KeyEventArgs e)\n        {\n\n            switch (e.KeyCode)\n            {\n                case Keys.Right:\n                case Keys.Up:\n                    Value = Math.Min(Max, Value + Step);\n                    break;\n                case Keys.Left:\n                case Keys.Down:\n                    Value = Math.Max(Min, Value - Step);\n                    break;\n            }\n\n            AccessibilityNotifyClients(AccessibleEvents.Focus, 0);\n\n            base.OnKeyDown(e);\n        }\n\n        protected override void OnPaint(PaintEventArgs e)\n        {\n            base.OnPaint(e);\n\n            Brush brushAccent = new SolidBrush(accentColor);\n            Brush brushEmpty = new SolidBrush(Color.Gray);\n            Brush brushBorder = new SolidBrush(borderColor);\n\n            e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;\n            e.Graphics.FillRectangle(brushEmpty,\n                _barPos.X, _barPos.Y, _barSize.Width, _barSize.Height);\n            e.Graphics.FillRectangle(brushAccent,\n                _barPos.X, _barPos.Y, _thumbPos.X - _barPos.X, _barSize.Height);\n\n            e.Graphics.FillCircle(brushBorder, _thumbPos.X, _thumbPos.Y, _radius);\n            e.Graphics.FillCircle(brushAccent, _thumbPos.X, _thumbPos.Y, 0.7f * _radius);\n        }\n\n        protected override void OnResize(EventArgs e)\n        {\n            base.OnResize(e);\n            RecalculateParameters();\n        }\n\n        private void RecalculateParameters()\n        {\n            _radius = 0.4F * ClientSize.Height;\n            _barSize = new SizeF(ClientSize.Width - 2 * _radius, ClientSize.Height * 0.15F);\n            _barPos = new PointF(_radius, (ClientSize.Height - _barSize.Height) / 2);\n            _thumbPos = new PointF(\n                _barSize.Width / (Max - Min) * (Value - Min) + _barPos.X,\n                _barPos.Y + 0.5f * _barSize.Height);\n            Invalidate();\n        }\n\n        bool _moving = false;\n        SizeF _delta;\n\n        protected override void OnMouseDown(MouseEventArgs e)\n        {\n            base.OnMouseDown(e);\n\n            Focus();\n\n            // Difference between tumb and mouse position.\n            _delta = new SizeF(e.Location.X - _thumbPos.X, e.Location.Y - _thumbPos.Y);\n            if (_delta.Width * _delta.Width + _delta.Height * _delta.Height <= _radius * _radius)\n            {\n                // Clicking inside thumb.\n                _moving = true;\n            }\n\n            _calculateValue(e);\n\n        }\n\n        private void _calculateValue(MouseEventArgs e)\n        {\n            float thumbX = e.Location.X; // - _delta.Width;\n            if (thumbX < _barPos.X)\n            {\n                thumbX = _barPos.X;\n            }\n            else if (thumbX > _barPos.X + _barSize.Width)\n            {\n                thumbX = _barPos.X + _barSize.Width;\n            }\n            Value = (int)Math.Round(Min + (thumbX - _barPos.X) * (Max - Min) / _barSize.Width);\n\n        }\n\n        protected override void OnMouseMove(MouseEventArgs e)\n        {\n            base.OnMouseMove(e);\n            if (_moving)\n            {\n                _calculateValue(e);\n            }\n        }\n\n        protected override void OnMouseUp(MouseEventArgs e)\n        {\n            base.OnMouseUp(e);\n            _moving = false;\n        }\n\n    }\n\n}"
  },
  {
    "path": "app/USB/AsusHid.cs",
    "content": "﻿using HidSharp;\nusing HidSharp.Reports;\n\nnamespace GHelper.USB;\npublic static class AsusHid\n{\n    public const int ASUS_ID = 0x0b05;\n\n    public const byte INPUT_ID = 0x5a;\n    public const byte AURA_ID = 0x5d;\n\n    static int[] deviceIds = { 0x1a30, 0x1854, 0x1869, 0x1866, 0x19b6, 0x1822, 0x1837, 0x1854, 0x184a, 0x183d, 0x8502, 0x1807, 0x17e0, 0x18c6, 0x1abe, 0x1b4c, 0x1b6e, 0x1b2c, 0x8854 };\n\n    static HidStream? auraStream;\n\n    public static IEnumerable<HidDevice>? FindDevices(byte reportId)\n    {\n        IEnumerable<HidDevice> deviceList;\n\n        try\n        {\n            var allDevices = DeviceList.Local.GetHidDevices(ASUS_ID);\n            var filteredDevices = new List<HidDevice>();\n\n            foreach (var device in allDevices)\n            {\n                try\n                {\n                    if (deviceIds.Contains(device.ProductID) &&\n                        device.CanOpen &&\n                        device.GetMaxFeatureReportLength() > 0)\n                    {\n                        filteredDevices.Add(device);\n                    }\n                }\n                catch (Exception ex)\n                {\n                    Logger.WriteLine($\"Error checking HID device {device.ProductID:X}: {ex.Message}\");\n                }\n            }\n\n            deviceList = filteredDevices;\n        }\n        catch (Exception ex)\n        {\n            Logger.WriteLine($\"Error enumerating HID devices: {ex.Message}\");\n            yield break;\n        }\n\n        foreach (var device in deviceList)\n        {\n            bool isValid = false;\n            try\n            {\n                isValid = device.GetReportDescriptor().TryGetReport(ReportType.Feature, reportId, out _);\n            }\n            catch (Exception ex)\n            {\n                //Logger.WriteLine($\"Error getting report descriptor for device {device.ProductID.ToString(\"X\")}: {ex.Message}\");\n            }\n            if (isValid) yield return device;\n        }\n    }\n\n    public static HidStream? FindHidStream(byte reportId)\n    {\n        try\n        {\n            var devices = FindDevices(reportId);\n            if (devices is null) return null;\n\n            if (AppConfig.IsZ13())\n            {\n                var z13 = devices.Where(device => device.ProductID == 0x1a30).FirstOrDefault();\n                if (z13 is not null) return z13.Open();\n            }\n\n            if (AppConfig.IsS17())\n            {\n                var s17 = devices.Where(device => device.ProductID == 0x18c6).FirstOrDefault();\n                if (s17 is not null) return s17.Open();\n            }\n\n            foreach (var device in devices)\n                Logger.WriteLine($\"Input available: {device.DevicePath} {device.ProductID.ToString(\"X\")} {device.GetMaxFeatureReportLength()}\");\n\n            return devices.FirstOrDefault()?.Open();\n        }\n        catch (Exception ex)\n        {\n            Logger.WriteLine($\"Error accessing HID device: {ex.Message}\");\n        }\n\n        return null;\n    }\n\n    public static void WriteInput(byte[] data, string? log = \"USB\")\n    {\n        foreach (var device in FindDevices(INPUT_ID))\n        {\n            try\n            {\n                using (var stream = device.Open())\n                {\n                    var payload = new byte[device.GetMaxFeatureReportLength()];\n                    Array.Copy(data, payload, data.Length);\n                    stream.SetFeature(payload);\n                    if (log is not null) Logger.WriteLine($\"{log} {device.ProductID.ToString(\"X\")}|{device.GetMaxFeatureReportLength()}: {BitConverter.ToString(data)}\");\n                }\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine($\"Error setting feature {device.GetMaxFeatureReportLength()} {device.DevicePath}: {BitConverter.ToString(data)} {ex.Message}\");\n\n            }\n        }\n    }\n\n    public static void Write(byte[] data, string log = \"USB\")\n    {\n        Write(new List<byte[]> { data }, log);\n    }\n\n    public static void Write(List<byte[]> dataList, string log = \"USB\")\n    {\n        var devices = FindDevices(AURA_ID);\n        if (devices is null) return;\n\n        foreach (var device in devices)\n            try\n            {\n                using (var stream = device.Open())\n                    foreach (var data in dataList)\n                        try\n                        {\n                            stream.Write(data);\n                            if (log is not null) Logger.WriteLine($\"{log} {device.ProductID.ToString(\"X\")}: {BitConverter.ToString(data)}\");\n                        }\n                        catch (Exception ex)\n                        {\n                            if (log is not null) Logger.WriteLine($\"Error writing {log} {device.ProductID.ToString(\"X\")}: {ex.Message} {BitConverter.ToString(data)} \");\n                        }\n            }\n            catch (Exception ex)\n            {\n                if (log is not null) Logger.WriteLine($\"Error opening {log} {device.ProductID.ToString(\"X\")}: {ex.Message}\");\n            }\n    }\n\n    public static void WriteAura(byte[] data, bool retry = true)\n    {\n\n        if (auraStream == null) auraStream = FindHidStream(AURA_ID);\n        if (auraStream == null)\n        {\n            Logger.WriteLine(\"Aura stream not found\");\n            return;\n        }\n\n        try\n        {\n            auraStream.Write(data);\n        }\n        catch (Exception ex)\n        {\n            Logger.WriteLine($\"Error writing data to HID device: {ex.Message} {BitConverter.ToString(data)}\");\n            auraStream.Dispose();\n            auraStream = null;\n            if (retry) WriteAura(data, false);\n        }\n    }\n\n}\n\n"
  },
  {
    "path": "app/USB/Aura.cs",
    "content": "﻿using GHelper.Gpu;\nusing GHelper.Helpers;\nusing GHelper.Input;\nusing System.Drawing.Drawing2D;\nusing System.Drawing.Imaging;\nusing System.Runtime.InteropServices;\nusing System.Text;\nusing static GHelper.Helpers.DynamicLightingHelper;\n\nnamespace GHelper.USB\n{\n    public class AuraPower\n    {\n        public bool BootLogo;\n        public bool BootKeyb;\n        public bool AwakeLogo;\n        public bool AwakeKeyb;\n        public bool SleepLogo;\n        public bool SleepKeyb;\n        public bool ShutdownLogo;\n        public bool ShutdownKeyb;\n\n        public bool BootBar;\n        public bool AwakeBar;\n        public bool SleepBar;\n        public bool ShutdownBar;\n\n        public bool BootLid;\n        public bool AwakeLid;\n        public bool SleepLid;\n        public bool ShutdownLid;\n\n        public bool BootRear;\n        public bool AwakeRear;\n        public bool SleepRear;\n        public bool ShutdownRear;\n    }\n\n    public enum AuraMode : int\n    {\n        AuraStatic = 0,\n        AuraBreathe = 1,\n        AuraColorCycle = 2,\n        AuraRainbow = 3,\n        Star = 4,\n        Rain = 5,\n        Highlight = 6,\n        Laser = 7,\n        Ripple = 8,\n        AuraStrobe = 10,\n        Comet = 11,\n        Flash = 12,\n        HEATMAP = 20,\n        GPUMODE = 21,\n        AMBIENT = 22,\n        BATTERY = 23,\n    }\n\n    public enum AuraSpeed : int\n    {\n        Slow = 0,\n        Normal = 1,\n        Fast = 2,\n    }\n\n\n    public static class Aura\n    {\n\n        static byte[] MESSAGE_APPLY = { AsusHid.AURA_ID, 0xb4 };\n        static byte[] MESSAGE_SET = { AsusHid.AURA_ID, 0xb5, 0, 0, 0 };\n\n        static readonly int AURA_ZONES = 8;\n\n        private static AuraMode mode = AuraMode.AuraStatic;\n        private static AuraSpeed speed = AuraSpeed.Normal;\n\n        private static bool backlight = false;\n        private static bool initDirect = false;\n        public static bool sessionLock = false;\n\n        public static Color Color1 = Color.White;\n        public static Color Color2 = Color.Black;\n\n        static bool isACPI = AppConfig.IsTUF() || AppConfig.IsVivoZenPro();\n        static bool isStrix = AppConfig.IsAdvancedRGB() && !AppConfig.IsNoDirectRGB();\n\n        static bool isStrix4Zone = AppConfig.Is4ZoneRGB();\n        static bool isStrixNumpad = AppConfig.IsStrixNumpad();\n\n        static public bool isSingleColor = false;\n\n        static System.Timers.Timer timer = new System.Timers.Timer(1000);\n\n        private static Dictionary<AuraMode, string> _modesSingleColor = new Dictionary<AuraMode, string>\n        {\n            { AuraMode.AuraStatic, Properties.Strings.AuraStatic },\n            { AuraMode.AuraBreathe, Properties.Strings.AuraBreathe },\n            { AuraMode.AuraStrobe, Properties.Strings.AuraStrobe },\n        };\n\n        private static Dictionary<AuraMode, string> _modes = new Dictionary<AuraMode, string>\n        {\n            { AuraMode.AuraStatic, Properties.Strings.AuraStatic },\n            { AuraMode.AuraBreathe, Properties.Strings.AuraBreathe },\n            { AuraMode.AuraColorCycle, Properties.Strings.AuraColorCycle },\n            { AuraMode.AuraRainbow, Properties.Strings.AuraRainbow },\n            { AuraMode.AuraStrobe, Properties.Strings.AuraStrobe },\n            { AuraMode.HEATMAP, \"Heatmap\"},\n            { AuraMode.GPUMODE, \"GPU Mode\" },\n            { AuraMode.AMBIENT, \"Ambient\"},\n            { AuraMode.BATTERY, \"Battery\"},\n        };\n\n        private static Dictionary<AuraMode, string> _modesDynamicLighting = new Dictionary<AuraMode, string>\n        {\n            { AuraMode.AuraStatic, Properties.Strings.AuraStatic },\n            { AuraMode.AuraBreathe, Properties.Strings.AuraColorCycle },\n            { AuraMode.AuraRainbow, Properties.Strings.AuraRainbow },\n            { AuraMode.AuraStrobe, Properties.Strings.AuraStrobe },\n        };\n\n        private static Dictionary<AuraMode, string> _modesAlly = new Dictionary<AuraMode, string>\n        {\n            { AuraMode.AuraStatic, Properties.Strings.AuraStatic },\n            { AuraMode.AuraBreathe, Properties.Strings.AuraBreathe },\n            { AuraMode.AuraColorCycle, Properties.Strings.AuraColorCycle },\n            { AuraMode.AuraRainbow, Properties.Strings.AuraRainbow },\n            { AuraMode.AuraStrobe, Properties.Strings.AuraStrobe },\n            { AuraMode.BATTERY, \"Battery\"},\n        };\n\n        private static Dictionary<AuraMode, string> _modesStrix = new Dictionary<AuraMode, string>\n        {\n            { AuraMode.AuraStatic, Properties.Strings.AuraStatic },\n            { AuraMode.AuraBreathe, Properties.Strings.AuraBreathe },\n            { AuraMode.AuraColorCycle, Properties.Strings.AuraColorCycle },\n            { AuraMode.AuraRainbow, Properties.Strings.AuraRainbow },\n            { AuraMode.Star, \"Star\" },\n            { AuraMode.Rain, \"Rain\" },\n            { AuraMode.Highlight, \"Highlight\" },\n            { AuraMode.Laser, \"Laser\" },\n            { AuraMode.Ripple, \"Ripple\" },\n            { AuraMode.AuraStrobe, Properties.Strings.AuraStrobe},\n            { AuraMode.Comet, \"Comet\" },\n            { AuraMode.Flash, \"Flash\" },\n            { AuraMode.HEATMAP, \"Heatmap\"},\n            { AuraMode.AMBIENT, \"Ambient\"},\n            { AuraMode.BATTERY, \"Battery\"},\n        };\n\n        static Aura()\n        {\n            timer.Elapsed += Timer_Elapsed;\n            isSingleColor = AppConfig.IsSingleColor(); // Mono Color\n\n            if (AppConfig.ContainsModel(\"GA402X\") || AppConfig.ContainsModel(\"GA402N\"))\n            {\n                var device = AsusHid.FindDevices(AsusHid.AURA_ID).FirstOrDefault();\n                if (device is null) return;\n                Logger.WriteLine($\"USB Version: {device.ReleaseNumberBcd} {device.ReleaseNumber}\");\n\n                if (device.ReleaseNumberBcd >= 22 && device.ReleaseNumberBcd <= 25) isSingleColor = true;\n            }\n        }\n\n        public static Dictionary<AuraSpeed, string> GetSpeeds()\n        {\n            return new Dictionary<AuraSpeed, string>\n            {\n                { AuraSpeed.Slow, Properties.Strings.AuraSlow },\n                { AuraSpeed.Normal, Properties.Strings.AuraNormal },\n                { AuraSpeed.Fast, Properties.Strings.AuraFast }\n            };\n        }\n\n\n        public static Dictionary<AuraMode, string> GetModes()\n        {\n            if (isACPI)\n            {\n                _modes.Remove(AuraMode.AuraRainbow);\n            }\n\n            if (isSingleColor)\n            {\n                return _modesSingleColor;\n            }\n\n            if (AppConfig.IsDynamicLightingOnly())\n            {\n                return _modesDynamicLighting;\n            }\n\n            if (AppConfig.IsAlly())\n            {\n                return _modesAlly;\n            }\n\n            if (AppConfig.IsAdvantageEdition())\n            {\n                return _modes;\n            }\n\n            if (AppConfig.IsAdvancedRGB() && !AppConfig.Is4ZoneRGB())\n            {\n                return _modesStrix;\n            }\n\n            return _modes;\n        }\n\n        public static AuraMode Mode\n        {\n            get { return mode; }\n            set\n            {\n                mode = GetModes().ContainsKey(value) ? value : AuraMode.AuraStatic;\n            }\n        }\n\n        public static AuraSpeed Speed\n        {\n            get { return speed; }\n            set\n            {\n                speed = GetSpeeds().ContainsKey(value) ? value : AuraSpeed.Normal;\n            }\n\n        }\n\n        public static void SetColor(int colorCode)\n        {\n            Color1 = Color.FromArgb(colorCode);\n        }\n\n        public static void SetColor2(int colorCode)\n        {\n            Color2 = Color.FromArgb(colorCode);\n        }\n\n        public static bool HasSecondColor()\n        {\n            return mode == AuraMode.AuraBreathe && !isACPI;\n        }\n\n        private static void Timer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)\n        {\n            if (!InputDispatcher.backlightActivity)\n                return;\n\n            if (Mode == AuraMode.HEATMAP)\n            {\n                CustomRGB.ApplyHeatmap();\n            }\n            else if (Mode == AuraMode.BATTERY)\n            {\n                CustomRGB.ApplyBattery();\n            }\n            else if (Mode == AuraMode.AMBIENT)\n            {\n                CustomRGB.ApplyAmbient();\n            }\n        }\n\n\n        public static byte[] AuraMessage(AuraMode mode, Color color, Color color2, int speed, bool mono = false)\n        {\n\n            byte[] msg = new byte[17];\n            msg[0] = AsusHid.AURA_ID;\n            msg[1] = 0xB3;\n            msg[2] = 0x00; // Zone \n            msg[3] = (byte)mode; // Aura Mode\n            msg[4] = color.R; // R\n            msg[5] = mono ? (byte)0 : color.G; // G\n            msg[6] = mono ? (byte)0 : color.B; // B\n            msg[7] = (byte)speed; // aura.speed as u8;\n            msg[8] = 0x00; // aura.direction as u8;\n            msg[9] = (color.R == 0 && color.G == 0 && color.B == 0) ? (byte)0xFF : (mode == AuraMode.AuraBreathe ? (byte)0x01 : (byte)0x00); // random color flag\n            msg[10] = color2.R; // R\n            msg[11] = mono ? (byte)0 : color2.G; // G\n            msg[12] = mono ? (byte)0 : color2.B; // B\n            return msg;\n        }\n\n        public static void Init()\n        {\n            AsusHid.Write(new List<byte[]> {\n                new byte[] { AsusHid.AURA_ID, 0xB9 },\n                Encoding.ASCII.GetBytes(\"]ASUS Tech.Inc.\"),\n                new byte[] { AsusHid.AURA_ID, 0x05, 0x20, 0x31, 0, 0x1A },\n            }, \"Init\");\n\n            if (AppConfig.IsZ13())\n                AsusHid.Write([AsusHid.AURA_ID, 0xC0, 0x03, 0x01], \"Dynamic Lighting Init\");\n\n            if (AppConfig.IsProArt())\n            {\n                AsusHid.WriteInput([AsusHid.INPUT_ID, 0x05, 0x20, 0x31, 0x00, 0x08], \"ProArt Init\");\n                //AsusHid.WriteInput([AsusHid.INPUT_ID, 0xD0, 0x4E], \"ProArt Init\");\n                AsusHid.WriteInput([AsusHid.INPUT_ID, 0xBA, 0xC5, 0xC4], \"ProArt Init\");\n                AsusHid.WriteInput([AsusHid.INPUT_ID, 0xD0, 0x8F, 0x01], \"ProArt Init\");\n                AsusHid.WriteInput([AsusHid.INPUT_ID, 0xD0, 0x85, 0xFF], \"ProArt Init\");\n                //AsusHid.WriteInput([AsusHid.INPUT_ID, 0xD0, 0x4E], \"ProArt Init\");\n            }\n\n            InputDispatcher.InitFNLock();\n        }\n\n\n        public static void SleepBrightness()\n        {\n            if (!AppConfig.IsSleepBacklight() || !AppConfig.Is(\"keyboard_sleep\")) ApplyBrightness(0, \"Sleep\");\n        }\n\n        public static void ApplyBrightness(int brightness, string log = \"Backlight\", bool delay = false)\n        {\n            if (brightness == 0) backlight = false;\n\n            Task.Run(async () =>\n            {\n                if (delay) await Task.Delay(TimeSpan.FromSeconds(1));\n                DirectBrightness(brightness, log);\n                if (AppConfig.IsAlly()) ApplyAura();\n\n                if (brightness > 0)\n                {\n                    if (!backlight) initDirect = true;\n                    backlight = true;\n                }\n            });\n        }\n\n        public static void DirectBrightness(int brightness, string log)\n        {\n            if (isACPI) Program.acpi.TUFKeyboardBrightness(brightness, log);\n            if (AppConfig.IsInputBacklight())\n                AsusHid.WriteInput([AsusHid.INPUT_ID, 0xBA, 0xC5, 0xC4, (byte)brightness], log);\n            else\n                AsusHid.Write([AsusHid.AURA_ID, 0xBA, 0xC5, 0xC4, (byte)brightness], log);\n        }\n\n        static byte[] AuraPowerMessage(AuraPower flags)\n        {\n            byte keyb = 0, bar = 0, lid = 0, rear = 0;\n\n            if (flags.BootLogo) keyb |= 1 << 0;\n            if (flags.BootKeyb) keyb |= 1 << 1;\n            if (flags.AwakeLogo) keyb |= 1 << 2;\n            if (flags.AwakeKeyb) keyb |= 1 << 3;\n            if (flags.SleepLogo) keyb |= 1 << 4;\n            if (flags.SleepKeyb) keyb |= 1 << 5;\n            if (flags.ShutdownLogo) keyb |= 1 << 6;\n            if (flags.ShutdownKeyb) keyb |= 1 << 7;\n\n            if (flags.AwakeBar) bar |= 1 << 0;\n            if (flags.BootBar) bar |= 1 << 1;\n            if (flags.AwakeBar) bar |= 1 << 2;\n            if (flags.SleepBar) bar |= 1 << 3;\n            if (flags.ShutdownBar) bar |= 1 << 4;\n\n            if (flags.BootLid) lid |= 1 << 0;\n            if (flags.AwakeLid) lid |= 1 << 1;\n            if (flags.SleepLid) lid |= 1 << 2;\n            if (flags.ShutdownLid) lid |= 1 << 3;\n\n            if (flags.BootLid) lid |= 1 << 4;\n            if (flags.AwakeLid) lid |= 1 << 5;\n            if (flags.SleepLid) lid |= 1 << 6;\n            if (flags.ShutdownLid) lid |= 1 << 7;\n\n            if (flags.BootRear) rear |= 1 << 0;\n            if (flags.AwakeRear) rear |= 1 << 1;\n            if (flags.SleepRear) rear |= 1 << 2;\n            if (flags.ShutdownRear) rear |= 1 << 3;\n\n            if (flags.BootRear) rear |= 1 << 4;\n            if (flags.AwakeRear) rear |= 1 << 5;\n            if (flags.SleepRear) rear |= 1 << 6;\n            if (flags.ShutdownRear) rear |= 1 << 7;\n\n            return new byte[] { AsusHid.AURA_ID, 0xBD, 0x01, keyb, bar, lid, rear, 0xFF };\n        }\n\n        private static void ApplyAllyPower(AuraPower flags)\n        {\n            byte power = 0x00;\n            if (flags.BootKeyb) power |= 0x01;\n            if (flags.AwakeKeyb) power |= 0x02;\n            if (flags.SleepKeyb) power |= 0x04;\n            if (flags.ShutdownKeyb) power |= 0x08;\n            AsusHid.WriteInput(new byte[] { AsusHid.INPUT_ID, 0xD1, 0x09, 0x01, power }, \"Aura\");\n        }\n\n        public static void ApplyPowerOff()\n        {\n            AsusHid.Write(AuraPowerMessage(new AuraPower()));\n        }\n\n        public static void ApplyPower()\n        {\n\n            bool backlightBattery = AppConfig.IsBacklightZones() && (SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Online);\n\n            AuraPower flags = new();\n\n            // Keyboard\n            flags.AwakeKeyb = backlightBattery ? AppConfig.IsOnBattery(\"keyboard_awake\") : AppConfig.IsNotFalse(\"keyboard_awake\");\n            flags.BootKeyb = AppConfig.IsNotFalse(\"keyboard_boot\");\n            flags.SleepKeyb = AppConfig.IsNotFalse(\"keyboard_sleep\");\n            flags.ShutdownKeyb = AppConfig.IsNotFalse(\"keyboard_shutdown\");\n\n            // Logo\n            flags.AwakeLogo = backlightBattery ? AppConfig.IsOnBattery(\"keyboard_awake_logo\") : AppConfig.IsNotFalse(\"keyboard_awake_logo\");\n            flags.BootLogo = AppConfig.IsNotFalse(\"keyboard_boot_logo\");\n            flags.SleepLogo = AppConfig.IsNotFalse(\"keyboard_sleep_logo\");\n            flags.ShutdownLogo = AppConfig.IsNotFalse(\"keyboard_shutdown_logo\");\n\n            // Lightbar\n            flags.AwakeBar = backlightBattery ? AppConfig.IsOnBattery(\"keyboard_awake_bar\") : AppConfig.IsNotFalse(\"keyboard_awake_bar\");\n            flags.BootBar = AppConfig.IsNotFalse(\"keyboard_boot_bar\");\n            flags.SleepBar = AppConfig.IsNotFalse(\"keyboard_sleep_bar\");\n            flags.ShutdownBar = AppConfig.IsNotFalse(\"keyboard_shutdown_bar\");\n\n            // Lid\n            flags.AwakeLid = backlightBattery ? AppConfig.IsOnBattery(\"keyboard_awake_lid\") : AppConfig.IsNotFalse(\"keyboard_awake_lid\");\n            flags.BootLid = AppConfig.IsNotFalse(\"keyboard_boot_lid\");\n            flags.SleepLid = AppConfig.IsNotFalse(\"keyboard_sleep_lid\");\n            flags.ShutdownLid = AppConfig.IsNotFalse(\"keyboard_shutdown_lid\");\n\n            // Rear Bar\n            flags.AwakeRear = backlightBattery ? AppConfig.IsOnBattery(\"keyboard_awake_lid\") : AppConfig.IsNotFalse(\"keyboard_awake_lid\");\n            flags.BootRear = AppConfig.IsNotFalse(\"keyboard_boot_lid\");\n            flags.SleepRear = AppConfig.IsNotFalse(\"keyboard_sleep_lid\");\n            flags.ShutdownRear = AppConfig.IsNotFalse(\"keyboard_shutdown_lid\");\n\n            // On Z13 back panel light is controlled by mix of different flags, so merging them together\n            if (AppConfig.IsZ13())\n            {\n                flags.AwakeBar = flags.AwakeLid = flags.AwakeLogo;\n                flags.BootBar = flags.BootLid = flags.BootLogo;\n                flags.SleepBar = flags.SleepLid = flags.SleepLogo;\n                flags.ShutdownBar = flags.ShutdownLid = flags.ShutdownLogo;\n            }\n\n            if (AppConfig.IsAlly())\n            {\n                ApplyAllyPower(flags);\n                return;\n            }\n\n            AsusHid.Write(AuraPowerMessage(flags));\n\n            if (isACPI)\n                Program.acpi.TUFKeyboardPower(\n                    flags.AwakeKeyb,\n                    flags.BootKeyb,\n                    flags.SleepKeyb,\n                    flags.ShutdownKeyb);\n\n        }\n\n        static byte[] packetMap = new byte[]\n        {\n                    /* VDN   VUP   MICM  HPFN  ARMC  */\n                         2,    3,    4,    5,    6,\n        /* ESC          F1    F2    F3    F4    F5    F6    F7    F8    F9   F10   F11   F12              DEL15 DEL17  PAUS  PRT   HOME  */\n            21,         23,   24,   25,   26,   28,   29,   30,   31,   33,   34,   35,   36,               37,   38,   39,   40,   41,\n        /* BKTK    1     2     3     4     5     6     7     8     9     0     -     =   BSPC  BSPC  BSPC PLY15  NMLK  NMDV  NMTM  NMMI  */\n            42,   43,   44,   45,   46,   47,   48,   49,   50,   51,   52,   53,   54,   55,   56,   57,   58,   59,   60,   61,   62,\n        /* TAB     Q     W     E     R     T     Y     U     I     O     P     [     ]     \\              STP15  NM7   NM8   NM9   NMPL  */\n            63,   64,   65,   66,   67,   68,   69,   70,   71,   72,   73,   74,   75,   76,               79,   80,   81,   82,   83,\n        /* CPLK    A     S     D     F     G     H     J     K     L     ;     \"     #   ENTR  ENTR  ENTR PRV15  NM4   NM5   NM6   NMPL  */\n            84,   85,   86,   87,   88,   89,   90,   91,   92,   93,   94,   95,   96,   97,   98,   99,  100,  101,  102,  103,  104,\n        /* LSFT  ISO\\    Z     X     C     V     B     N     M     ,     .     /   RSFT  RSFT  RSFT  ARWU NXT15  NM1   NM2   NM3   NMER  */\n           105,  106,  107,  108,  109,  110,  111,  112,  113,  114,  115,  116,  117,  118,  119,  139,  121,  122,  123,  124,  125,\n        /* LCTL  LFNC  LWIN  LALT              SPC               RALT  RFNC  RCTL        ARWL  ARWD  ARWR PRT15        NM0   NMPD  NMER  */\n           126,  127,  128,  129,              131,              135,  136,  137,        159,  160,  161,  142,        144,  145,  146,\n        /* LB1   LB2   LB3                                                               ARW?  ARWL? ARWD? ARWR?       LB4   LB5   LB6   */\n           174,  173,  172,                                                              120,  140,  141,  143,        171,  170,  169,\n        /* KSTN  LOGO  LIDL  LIDR  */\n             0,  167,  176,  177,\n\n        };\n\n\n        static byte[] packetZone = new byte[]\n        {\n                    /* VDN   VUP   MICM  HPFN  ARMC  */\n                         0,    0,    1,    1,    1,\n        /* ESC          F1    F2    F3    F4    F5    F6    F7    F8    F9   F10   F11   F12              DEL15 DEL17  PAUS  PRT   HOM   */\n             0,          0,    0,    1,    1,    1,    1,    2,    2,    2,    2,    3,    3,                3,   3,    3,    3,    3,\n        /* BKTK    1     2     3     4     5     6     7     8     9     0     -     =   BSPC  BSPC  BSPC PLY15  NMLK  NMDV  NMTM  NMMI  */\n             0,    0,    0,    0,    1,    1,    1,    1,    2,    2,    2,    2,    3,    3,    3,    3,    3,    3,    3,    3,    3,\n        /* TAB     Q     W     E     R     T     Y     U     I     O     P     [     ]     \\              STP15  NM7   NM8   NM9   NMPL  */\n             0,    0,    0,    0,    1,    1,    1,    1,    2,    2,    2,    2,    3,    3,                3,    3,    3,    3,    3,\n        /* CPLK    A     S     D     F     G     H     J     K     L     ;     \"     #   ENTR  ENTR  ENTR PRV15  NM4   NM5   NM6   NMPL  */\n             0,    0,    0,    0,    1,    1,    1,    1,    2,    2,    2,    2,    3,    3,    3,    3,    3,    3,    3,    3,    3,\n        /* LSFT  ISO\\    Z     X     C     V     B     N     M     ,     .     /   RSFT  RSFT  RSFT  ARWU NXT15  NM1   NM2   NM3   NMER  */\n             0,    0,    0,    0,    1,    1,    1,    1,    2,    2,    2,    2,    3,    3,    3,    3,    3,    3,    3,    3,    3,\n        /* LCTL  LFNC  LWIN  LALT              SPC               RALT  RFNC  RCTL        ARWL  ARWD  ARWR PRT15        NM0   NMPD  NMER  */\n             0,    0,    0,    0,              1,                  2,    2,    2,          3,    3,    3,    3,          3,    3,    3,\n        /* LB1   LB1   LB3                                                               ARW?  ARW?  ARW?  ARW?        LB4   LB5   LB6   */\n             5,    5,    4,                                                                3,    3,    3,    3,          6,    7,    7,\n        /* KSTN  LOGO  LIDL  LIDR  */\n             3,    0,    0,    3,\n\n        };\n\n\n        static byte[] packetZoneNumpad = new byte[]\n        {\n                    /* VDN   VUP   MICM  HPFN  ARMC  */\n                         0,    0,    0,    1,    1,\n        /* ESC          F1    F2    F3    F4    F5    F6    F7    F8    F9   F10   F11   F12              DEL15 DEL17  PAUS  PRT   HOM   */\n             0,          0,    0,    0,    1,    1,    1,    1,    1,    2,    2,    2,    2,                3,   3,    3,    3,    3,\n        /* BKTK    1     2     3     4     5     6     7     8     9     0     -     =   BSPC  BSPC  BSPC PLY15  NMLK  NMDV  NMTM  NMMI  */\n             0,    0,    0,    0,    0,    1,    1,    1,    1,    1,    2,    2,    2,    2,    2,    2,    3,    3,    3,    3,    3,\n        /* TAB     Q     W     E     R     T     Y     U     I     O     P     [     ]     \\              STP15  NM7   NM8   NM9   NMPL  */\n             0,    0,    0,    0,    0,    1,    1,    1,    1,    1,    2,    2,    2,    2,                3,    3,    3,    3,    3,\n        /* CPLK    A     S     D     F     G     H     J     K     L     ;     \"     #   ENTR  ENTR  ENTR PRV15  NM4   NM5   NM6   NMPL  */\n             0,    0,    0,    0,    0,    1,    1,    1,    1,    1,    2,    2,    2,    2,    2,    2,    3,    3,    3,    3,    3,\n        /* LSFT  ISO\\    Z     X     C     V     B     N     M     ,     .     /   RSFT  RSFT  RSFT  ARWU NXT15  NM1   NM2   NM3   NMER  */\n             0,    0,    0,    0,    0,    1,    1,    1,    1,    1,    2,    2,    2,    2,    2,     2,   3,    3,    3,    3,    3,\n        /* LCTL  LFNC  LWIN  LALT              SPC               RALT  RFNC  RCTL        ARWL  ARWD  ARWR PRT15        NM0   NMPD  NMER  */\n             0,    0,    0,    0,              1,                  1,    2,    2,          2,    2,    2,    3,          3,    3,    3,\n        /* LB1   LB1   LB3                                                               ARW?  ARW?  ARW?  ARW?        LB4   LB5   LB6   */\n             5,    5,    4,                                                                2,    2,    2,    3,          6,    7,    7,\n        /* KSTN  LOGO  LIDL  LIDR  */\n             3,    0,    0,    3,\n\n        };\n\n        static byte[] packet4Zone = new byte[]\n        {\n/*01        Z1  Z2  Z3  Z4  NA  NA  KeyZone */\n            0,  1,  2,  3,  0,  0, \n\n/*02        RR  R   RM  LM  L   LL  LighBar */\n            7,  7,  6,  5,  4,  4,\n\n        };\n\n\n        public static void ApplyDirect(Color[] color, bool init = false)\n        {\n            if (!backlight) return;\n\n            const byte keySet = 167;\n            const byte ledCount = 178;\n            const ushort mapSize = 3 * ledCount;\n            const byte ledsPerPacket = 16;\n\n            byte[] buffer = new byte[64];\n            byte[] keyBuf = new byte[mapSize];\n\n            buffer[0] = AsusHid.AURA_ID;\n            buffer[1] = 0xBC;\n            buffer[2] = 0;\n            buffer[3] = 1;\n            buffer[4] = 1;\n            buffer[5] = 1;\n            buffer[6] = 0;\n            buffer[7] = 0x10;\n\n            if (init || initDirect)\n            {\n                initDirect = false;\n                AsusHid.WriteAura(new byte[] { AsusHid.AURA_ID, 0xBC });\n            }\n\n            Array.Clear(keyBuf, 0, keyBuf.Length);\n\n            if (!isStrix4Zone) // per key\n            {\n                for (int ledIndex = 0; ledIndex < packetMap.Count(); ledIndex++)\n                {\n                    ushort offset = (ushort)(3 * packetMap[ledIndex]);\n                    byte zone = isStrixNumpad ? packetZoneNumpad[ledIndex] : packetZone[ledIndex];\n\n                    keyBuf[offset] = color[zone].R;\n                    keyBuf[offset + 1] = color[zone].G;\n                    keyBuf[offset + 2] = color[zone].B;\n                }\n\n                for (int i = 0; i < keySet; i += ledsPerPacket)\n                {\n                    byte ledsRemaining = (byte)(keySet - i);\n\n                    if (ledsRemaining < ledsPerPacket)\n                    {\n                        buffer[7] = ledsRemaining;\n                    }\n\n                    buffer[6] = (byte)i;\n                    Buffer.BlockCopy(keyBuf, 3 * i, buffer, 9, 3 * buffer[7]);\n                    AsusHid.WriteAura(buffer);\n                }\n            }\n\n            buffer[4] = 0x04;\n            buffer[5] = 0x00;\n            buffer[6] = 0x00;\n            buffer[7] = 0x00;\n\n            if (isStrix4Zone)\n            { // per zone\n                var leds_4_zone = packet4Zone.Count();\n                for (int ledIndex = 0; ledIndex < leds_4_zone; ledIndex++)\n                {\n                    byte zone = packet4Zone[ledIndex];\n                    keyBuf[ledIndex * 3] = color[zone].R;\n                    keyBuf[ledIndex * 3 + 1] = color[zone].G;\n                    keyBuf[ledIndex * 3 + 2] = color[zone].B;\n                }\n                Buffer.BlockCopy(keyBuf, 0, buffer, 9, 3 * leds_4_zone);\n                AsusHid.WriteAura(buffer);\n                return;\n            }\n\n            Buffer.BlockCopy(keyBuf, 3 * keySet, buffer, 9, 3 * (ledCount - keySet));\n            AsusHid.WriteAura(buffer);\n        }\n\n\n        public static void ApplyDirect(Color color, bool init = false)\n        {\n\n            if (!backlight) return;\n\n            if (isACPI)\n            {\n                Program.acpi.TUFKeyboardRGB(0, color, 0, null);\n                return;\n            }\n\n            if (AppConfig.IsNoDirectRGB())\n            {\n                AsusHid.Write(new List<byte[]> { AuraMessage(AuraMode.AuraStatic, color, color, 0xeb, isSingleColor), MESSAGE_SET }, null);\n                return;\n            }\n\n            if (isStrix)\n            {\n                ApplyDirect(Enumerable.Repeat(color, AURA_ZONES).ToArray(), init);\n                return;\n            }\n\n            if (init || initDirect)\n            {\n                initDirect = false;\n                Init();\n                AsusHid.WriteAura(new byte[] { AsusHid.AURA_ID, 0xbc, 1 });\n            }\n\n            byte[] buffer = new byte[12];\n            buffer[0] = AsusHid.AURA_ID;\n            buffer[1] = 0xbc;\n            buffer[2] = 1;\n            buffer[3] = 1;\n            buffer[9] = color.R;\n            buffer[10] = color.G;\n            buffer[11] = color.B;\n\n            AsusHid.WriteAura(buffer);\n\n        }\n\n        public static Color ColorDim(Color Color, double colorDim = 1)\n        {\n            switch (InputDispatcher.GetBacklight())\n            {\n                case 1: colorDim = 0.1; break;\n                case 2: colorDim = 0.3; break;\n            }\n            return Color.FromArgb((int)(Color.R * colorDim), (int)(Color.G * colorDim), (int)(Color.B * colorDim));\n        }\n\n        public static void ApplyAura()\n        {\n\n            Mode = (AuraMode)AppConfig.Get(\"aura_mode\");\n            Speed = (AuraSpeed)AppConfig.Get(\"aura_speed\");\n            SetColor(AppConfig.Get(\"aura_color\"));\n            SetColor2(AppConfig.Get(\"aura_color2\"));\n\n            Color _Color1 = Color1;\n            Color _Color2 = Color2;\n\n            // Ally lower brightness fix\n            if (AppConfig.IsAlly())\n            {\n                _Color1 = ColorDim(_Color1);\n                _Color2 = ColorDim(_Color2);\n            }\n\n            timer.Stop();\n\n            Logger.WriteLine($\"AuraMode: {Mode}\");\n\n            if (Mode == AuraMode.HEATMAP)\n            {\n                CustomRGB.ApplyHeatmap(true);\n                timer.Interval = 2000;\n                timer.Start();\n                return;\n            }\n\n            if (Mode == AuraMode.BATTERY)\n            {\n                CustomRGB.ApplyBattery();\n                timer.Interval = 30000;\n                timer.Start();\n                return;\n            }\n\n            if (Mode == AuraMode.AMBIENT)\n            {\n                CustomRGB.ApplyAmbient(true);\n                timer.Interval = AppConfig.Get(\"aura_refresh\", AppConfig.IsStrix() ? 100 : 300);\n                timer.Start();\n                return;\n            }\n\n            if (Mode == AuraMode.GPUMODE)\n            {\n                CustomRGB.ApplyGPUColor();\n                return;\n            }\n\n            if (AppConfig.IsDynamicLightingOnly())\n            {\n                switch (mode)\n                {\n                    case AuraMode.AuraBreathe:\n                        DynamicLightingHelper.SetEffect(\n                            DynamicLightingEffect.Wave,\n                            color: _Color1,\n                            color2: _Color2,\n                            speed: (int)Speed * 5\n                            );\n                        break;\n                    case AuraMode.AuraColorCycle:\n                    case AuraMode.AuraRainbow:\n                        DynamicLightingHelper.SetEffect(\n                            DynamicLightingEffect.Rainbow,\n                            speed: (int)Speed * 5\n                            );\n                        break;\n                    case AuraMode.AuraStrobe:\n                        DynamicLightingHelper.SetEffect(\n                            DynamicLightingEffect.Breathing,\n                            color: _Color1,\n                            speed: 10\n                            );\n                        break;\n                    default:\n                        DynamicLightingHelper.SetEffect(\n                            DynamicLightingEffect.Solid,\n                            color: _Color1\n                            );\n                        break;\n                }\n                return;\n            }\n\n            int _speed = (Speed == AuraSpeed.Normal) ? 0xeb : (Speed == AuraSpeed.Fast) ? 0xf5 : 0xe1;\n            AsusHid.Write(new List<byte[]> { AuraMessage(Mode, _Color1, _Color2, _speed, isSingleColor), MESSAGE_SET, MESSAGE_APPLY });\n            XGM.LightMode(Mode, _Color1, _Color2, _speed);\n\n            if (isACPI)\n                Program.acpi.TUFKeyboardRGB(Mode, Color1, _speed);\n\n        }\n\n\n        public static class CustomRGB\n        {\n\n            static int tempFreeze = AppConfig.Get(\"temp_freeze\", 20);\n            static int tempCold = AppConfig.Get(\"temp_cold\", 40);\n            static int tempWarm = AppConfig.Get(\"temp_warm\", 65);\n            static int tempHot = AppConfig.Get(\"temp_hot\", 90);\n\n            static Color colorFreeze = ColorTranslator.FromHtml(AppConfig.GetString(\"color_freeze\", \"#0000FF\"));\n            static Color colorCold = ColorTranslator.FromHtml(AppConfig.GetString(\"color_cold\", \"#008000\"));\n            static Color colorWarm = ColorTranslator.FromHtml(AppConfig.GetString(\"color_warm\", \"#FFFF00\"));\n            static Color colorHot = ColorTranslator.FromHtml(AppConfig.GetString(\"color_hot\", \"#FF0000\"));\n\n            static float battLow = 20f;\n            static float battMid = 60f;\n            static float battHigh = 100f;\n\n            static Color colorLow = Color.Red;\n            static Color colorMid = Color.Yellow;\n            static Color colorHigh = Color.Lime;\n\n            static Color colorUltimate = ColorTranslator.FromHtml(AppConfig.GetString(\"color_ultimate\", \"#FF0000\"));\n            static Color colorStandard = ColorTranslator.FromHtml(AppConfig.GetString(\"color_standard\", \"#FFFF00\"));\n            static Color colorEco = ColorTranslator.FromHtml(AppConfig.GetString(\"color_eco\", \"#008000\"));\n\n            public static void ApplyGPUColor(int gpuMode = -1)\n            {\n                if ((AuraMode)AppConfig.Get(\"aura_mode\") != AuraMode.GPUMODE) return;\n\n                Color color;\n\n                if (gpuMode < 0) gpuMode = GPUModeControl.gpuMode;\n                switch (gpuMode)\n                {\n                    case AsusACPI.GPUModeUltimate:\n                        color = colorUltimate;\n                        break;\n                    case AsusACPI.GPUModeEco:\n                        color = colorEco;\n                        break;\n                    default:\n                        color = colorStandard;\n                        break;\n                }\n\n                if (isACPI) Program.acpi.TUFKeyboardRGB(AuraMode.AuraStatic, color, 0xeb, $\"TUF RGB GPU {gpuMode}\");\n                AsusHid.Write(new List<byte[]> { AuraMessage(AuraMode.AuraStatic, color, color, 0xeb, isSingleColor), MESSAGE_APPLY, MESSAGE_SET });\n\n            }\n\n            public static void ApplyHeatmap(bool init = false)\n            {\n                float cpuTemp = (float)HardwareControl.GetCPUTemp();\n                Color color = colorFreeze;\n\n                if (cpuTemp < tempCold) color = ColorUtils.GetWeightedAverage(colorFreeze, colorCold, ((float)cpuTemp - tempFreeze) / (tempCold - tempFreeze));\n                else if (cpuTemp < tempWarm) color = ColorUtils.GetWeightedAverage(colorCold, colorWarm, ((float)cpuTemp - tempCold) / (tempWarm - tempCold));\n                else if (cpuTemp < tempHot) color = ColorUtils.GetWeightedAverage(colorWarm, colorHot, ((float)cpuTemp - tempWarm) / (tempHot - tempWarm));\n                else color = colorHot;\n\n                ApplyDirect(color, init);\n            }\n\n            public static void ApplyBattery()\n            {\n                float battery = (float)HardwareControl.GetBatteryChargePercentage();\n                Color color = colorLow;\n\n                if (battery < battLow)\n                {\n                    color = colorLow;\n                }\n                else if (battery < battMid)\n                {\n                    // Low → Mid\n                    float t = (battery - battLow) / (battMid - battLow);\n                    color = ColorUtils.GetWeightedAverage(colorLow, colorMid, t);\n                }\n                else if (battery < battHigh)\n                {\n                    // Mid → High\n                    float t = (battery - battMid) / (battHigh - battMid);\n                    color = ColorUtils.GetWeightedAverage(colorMid, colorHigh, t);\n                }\n                else\n                {\n                    color = colorHigh;\n                }\n\n                if (AppConfig.IsAlly()) color = ColorDim(color);\n                AsusHid.Write(new List<byte[]> { AuraMessage(AuraMode.AuraStatic, color, color, 0xeb, isSingleColor), MESSAGE_APPLY, MESSAGE_SET });\n                if (isACPI) Program.acpi.TUFKeyboardRGB(AuraMode.AuraStatic, color, 0xeb);\n            }\n\n            public static void ApplyAmbient(bool init = false)\n            {\n                if (!backlight || sessionLock) return;\n\n                var bound = Screen.GetBounds(Point.Empty);\n                bound.Y += bound.Height / 3;\n                bound.Height -= (int)Math.Round(bound.Height * (0.33f + 0.022f)); // cut 1/3 of the top screen + windows panel\n\n                Bitmap screen_low = AmbientData.CamptureScreen(bound, 512, 288);   //quality decreases greatly if it is less 512 ;\n                Bitmap screeb_pxl = AmbientData.ResizeImage(screen_low, 4, 2);     // 4x2 zone. top for keyboard and bot for lightbar;\n\n                int zones = AURA_ZONES;\n\n                if (isStrix) // laptop with lightbar\n                {\n                    var mid_left = ColorUtils.GetMidColor(screeb_pxl.GetPixel(0, 1), screeb_pxl.GetPixel(1, 1));\n                    var mid_right = ColorUtils.GetMidColor(screeb_pxl.GetPixel(2, 1), screeb_pxl.GetPixel(3, 1));\n\n                    AmbientData.Colors[4].RGB = ColorUtils.HSV.UpSaturation(screeb_pxl.GetPixel(1, 1)); // left bck\n                    AmbientData.Colors[5].RGB = ColorUtils.HSV.UpSaturation(mid_left);  // center left\n                    AmbientData.Colors[6].RGB = ColorUtils.HSV.UpSaturation(mid_right); // center right\n                    AmbientData.Colors[7].RGB = ColorUtils.HSV.UpSaturation(screeb_pxl.GetPixel(3, 1)); // right bck\n\n                    for (int i = 0; i < 4; i++) // keyboard\n                        AmbientData.Colors[i].RGB = ColorUtils.HSV.UpSaturation(screeb_pxl.GetPixel(i, 0));\n                }\n                else\n                {\n                    zones = 1;\n                    AmbientData.Colors[0].RGB = ColorUtils.HSV.UpSaturation(ColorUtils.GetDominantColor(screeb_pxl), (float)0.3);\n                }\n\n                //screen_low.Save(\"big.jpg\", ImageFormat.Jpeg);\n                //screeb_pxl.Save(\"small.jpg\", ImageFormat.Jpeg);\n\n                screen_low.Dispose();\n                screeb_pxl.Dispose();\n\n                bool is_fresh = init;\n\n                for (int i = 0; i < zones; i++)\n                {\n                    if (AmbientData.result[i].ToArgb() != AmbientData.Colors[i].RGB.ToArgb()) is_fresh = true;\n                    AmbientData.result[i] = AmbientData.Colors[i].RGB;\n                }\n\n                if (is_fresh)\n                {\n                    if (isStrix) ApplyDirect(AmbientData.result, init);\n                    else ApplyDirect(AmbientData.result[0], init);\n                }\n\n            }\n\n            static class AmbientData\n            {\n\n                public enum StretchMode\n                {\n                    STRETCH_ANDSCANS = 1,\n                    STRETCH_ORSCANS = 2,\n                    STRETCH_DELETESCANS = 3,\n                    STRETCH_HALFTONE = 4,\n                }\n\n                [DllImport(\"user32.dll\")]\n                private static extern IntPtr GetDesktopWindow();\n\n                [DllImport(\"user32.dll\")]\n                private static extern IntPtr GetWindowDC(IntPtr hWnd);\n\n                [DllImport(\"gdi32.dll\")]\n                private static extern IntPtr CreateCompatibleDC(IntPtr hDC);\n\n                [DllImport(\"gdi32.dll\")]\n                private static extern IntPtr CreateCompatibleBitmap(IntPtr hDC, int nWidth, int nHeight);\n\n                [DllImport(\"gdi32.dll\")]\n                private static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);\n\n                [DllImport(\"user32.dll\")]\n                private static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDC);\n\n                [DllImport(\"gdi32.dll\")]\n                private static extern bool DeleteDC(IntPtr hdc);\n\n                [DllImport(\"gdi32.dll\")]\n                private static extern bool DeleteObject(IntPtr hObject);\n\n                [DllImport(\"gdi32.dll\")]\n                private static extern bool StretchBlt(IntPtr hdcDest, int nXOriginDest, int nYOriginDest,\n                int nWidthDest, int nHeightDest,\n                IntPtr hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, Int32 dwRop);\n\n                [DllImport(\"gdi32.dll\")]\n                static extern bool SetStretchBltMode(IntPtr hdc, StretchMode iStretchMode);\n\n                /// <summary>\n                /// Captures a screenshot. \n                /// </summary>\n                public static Bitmap CamptureScreen(Rectangle rec, int out_w, int out_h)\n                {\n                    IntPtr desktop = GetDesktopWindow();\n                    IntPtr hdc = GetWindowDC(desktop);\n                    IntPtr hdcMem = CreateCompatibleDC(hdc);\n\n                    IntPtr hBitmap = CreateCompatibleBitmap(hdc, out_w, out_h);\n                    IntPtr hOld = SelectObject(hdcMem, hBitmap);\n                    SetStretchBltMode(hdcMem, StretchMode.STRETCH_DELETESCANS);\n                    StretchBlt(hdcMem, 0, 0, out_w, out_h, hdc, rec.X, rec.Y, rec.Width, rec.Height, 0x00CC0020);\n                    SelectObject(hdcMem, hOld);\n\n                    DeleteDC(hdcMem);\n                    ReleaseDC(desktop, hdc);\n                    var result = Image.FromHbitmap(hBitmap, IntPtr.Zero);\n                    DeleteObject(hBitmap);\n                    return result;\n                }\n\n                public static Bitmap ResizeImage(Image image, int width, int height)\n                {\n                    var destRect = new Rectangle(0, 0, width, height);\n                    var destImage = new Bitmap(width, height);\n\n                    destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);\n\n                    using (var graphics = Graphics.FromImage(destImage))\n                    {\n                        graphics.CompositingMode = CompositingMode.SourceCopy;\n                        graphics.CompositingQuality = CompositingQuality.HighQuality;\n                        graphics.InterpolationMode = InterpolationMode.Bicubic;\n                        graphics.SmoothingMode = SmoothingMode.None;\n                        graphics.PixelOffsetMode = PixelOffsetMode.None;\n\n                        using (var wrapMode = new ImageAttributes())\n                        {\n                            wrapMode.SetWrapMode(WrapMode.TileFlipXY);\n                            graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);\n                        }\n                    }\n\n                    return destImage;\n                }\n\n                static public Color[] result = new Color[AURA_ZONES];\n                static public ColorUtils.SmoothColor[] Colors = Enumerable.Repeat(0, AURA_ZONES).\n                    Select(h => new ColorUtils.SmoothColor()).ToArray();\n\n                public static Color GetMostUsedColor(Bitmap bitMap)\n                {\n                    var colorIncidence = new Dictionary<int, int>();\n                    for (var x = 0; x < bitMap.Size.Width; x++)\n                        for (var y = 0; y < bitMap.Size.Height; y++)\n                        {\n                            var pixelColor = bitMap.GetPixel(x, y).ToArgb();\n                            if (colorIncidence.Keys.Contains(pixelColor))\n                                colorIncidence[pixelColor]++;\n                            else\n                                colorIncidence.Add(pixelColor, 1);\n                        }\n                    return Color.FromArgb(colorIncidence.OrderByDescending(x => x.Value).ToDictionary(x => x.Key, x => x.Value).First().Key);\n                }\n            }\n\n        }\n\n    }\n\n}"
  },
  {
    "path": "app/USB/XGM.cs",
    "content": "﻿// Reference : thanks to https://github.com/RomanYazvinsky/ for initial discovery of XGM payloads\n\nusing GHelper.Helpers;\nusing HidSharp;\nusing System.Text;\n\nnamespace GHelper.USB\n{\n    public static class XGM\n    {\n        const byte XGM_REPORT_ID = 0x5e;\n        const int ASUS_ID = 0x0b05;\n        static readonly int[] deviceIds = { 0x1970, 0x1a9a, 0x1C29 };\n\n        public static HidDevice? GetDevice()\n        {\n            try\n            {\n                /*\n                var devices = DeviceList.Local.GetHidDevices(ASUS_ID).Where(device =>\n                    deviceIds.Contains(device.ProductID) &&\n                    device.CanOpen &&\n                    device.GetMaxFeatureReportLength() >= 300);\n\n                foreach (var device in devices)\n                {\n                    var report = device.GetReportDescriptor().TryGetReport(ReportType.Feature, XGM_REPORT_ID, out _);\n                    Logger.WriteLine($\"Found XGM Device: PID={device.ProductID}, MaxFeatureReportLength={device.GetMaxFeatureReportLength()}, Report={report}\");\n                }\n                */\n                return DeviceList.Local.GetHidDevices(ASUS_ID).FirstOrDefault(device =>\n                    deviceIds.Contains(device.ProductID) &&\n                    device.CanOpen &&\n                    device.GetMaxFeatureReportLength() >= 300);\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine($\"Error getting XGM device: {ex}\");\n                return null;\n            }\n        }\n\n        public static bool IsConnected()\n        {\n            return GetDevice() is not null;\n        }\n\n        public static void Write(byte[] data)\n        {\n            try\n            {\n                HidDevice? device = GetDevice();\n                if (device is null)\n                {\n                    Logger.WriteLine(\"XGM SUB device not found\");\n                    return;\n                }\n\n                using (HidStream hidStream = device.Open())\n                {\n                    byte[] payload = new byte[300];\n                    data.CopyTo(payload, 0);\n                    hidStream.SetFeature(payload);\n                    Logger.WriteLine($\"XGM-{device.ProductID}|{device.GetMaxFeatureReportLength()}:{BitConverter.ToString(data)}\");\n                }\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine($\"Error accessing XGM device: {ex}\");\n            }\n\n        }\n\n        public static void Init()\n        {\n            Task.Run(() =>\n            {\n                if (IsConnected())\n                {\n                    Write(Encoding.ASCII.GetBytes(\"^ASUS Tech.Inc.\"));\n                    Light(AppConfig.Is(\"xmg_light\"));\n                }\n            });\n        }\n\n        public static void Light(bool status)\n        {\n            Write([XGM_REPORT_ID, 0xc5, status ? (byte)0x50 : (byte)0]);\n            Write([XGM_REPORT_ID, 0xbd, 0x00, status ? (byte)0x01 : (byte)0x00]);\n        }\n\n        public static void LightMode(AuraMode mode, Color color, Color color2, int speed)\n        {\n            Task.Run(() =>\n            {\n                if (IsConnected())\n                {\n                    var msg = Aura.AuraMessage(mode, color, color2, speed);\n                    msg[0] = XGM_REPORT_ID;\n                    Write(msg);\n                    Write([XGM_REPORT_ID, 0xb4]);\n                    Write([XGM_REPORT_ID, 0xb5]);\n                }\n            });\n        }\n\n        public static void InitLight()\n        {\n            Task.Run(() =>\n            {\n                if (IsConnected()) Light(AppConfig.Is(\"xmg_light\"));\n            });\n        }\n\n        public static void Reset()\n        {\n            Task.Run(() =>\n            {\n                if (IsConnected()) Write([XGM_REPORT_ID, 0xd1, 0x02]);\n            });\n        }\n\n        public static void SetFan(byte[] curve)\n        {\n            Task.Run(() =>\n            {\n                if (AsusACPI.IsInvalidCurve(curve)) return;\n                if (IsConnected()) Write([XGM_REPORT_ID, 0xd1, 0x01, .. curve]);\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "app/Updates.Designer.cs",
    "content": "﻿using GHelper.UI;\n\nnamespace GHelper\n{\n    partial class Updates\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            components = new System.ComponentModel.Container();\n            tableBios = new TableLayoutPanel();\n            labelBIOS = new Label();\n            pictureBios = new PictureBox();\n            panelBiosTitle = new Panel();\n            labelUpdates = new Label();\n            buttonRefresh = new RButton();\n            panelBios = new Panel();\n            panelDrivers = new Panel();\n            tableDrivers = new TableLayoutPanel();\n            panelDriversTitle = new Panel();\n            labelDrivers = new Label();\n            pictureDrivers = new PictureBox();\n            tableLayoutLegend = new TableLayoutPanel();\n            labelSerialTitle = new Label();\n            labelLegendGreen = new Label();\n            labelLegendGray = new Label();\n            labelLegendRed = new Label();\n            labelLegend = new Label();\n            toolTip = new ToolTip(components);\n            textSerial = new TextBox();\n            ((System.ComponentModel.ISupportInitialize)pictureBios).BeginInit();\n            panelBiosTitle.SuspendLayout();\n            panelBios.SuspendLayout();\n            panelDrivers.SuspendLayout();\n            panelDriversTitle.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureDrivers).BeginInit();\n            tableLayoutLegend.SuspendLayout();\n            SuspendLayout();\n            // \n            // tableBios\n            // \n            tableBios.AutoSize = true;\n            tableBios.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            tableBios.ColumnCount = 4;\n            tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 23F));\n            tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 40F));\n            tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 15F));\n            tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 22F));\n            tableBios.Dock = DockStyle.Top;\n            tableBios.Location = new Point(20, 20);\n            tableBios.Margin = new Padding(4);\n            tableBios.MinimumSize = new Size(1300, 0);\n            tableBios.Name = \"tableBios\";\n            tableBios.Size = new Size(1300, 0);\n            tableBios.TabIndex = 0;\n            // \n            // labelBIOS\n            // \n            labelBIOS.AutoSize = true;\n            labelBIOS.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelBIOS.Location = new Point(68, 23);\n            labelBIOS.Margin = new Padding(4, 0, 4, 0);\n            labelBIOS.Name = \"labelBIOS\";\n            labelBIOS.Size = new Size(68, 32);\n            labelBIOS.TabIndex = 1;\n            labelBIOS.Text = \"BIOS\";\n            // \n            // pictureBios\n            // \n            pictureBios.BackgroundImage = Properties.Resources.icons8_processor_32;\n            pictureBios.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureBios.Location = new Point(28, 23);\n            pictureBios.Margin = new Padding(4);\n            pictureBios.Name = \"pictureBios\";\n            pictureBios.Size = new Size(32, 32);\n            pictureBios.TabIndex = 2;\n            pictureBios.TabStop = false;\n            // \n            // panelBiosTitle\n            // \n            panelBiosTitle.Controls.Add(labelUpdates);\n            panelBiosTitle.Controls.Add(buttonRefresh);\n            panelBiosTitle.Controls.Add(labelBIOS);\n            panelBiosTitle.Controls.Add(pictureBios);\n            panelBiosTitle.Dock = DockStyle.Top;\n            panelBiosTitle.Location = new Point(0, 0);\n            panelBiosTitle.Margin = new Padding(4);\n            panelBiosTitle.Name = \"panelBiosTitle\";\n            panelBiosTitle.Size = new Size(1236, 60);\n            panelBiosTitle.TabIndex = 3;\n            // \n            // labelUpdates\n            // \n            labelUpdates.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            labelUpdates.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelUpdates.Location = new Point(864, 19);\n            labelUpdates.Name = \"labelUpdates\";\n            labelUpdates.Size = new Size(302, 32);\n            labelUpdates.TabIndex = 4;\n            labelUpdates.Text = \"Updates Available\";\n            // \n            // buttonRefresh\n            // \n            buttonRefresh.Activated = false;\n            buttonRefresh.Anchor = AnchorStyles.Top | AnchorStyles.Right;\n            buttonRefresh.BackColor = SystemColors.ControlLight;\n            buttonRefresh.BorderColor = Color.Transparent;\n            buttonRefresh.BorderRadius = 5;\n            buttonRefresh.FlatAppearance.BorderSize = 0;\n            buttonRefresh.FlatStyle = FlatStyle.Flat;\n            buttonRefresh.Image = Properties.Resources.icons8_refresh_32;\n            buttonRefresh.Location = new Point(1172, 11);\n            buttonRefresh.Name = \"buttonRefresh\";\n            buttonRefresh.Secondary = true;\n            buttonRefresh.Size = new Size(52, 46);\n            buttonRefresh.TabIndex = 1;\n            buttonRefresh.UseVisualStyleBackColor = false;\n            // \n            // panelBios\n            // \n            panelBios.AutoSize = true;\n            panelBios.Controls.Add(tableBios);\n            panelBios.Dock = DockStyle.Top;\n            panelBios.Location = new Point(0, 60);\n            panelBios.Margin = new Padding(4);\n            panelBios.Name = \"panelBios\";\n            panelBios.Padding = new Padding(20);\n            panelBios.Size = new Size(1236, 40);\n            panelBios.TabIndex = 4;\n            // \n            // panelDrivers\n            // \n            panelDrivers.AutoSize = true;\n            panelDrivers.Controls.Add(tableDrivers);\n            panelDrivers.Dock = DockStyle.Top;\n            panelDrivers.Location = new Point(0, 144);\n            panelDrivers.Margin = new Padding(4);\n            panelDrivers.Name = \"panelDrivers\";\n            panelDrivers.Padding = new Padding(20);\n            panelDrivers.Size = new Size(1236, 40);\n            panelDrivers.TabIndex = 6;\n            // \n            // tableDrivers\n            // \n            tableDrivers.AutoSize = true;\n            tableDrivers.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            tableDrivers.ColumnCount = 4;\n            tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 23F));\n            tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 40F));\n            tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 15F));\n            tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 22F));\n            tableDrivers.Dock = DockStyle.Top;\n            tableDrivers.Location = new Point(20, 20);\n            tableDrivers.Margin = new Padding(4);\n            tableDrivers.MinimumSize = new Size(1300, 0);\n            tableDrivers.Name = \"tableDrivers\";\n            tableDrivers.Size = new Size(1300, 0);\n            tableDrivers.TabIndex = 0;\n            // \n            // panelDriversTitle\n            // \n            panelDriversTitle.Controls.Add(labelDrivers);\n            panelDriversTitle.Controls.Add(pictureDrivers);\n            panelDriversTitle.Dock = DockStyle.Top;\n            panelDriversTitle.Location = new Point(0, 100);\n            panelDriversTitle.Margin = new Padding(4);\n            panelDriversTitle.Name = \"panelDriversTitle\";\n            panelDriversTitle.Size = new Size(1236, 44);\n            panelDriversTitle.TabIndex = 5;\n            // \n            // labelDrivers\n            // \n            labelDrivers.AutoSize = true;\n            labelDrivers.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelDrivers.Location = new Point(68, 6);\n            labelDrivers.Margin = new Padding(4, 0, 4, 0);\n            labelDrivers.Name = \"labelDrivers\";\n            labelDrivers.Size = new Size(254, 32);\n            labelDrivers.TabIndex = 1;\n            labelDrivers.Text = \"Drivers and Software\";\n            // \n            // pictureDrivers\n            // \n            pictureDrivers.BackgroundImage = Properties.Resources.icons8_software_32;\n            pictureDrivers.BackgroundImageLayout = ImageLayout.Zoom;\n            pictureDrivers.Location = new Point(28, 6);\n            pictureDrivers.Margin = new Padding(4);\n            pictureDrivers.Name = \"pictureDrivers\";\n            pictureDrivers.Size = new Size(32, 32);\n            pictureDrivers.TabIndex = 2;\n            pictureDrivers.TabStop = false;\n            // \n            // tableLayoutLegend\n            // \n            tableLayoutLegend.AutoSize = true;\n            tableLayoutLegend.AutoSizeMode = AutoSizeMode.GrowAndShrink;\n            tableLayoutLegend.ColumnCount = 4;\n            tableLayoutLegend.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 15.151515F));\n            tableLayoutLegend.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 28.2828274F));\n            tableLayoutLegend.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 28.2828274F));\n            tableLayoutLegend.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 28.2828274F));\n            tableLayoutLegend.Controls.Add(labelSerialTitle, 0, 0);\n            tableLayoutLegend.Controls.Add(textSerial, 1, 0);\n            tableLayoutLegend.Controls.Add(labelLegend, 0, 1);\n            tableLayoutLegend.Controls.Add(labelLegendGray, 1, 1);\n            tableLayoutLegend.Controls.Add(labelLegendGreen, 2, 1);\n            tableLayoutLegend.Controls.Add(labelLegendRed, 3, 1);\n            tableLayoutLegend.Dock = DockStyle.Bottom;\n            tableLayoutLegend.Location = new Point(0, 570);\n            tableLayoutLegend.Margin = new Padding(0);\n            tableLayoutLegend.Name = \"tableLayoutLegend\";\n            tableLayoutLegend.Padding = new Padding(10, 0, 10, 20);\n            tableLayoutLegend.RowCount = 2;\n            tableLayoutLegend.RowStyles.Add(new RowStyle(SizeType.Absolute, 60F));\n            tableLayoutLegend.RowStyles.Add(new RowStyle(SizeType.Absolute, 60F));\n            tableLayoutLegend.Size = new Size(1236, 120);\n            tableLayoutLegend.TabIndex = 7;\n            // \n            // labelSerialTitle\n            // \n            labelSerialTitle.AutoSize = true;\n            labelSerialTitle.Dock = DockStyle.Top;\n            labelSerialTitle.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelSerialTitle.Location = new Point(20, 68);\n            labelSerialTitle.Margin = new Padding(10, 8, 10, 8);\n            labelSerialTitle.Name = \"labelSerialTitle\";\n            labelSerialTitle.Padding = new Padding(5);\n            labelSerialTitle.Size = new Size(164, 42);\n            labelSerialTitle.TabIndex = 5;\n            labelSerialTitle.Text = \"Serial\";\n            // \n            // labelLegendGreen\n            // \n            labelLegendGreen.AutoSize = true;\n            labelLegendGreen.BackColor = Color.Green;\n            labelLegendGreen.Dock = DockStyle.Top;\n            labelLegendGreen.ForeColor = Color.White;\n            labelLegendGreen.Location = new Point(204, 8);\n            labelLegendGreen.Margin = new Padding(10, 8, 10, 8);\n            labelLegendGreen.Name = \"labelLegendGreen\";\n            labelLegendGreen.Padding = new Padding(5);\n            labelLegendGreen.Size = new Size(323, 42);\n            labelLegendGreen.TabIndex = 4;\n            labelLegendGreen.Text = \"Updated\";\n            // \n            // labelLegendGray\n            // \n            labelLegendGray.AutoSize = true;\n            labelLegendGray.BackColor = Color.Gray;\n            labelLegendGray.Dock = DockStyle.Top;\n            labelLegendGray.ForeColor = Color.White;\n            labelLegendGray.Location = new Point(547, 8);\n            labelLegendGray.Margin = new Padding(10, 8, 10, 8);\n            labelLegendGray.Name = \"labelLegendGray\";\n            labelLegendGray.Padding = new Padding(5);\n            labelLegendGray.Size = new Size(323, 42);\n            labelLegendGray.TabIndex = 3;\n            labelLegendGray.Text = \"Can't check local version\";\n            // \n            // labelLegendRed\n            // \n            labelLegendRed.AutoSize = true;\n            labelLegendRed.BackColor = Color.Red;\n            labelLegendRed.Dock = DockStyle.Top;\n            labelLegendRed.ForeColor = Color.White;\n            labelLegendRed.Location = new Point(890, 8);\n            labelLegendRed.Margin = new Padding(10, 8, 10, 8);\n            labelLegendRed.Name = \"labelLegendRed\";\n            labelLegendRed.Padding = new Padding(5);\n            labelLegendRed.Size = new Size(326, 42);\n            labelLegendRed.TabIndex = 1;\n            labelLegendRed.Text = \"Update Available\";\n            // \n            // labelLegend\n            // \n            labelLegend.AutoSize = true;\n            labelLegend.Dock = DockStyle.Top;\n            labelLegend.Font = new Font(\"Segoe UI\", 9F, FontStyle.Bold);\n            labelLegend.Location = new Point(20, 8);\n            labelLegend.Margin = new Padding(10, 8, 10, 8);\n            labelLegend.Name = \"labelLegend\";\n            labelLegend.Padding = new Padding(5);\n            labelLegend.Size = new Size(164, 42);\n            labelLegend.TabIndex = 0;\n            labelLegend.Text = \"Legend\";\n            // \n            // textSerial\n            // \n            textSerial.BackColor = SystemColors.ButtonFace;\n            textSerial.BorderStyle = BorderStyle.FixedSingle;\n            textSerial.Dock = DockStyle.Top;\n            textSerial.Location = new Point(204, 68);\n            textSerial.Margin = new Padding(10, 8, 10, 8);\n            textSerial.Name = \"textSerial\";\n            textSerial.Size = new Size(323, 39);\n            textSerial.TabIndex = 6;\n            // \n            // Updates\n            // \n            AutoScaleDimensions = new SizeF(192F, 192F);\n            AutoScaleMode = AutoScaleMode.Dpi;\n            AutoScroll = true;\n            ClientSize = new Size(1236, 690);\n            Controls.Add(tableLayoutLegend);\n            Controls.Add(panelDrivers);\n            Controls.Add(panelDriversTitle);\n            Controls.Add(panelBios);\n            Controls.Add(panelBiosTitle);\n            Margin = new Padding(4);\n            MinimizeBox = false;\n            Name = \"Updates\";\n            ShowIcon = false;\n            ShowInTaskbar = false;\n            Text = \"BIOS and Driver Updates\";\n            ((System.ComponentModel.ISupportInitialize)pictureBios).EndInit();\n            panelBiosTitle.ResumeLayout(false);\n            panelBiosTitle.PerformLayout();\n            panelBios.ResumeLayout(false);\n            panelBios.PerformLayout();\n            panelDrivers.ResumeLayout(false);\n            panelDrivers.PerformLayout();\n            panelDriversTitle.ResumeLayout(false);\n            panelDriversTitle.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)pictureDrivers).EndInit();\n            tableLayoutLegend.ResumeLayout(false);\n            tableLayoutLegend.PerformLayout();\n            ResumeLayout(false);\n            PerformLayout();\n        }\n\n        #endregion\n\n        private TableLayoutPanel tableBios;\n        private Label labelBIOS;\n        private PictureBox pictureBios;\n        private Panel panelBiosTitle;\n        private Panel panelBios;\n        private Panel panelDrivers;\n        private TableLayoutPanel tableDrivers;\n        private Panel panelDriversTitle;\n        private Label labelDrivers;\n        private PictureBox pictureDrivers;\n        private RButton buttonRefresh;\n        private Label labelUpdates;\n        private TableLayoutPanel tableLayoutLegend;\n        private Label labelLegend;\n        private Label labelLegendRed;\n        private Label labelLegendGray;\n        private Label labelLegendGreen;\n        private ToolTip toolTip;\n        private Label labelSerialTitle;\n        private TextBox textSerial;\n    }\n}"
  },
  {
    "path": "app/Updates.cs",
    "content": "﻿using GHelper.Helpers;\nusing GHelper.UI;\nusing NvAPIWrapper.Native.Display.Structures;\nusing System.Diagnostics;\nusing System.Diagnostics.Metrics;\nusing System.Management;\nusing System.Net;\nusing System.Text.Json;\n\nnamespace GHelper\n{\n\n    public partial class Updates : RForm\n    {\n        const int DRIVER_NOT_FOUND = 2;\n        const int DRIVER_NEWER = 1;\n\n        //static int rowCount = 0;\n        static string bios;\n        static string model;\n\n        static int updatesCount = 0;\n        private static long lastUpdate;\n\n        private readonly Font _boldUnderlineFont;\n        private readonly Font _font;\n\n        public struct DriverDownload\n        {\n            public string categoryName;\n            public string title;\n            public string version;\n            public string downloadUrl;\n            public string date;\n            public JsonElement hardwares;\n        }\n        private void LoadUpdates(bool force = false)\n        {\n\n            if (!force && (Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastUpdate) < 5000)) return;\n            lastUpdate = DateTimeOffset.Now.ToUnixTimeMilliseconds();\n\n            (bios, model) = AppConfig.GetBiosAndModel();\n\n            buttonRefresh.TabStop = false;\n\n            updatesCount = 0;\n            labelUpdates.ForeColor = colorEco;\n            labelUpdates.Text = Properties.Strings.NoNewUpdates;\n\n            panelBios.AccessibleRole = AccessibleRole.Grouping;\n            panelBios.AccessibleName = Properties.Strings.NoNewUpdates;\n            panelBios.TabStop = true;\n\n            Text = Properties.Strings.BiosAndDriverUpdates + \": \" + model + \" \" + bios;\n            labelBIOS.Text = \"BIOS\";\n            labelDrivers.Text = Properties.Strings.DriverAndSoftware;\n\n            labelLegend.Text = Properties.Strings.Legend;\n            labelLegendGray.Text = Properties.Strings.LegendGray;\n            labelLegendRed.Text = Properties.Strings.LegendRed;\n            labelLegendGreen.Text = Properties.Strings.LegendGreen;\n\n            SuspendLayout();\n\n            tableBios.Visible = false;\n            tableDrivers.Visible = false;\n\n            labelLegendGreen.BackColor = colorEco;\n            labelLegendRed.BackColor = colorTurbo;\n\n            ClearTable(tableBios);\n            ClearTable(tableDrivers);\n\n            string rogParam = AppConfig.IsROG() ? \"&systemCode=rog\" : \"\";\n\n            Task.Run(async () =>\n            {\n                DriversAsync($\"https://rog.asus.com/support/webapi/product/GetPDBIOS?website=global&model={model}&cpu={model}{rogParam}\", 1, tableBios);\n            });\n\n            Task.Run(async () =>\n            {\n                DriversAsync($\"https://rog.asus.com/support/webapi/product/GetPDDrivers?website=global&model={model}&cpu={model}&osid=52{rogParam}\", 0, tableDrivers);\n            });\n\n            Task.Run(async () =>\n            {\n                LaptopSerialNumber();\n            });\n\n            textSerial.BackColor = panelBios.BackColor;\n            textSerial.ForeColor = panelBios.ForeColor;\n        }\n\n        private void ClearTable(TableLayoutPanel tableLayoutPanel)\n        {\n            while (tableLayoutPanel.Controls.Count > 0)\n            {\n                tableLayoutPanel.Controls[0].Dispose();\n            }\n\n            tableLayoutPanel.RowCount = 0;\n        }\n\n        public Updates()\n        {\n            InitializeComponent();\n            InitTheme(true);\n\n            _boldUnderlineFont = new Font(Font, FontStyle.Bold | FontStyle.Underline);\n            _font = new Font(Font, FontStyle.Underline);\n\n            //buttonRefresh.Visible = false;\n            buttonRefresh.Click += ButtonRefresh_Click;\n            Shown += Updates_Shown;\n\n            FormClosed += (s, e) =>\n            {\n                // Dispose fonts when form closes\n                _boldUnderlineFont.Dispose();\n                _font.Dispose();\n            };\n        }\n\n        private void ButtonRefresh_Click(object? sender, EventArgs e)\n        {\n            LoadUpdates();\n        }\n\n        private void Updates_Shown(object? sender, EventArgs e)\n        {\n            Height = Program.settingsForm.Height;\n            Top = Program.settingsForm.Top;\n            Left = Program.settingsForm.Left - Width - 5;\n            LoadUpdates(true);\n        }\n\n        public void LaptopSerialNumber()\n        {\n            try\n            {\n                var output = ProcessHelper.RunCMD(\"powershell\", \"-NoProfile -Command \\\"(Get-WmiObject Win32_BIOS).SerialNumber\\\"\");\n                Invoke(delegate\n                {\n                    textSerial.Text = output;\n                });\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine(ex.ToString());\n            }\n        }\n\n        private Dictionary<string, string> GetDeviceVersions()\n        {\n            using (ManagementObjectSearcher objSearcher = new ManagementObjectSearcher(\"Select * from Win32_PnPSignedDriver\"))\n            {\n                using (ManagementObjectCollection objCollection = objSearcher.Get())\n                {\n                    Dictionary<string, string> list = new();\n\n                    foreach (ManagementObject obj in objCollection) if (obj[\"DriverVersion\"] is not null)\n                        {\n                            if (obj[\"DeviceID\"] is not null)\n                            {\n                                list[obj[\"DeviceID\"].ToString()] = obj[\"DriverVersion\"].ToString();\n                            }\n                            if (obj[\"DeviceName\"] is not null)\n                            {\n                                var deviceName = obj[\"DeviceName\"].ToString();\n                                if (deviceName.Contains(\"DolbyAPO SWC\")) list[\"Dolby\"] = obj[\"DriverVersion\"].ToString();\n                                if (deviceName.Contains(\"Fortemedia Audio\")) list[\"Fortemedia\"] = obj[\"DriverVersion\"].ToString();\n                            }\n                        }\n                    return list;\n                }\n            }\n        }\n\n\n        private void _VisualiseDriver(DriverDownload driver, TableLayoutPanel table)\n        {\n            string versionText = driver.version.Replace(\"latest version at the \", \"\");\n            LinkLabel versionLabel = new LinkLabel { Text = versionText, Anchor = AnchorStyles.Left, AutoSize = true };\n\n            versionLabel.AccessibleName = driver.title;\n            versionLabel.TabStop = true;\n            versionLabel.TabIndex = table.RowCount + 1;\n\n            versionLabel.Cursor = Cursors.Hand;\n            versionLabel.Font = _font;\n            versionLabel.LinkColor = colorEco;\n            versionLabel.Padding = new Padding(5, 5, 5, 5);\n            versionLabel.LinkClicked += delegate\n            {\n                Process.Start(new ProcessStartInfo(driver.downloadUrl) { UseShellExecute = true });\n            };\n\n            table.RowStyles.Add(new RowStyle(SizeType.AutoSize));\n            table.Controls.Add(new Label { Text = driver.categoryName, Anchor = AnchorStyles.Left, Dock = DockStyle.Fill, Padding = new Padding(5, 5, 5, 5) }, 0, table.RowCount);\n            table.Controls.Add(new Label { Text = driver.title, Anchor = AnchorStyles.Left, Dock = DockStyle.Fill, Padding = new Padding(5, 5, 5, 5) }, 1, table.RowCount);\n            table.Controls.Add(new Label { Text = driver.date, Anchor = AnchorStyles.Left, Dock = DockStyle.Fill, Padding = new Padding(5, 5, 5, 5) }, 2, table.RowCount);\n            table.Controls.Add(versionLabel, 3, table.RowCount);\n            table.RowCount++;\n        }\n\n        public void VisualiseDriver(DriverDownload driver, TableLayoutPanel table)\n        {\n            if (InvokeRequired)\n            {\n                Invoke(delegate\n                {\n                    _VisualiseDriver(driver, table);\n                });\n            }\n            else\n            {\n                _VisualiseDriver(driver, table);\n            }\n        }\n\n        public void ShowTable(TableLayoutPanel table)\n        {\n            Invoke(delegate\n            {\n                table.Visible = true;\n                ResumeLayout(false);\n                PerformLayout();\n            });\n        }\n\n        private void _VisualiseNewDriver(int position, int newer, string tip, TableLayoutPanel table)\n        {\n            var label = table.GetControlFromPosition(3, position) as LinkLabel;\n            if (label != null)\n            {\n                toolTip.SetToolTip(label, tip);\n\n                if (newer == DRIVER_NEWER)\n                {\n                    label.AccessibleName = label.AccessibleName + Properties.Strings.NewUpdates;\n                    label.Font = _boldUnderlineFont;\n                    label.LinkColor = colorTurbo;\n                }\n\n                if (newer == DRIVER_NOT_FOUND) label.LinkColor = Color.Gray;\n\n            }\n        }\n\n        public void VisualiseNewDriver(int position, int newer, string tip, TableLayoutPanel table)\n        {\n            if (InvokeRequired)\n            {\n                Invoke(delegate\n                {\n                    _VisualiseNewDriver(position, newer, tip, table);\n                });\n            }\n            else\n            {\n                _VisualiseNewDriver(position, newer, tip, table);\n            }\n        }\n\n        public void VisualiseNewCount(int updatesCount, TableLayoutPanel table)\n        {\n            if (InvokeRequired)\n            {\n                Invoke(delegate\n                {\n                    _VisualiseNewCount(updatesCount, table);\n                });\n            }\n            else\n            {\n                _VisualiseNewCount(updatesCount, table);\n            }\n        }\n\n        public void _VisualiseNewCount(int updatesCount, TableLayoutPanel table)\n        {\n            labelUpdates.Text = $\"{Properties.Strings.NewUpdates}: {updatesCount}\";\n            labelUpdates.ForeColor = colorTurbo;\n            labelUpdates.Font = _boldUnderlineFont;\n            panelBios.AccessibleName = labelUpdates.Text;\n        }\n\n        static string CleanupDeviceId(string input)\n        {\n            int index = input.IndexOf(\"&REV_\");\n            if (index != -1)\n            {\n                return input.Substring(0, index);\n            }\n            return input;\n        }\n\n        public async void DriversAsync(string url, int type, TableLayoutPanel table)\n        {\n\n            try\n            {\n                using (var httpClient = new HttpClient(new HttpClientHandler\n                {\n                    AutomaticDecompression = DecompressionMethods.All\n                }))\n                {\n                    Logger.WriteLine(url);\n                    httpClient.DefaultRequestHeaders.AcceptEncoding.ParseAdd(\"gzip, deflate, br\");\n                    httpClient.DefaultRequestHeaders.Add(\"User-Agent\", \"C# App\");\n                    var json = await httpClient.GetStringAsync(url);\n\n                    var data = JsonSerializer.Deserialize<JsonElement>(json);\n                    var result = data.GetProperty(\"Result\");\n\n                    // fallback for bugged API\n                    if (result.ToString() == \"\" || result.GetProperty(\"Obj\").GetArrayLength() == 0)\n                    {\n                        var urlFallback = url + \"&tag=\" + new Random().Next(10, 99);\n                        Logger.WriteLine(urlFallback);\n                        json = await httpClient.GetStringAsync(urlFallback);\n                        data = JsonSerializer.Deserialize<JsonElement>(json);\n                    }\n\n                    var groups = data.GetProperty(\"Result\").GetProperty(\"Obj\");\n\n\n                    List<string> skipList = new() { \"Armoury Crate & Aura Creator Installer\", \"MyASUS\", \"ASUS Smart Display Control\", \"Aura Wallpaper\", \"Virtual Pet\", \"Virtual Pet- Ultimate Edition\", \"ROG Font V1.5\", \"Armoury Crate Control Interface\" };\n                    List<DriverDownload> drivers = new();\n\n                    for (int i = 0; i < groups.GetArrayLength(); i++)\n                    {\n                        var categoryName = groups[i].GetProperty(\"Name\").ToString();\n                        var files = groups[i].GetProperty(\"Files\");\n\n                        var oldTitle = \"\";\n\n                        for (int j = 0; j < files.GetArrayLength(); j++)\n                        {\n\n                            var file = files[j];\n                            var title = file.GetProperty(\"Title\").ToString();\n\n                            if (oldTitle != title && !skipList.Contains(title))\n                            {\n\n                                var driver = new DriverDownload();\n                                driver.categoryName = categoryName;\n                                driver.title = title;\n                                driver.version = file.GetProperty(\"Version\").ToString().Replace(\"V\", \"\");\n                                driver.downloadUrl = file.GetProperty(\"DownloadUrl\").GetProperty(\"Global\").ToString();\n                                driver.hardwares = file.GetProperty(\"HardwareInfoList\");\n                                driver.date = file.GetProperty(\"ReleaseDate\").ToString();\n                                drivers.Add(driver);\n\n                                VisualiseDriver(driver, table);\n                            }\n\n                            oldTitle = title;\n                        }\n                    }\n\n                    ShowTable(table);\n\n\n                    Dictionary<string, string> devices = new();\n                    if (type == 0) devices = GetDeviceVersions();\n\n                    //Debug.WriteLine(biosVersion);\n\n                    int count = 0;\n                    foreach (var driver in drivers)\n                    {\n                        int newer = DRIVER_NOT_FOUND;\n                        string tip = driver.version;\n\n                        if (type == 0 && driver.hardwares.ToString().Length > 0)\n                            for (int k = 0; k < driver.hardwares.GetArrayLength(); k++)\n                            {\n                                var deviceID = driver.hardwares[k].GetProperty(\"hardwareid\").ToString();\n                                deviceID = CleanupDeviceId(deviceID);\n                                var localVersions = devices.Where(p => p.Key.Contains(deviceID, StringComparison.CurrentCultureIgnoreCase)).Select(p => p.Value);\n                                foreach (var localVersion in localVersions)\n                                {\n                                    newer = Math.Min(newer, new Version(driver.version).CompareTo(new Version(localVersion)));\n                                    Logger.WriteLine(driver.title + \" \" + deviceID + \" \" + driver.version + \" vs \" + localVersion + \" = \" + newer);\n                                    tip = \"Download: \" + driver.version + \"\\n\" + \"Installed: \" + localVersion;\n                                }\n                            }\n\n                        if (type == 1 && !driver.title.Contains(\"Firmware\"))\n                        {\n                            newer = Int32.Parse(driver.version) > Int32.Parse(bios) ? 1 : -1;\n                            tip = \"Download: \" + driver.version + \"\\n\" + \"Installed: \" + bios;\n                        }\n\n                        VisualiseNewDriver(count, newer, tip, table);\n\n                        if (newer == DRIVER_NEWER)\n                        {\n                            updatesCount++;\n                            VisualiseNewCount(updatesCount, table);\n                        }\n\n                        count++;\n                    }\n\n                    GC.Collect();\n                    GC.WaitForPendingFinalizers();\n                }\n            }\n            catch (Exception ex)\n            {\n                Logger.WriteLine(ex.ToString());\n\n            }\n\n        }\n    }\n}\n"
  },
  {
    "path": "app/Updates.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!--\n    Microsoft ResX Schema\n\n    Version 2.0\n\n    The primary goals of this format is to allow a simple XML format\n    that is mostly human readable. The generation and parsing of the\n    various data types are done through the TypeConverter classes\n    associated with the data types.\n\n    Example:\n\n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n\n    There are any number of \"resheader\" rows that contain simple\n    name/value pairs.\n\n    Each data row contains a name, and value. The row also contains a\n    type or mimetype. Type corresponds to a .NET class that support\n    text/value conversion through the TypeConverter architecture.\n    Classes that don't support this are serialized and stored with the\n    mimetype set.\n\n    The mimetype is used for serialized objects, and tells the\n    ResXResourceReader how to depersist the object. This is currently not\n    extensible. For a given mimetype the value must be set accordingly:\n\n    Note - application/x-microsoft.net.object.binary.base64 is the format\n    that the ResXResourceWriter will generate, however the reader can\n    read any of the formats listed below.\n\n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array\n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"toolTip.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n</root>"
  },
  {
    "path": "app/app.manifest",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<assembly manifestVersion=\"1.0\" xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n  <assemblyIdentity version=\"1.0.0.0\" name=\"MyApplication.app\"/>\n  <trustInfo xmlns=\"urn:schemas-microsoft-com:asm.v2\">\n    <security>\n      <requestedPrivileges xmlns=\"urn:schemas-microsoft-com:asm.v3\">\n        <!-- UAC Manifest Options\n             If you want to change the Windows User Account Control level replace the \n             requestedExecutionLevel node with one of the following.\n\n        <requestedExecutionLevel  level=\"asInvoker\" uiAccess=\"false\" />\n        <requestedExecutionLevel  level=\"requireAdministrator\" uiAccess=\"false\" />\n        <requestedExecutionLevel  level=\"highestAvailable\" uiAccess=\"false\" />\n\n            Specifying requestedExecutionLevel element will disable file and registry virtualization. \n            Remove this element if your application requires this virtualization for backwards\n            compatibility.\n        -->\n      </requestedPrivileges>\n    </security>\n  </trustInfo>\n\n  <compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\">\n    <application>\n      <!-- A list of the Windows versions that this application has been tested on\n           and is designed to work with. Uncomment the appropriate elements\n           and Windows will automatically select the most compatible environment. -->\n\n      <!-- Windows Vista -->\n      <!--<supportedOS Id=\"{e2011457-1546-43c5-a5fe-008deee3d3f0}\" />-->\n\n      <!-- Windows 7 -->\n      <!--<supportedOS Id=\"{35138b9a-5d96-4fbd-8e2d-a2440225f93a}\" />-->\n\n      <!-- Windows 8 -->\n      <!--<supportedOS Id=\"{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}\" />-->\n\n      <!-- Windows 8.1 -->\n      <!--<supportedOS Id=\"{1f676c76-80e1-4239-95bb-83d0f6d0da78}\" />-->\n\n      <!-- Windows 10 -->\n      <supportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\" />\n\n    </application>\n  </compatibility>\n\n  <!-- Indicates that the application is DPI-aware and will not be automatically scaled by Windows at higher\n       DPIs. Windows Presentation Foundation (WPF) applications are automatically DPI-aware and do not need \n       to opt in. Windows Forms applications targeting .NET Framework 4.6 that opt into this setting, should \n       also set the 'EnableWindowsFormsHighDpiAutoResizing' setting to 'true' in their app.config. \n       \n       Makes the application long-path aware. See https://docs.microsoft.com/windows/win32/fileio/maximum-file-path-limitation -->\n\n\t<application xmlns=\"urn:schemas-microsoft-com:asm.v3\">\n\t\t<windowsSettings>\n\t\t\t<!--<dpiAwareness xmlns=\"http://schemas.microsoft.com/SMI/2016/WindowsSettings\">PerMonitor/dpiAwareness>-->\n\t\t\t<dpiAwareness xmlns=\"http://schemas.microsoft.com/SMI/2016/WindowsSettings\">System</dpiAwareness>\n\t\t\t<dpiAware xmlns=\"http://schemas.microsoft.com/SMI/2005/WindowsSettings\">true</dpiAware>\n\t\t</windowsSettings>\n\t</application>\n\n\t<!-- Enable themes for Windows common controls and dialogs (Windows XP and later) -->\n\t\n\t\n  <dependency>\n    <dependentAssembly>\n      <assemblyIdentity\n          type=\"win32\"\n          name=\"Microsoft.Windows.Common-Controls\"\n          version=\"6.0.0.0\"\n          processorArchitecture=\"*\"\n          publicKeyToken=\"6595b64144ccf1df\"\n          language=\"*\"\n        />\n    </dependentAssembly>\n  </dependency>\n\n</assembly>\n"
  },
  {
    "path": "app/global.json",
    "content": "{\n}"
  },
  {
    "path": "crowdin.yml",
    "content": "files:\n  - source: /app/Properties/Strings.resx\n    translation: /app/Properties/Strings.%two_letters_code%.resx\n"
  },
  {
    "path": "docs/README.ja-JP.md",
    "content": "# G-Helper - Asusノートパソコン用の軽量コントロールツール\n[![United24](https://raw.githubusercontent.com/seerge/g-helper/main/docs/ua.png)](https://u24.gov.ua/)\n[![GitHub release](https://img.shields.io/github/release/seerge/g-helper)](https://GitHub.com/seerge/g-helper/releases/) \n[![Github all releases](https://img.shields.io/github/downloads/seerge/g-helper/total)](https://GitHub.com/seerge/g-helper/releases/) [![GitHub stars](https://img.shields.io/github/stars/seerge/g-helper.svg?style=social)](https://GitHub.com/seerge/g-helper/stargazers/) <sup>[中文版点这里](https://github.com/seerge/g-helper/blob/main/docs/README.zh-CN.md)</sup>\n\nAsusノートパソコン用の軽量なArmoury Crate代替ツールで、余分な負荷や不要なサービスなしでほぼ同じ機能を提供します。\n\nROG Zephyrus G14、G15、G16、M16、Flow X13、Flow X16、Flow Z13、TUFシリーズ、StrixまたはScarシリーズ、ProArt、Vivobook、Zenbook、ROG Ally / Ally Xなど、すべての人気モデルで動作します！\n\n# [:floppy_disk:ダウンロード](https://github.com/seerge/g-helper/releases/latest/download/GHelper.zip)\n**⭐ アプリが気に入ったら、ぜひオンラインで広めてください**\n\n<table>\n<tr>\n   <td><b>プロジェクトをサポート</b></td>\n   <td >\n      <a href=\"https://www.paypal.com/donate/?hosted_button_id=Y7UNMPRNLB5X2\"><img src=\"https://raw.githubusercontent.com/seerge/g-helper/main/docs/paypal-eur.png\" height=\"36\" alt=\"PayPal EUR\"></a>&nbsp;\n      <a href=\"https://www.paypal.com/donate/?hosted_button_id=JSMU7DFHFSJMW\"><img src=\"https://raw.githubusercontent.com/seerge/g-helper/main/docs/paypal-usd.png\" height=\"36\" alt=\"PayPal USD\"></a>&nbsp;\n      <a href=\"https://buy.stripe.com/8wM6pt8HbgK50tWbIK\"><img src=\"https://raw.githubusercontent.com/seerge/g-helper/main/docs/stripe.png\" height=\"36\" alt=\"Stripe\"></a>&nbsp;\n      <a href=\"https://buy.stripe.com/6oE29dg9D3Xj7Wo28b\"><img src=\"https://raw.githubusercontent.com/seerge/g-helper/main/docs/alipay.png\" height=\"36\" alt=\"Alipay\"></a>\n   </td>\n</tr>\n</table>\n\n- [FAQ](https://github.com/seerge/g-helper/wiki/FAQ)\n- [セットアップと要件](https://github.com/seerge/g-helper/wiki/Requirements)\n- [トラブルシューティング](https://github.com/seerge/g-helper/wiki/Troubleshooting)\n- [パワーユーザー設定](https://github.com/seerge/g-helper/wiki/Power-user-settings)\n\n\n[![G-Helper Download](https://github.com/seerge/g-helper/assets/5920850/4d98465a-63a5-4498-ae14-afb3e67e7e82)](https://github.com/seerge/g-helper/releases/latest/download/GHelper.zip)\n\n## :loudspeaker: YouTubeレビューとガイド\n| [![Youtube review Josh Cravey](https://i.ytimg.com/vi/hqe-PjuE-K8/hqdefault.jpg)](https://www.youtube.com/watch?v=hqe-PjuE-K8) | [![Youtube review cbutters Tech](https://i.ytimg.com/vi/6aVdwJKZSSc/hqdefault.jpg)](https://www.youtube.com/watch?v=6aVdwJKZSSc) |\n| ----------------- | ---------------- | \n| [Josh Cravey](https://www.youtube.com/watch?v=hqe-PjuE-K8) | [cbutters Tech](https://www.youtube.com/watch?v=6aVdwJKZSSc) | \n\n## 📰 記事\n1. https://www.digitaltrends.com/computing/g-helper-armoury-crate-alternative/\n2. https://binaryfork.com/ghelper-armoury-crate-alternative-10216/\n\n## :gift: 利点\n\n1. シームレスで自動的なGPU切り替え\n2. すべてのパフォーマンスモードを電力制限とファンカーブで完全にカスタマイズ可能\n3. 軽量。システムに何もインストールしません。実行するための単一のexeファイルのみ\n4. シンプルでクリーンなネイティブUIで、すべての設定に簡単にアクセス\n5. FNロックとカスタムホットキー\n\n![Screenshot 2024-03-11 104354](https://github.com/seerge/g-helper/assets/5920850/626a5a6e-fdae-431c-843e-92886c8420ee)\n\n### :zap: 機能\n\n1. パフォーマンスモード: サイレント - バランス - ターボ (内蔵、デフォルトのファンカーブ付き)\n2. GPUモード: エコ - スタンダード - アルティメット - オプティマイズド\n3. ディスプレイのリフレッシュレート制御とディスプレイオーバードライブ (OD)\n4. カスタムファンカーブエディタ、電力制限、ターボブースト選択\n5. アニメマトリックスまたはスラッシュライティングの制御、アニメーションGIF、時計、オーディオビジュアライザー\n6. バックライトのアニメーションモードとカラー\n7. ホットキーの処理\n8. CPUとGPUの温度、ファン速度、バッテリーステータスの監視\n9. バッテリーの充電制限\n10. NVidia GPUのオーバークロックとアンダーボルティング\n11. XG Mobileの制御\n12. AMD CPUのアンダーボルティング\n13. BIOSとドライバの更新\n14. Asusマウスの設定\n15. ミニLEDのマルチゾーンスイッチ\n16. フリッカーフリーディミングとビジュアルモード\n\n### :gear: 自動化\n- バッテリー使用時または電源接続時のパフォーマンスモードの切り替え\n- オプティマイズドGPUモード - バッテリー使用時にdGPUを無効化し、電源接続時に有効化\n- 自動ディスプレイリフレッシュレート (バッテリー使用時に60Hz、電源接続時に最大Hz)\n- バッテリー使用時または電源接続時のキーボードバックライトのタイムアウト\n\n### :rocket: パフォーマンスモード\n\n<img align=\"right\" width=\"300\" src=\"https://github.com/seerge/g-helper/assets/5920850/3e119674-db8d-486b-aa65-2bf9b61f9aa6\">\n\nすべてのモードはBIOSに組み込まれており、デフォルトのファンカーブと電力制限が設定されています。これらはArmoury Crateと同じです。\n\n各BIOSモードは対応するWindowsパワーモードとペアになっています。これを「ファン + 電源」設定で調整できます。\n\n1. BIOSの「サイレント」 + Windowsの「最高の電力効率」パワーモード\n2. BIOSの「バランス」 (AC時のパフォーマンス) + Windowsの「バランス」パワーモード\n3. BIOSの「ターボ」 + Windowsの「最高のパフォーマンス」パワーモード\n\n### :video_game: GPUモード\n\n1. エコ: 低電力の統合GPUのみが有効、iGPUが内蔵ディスプレイを駆動\n2. スタンダード (MS Hybrid): iGPUとdGPUが有効、iGPUが内蔵ディスプレイを駆動\n3. アルティメット: iGPUとdGPUが有効、dGPUが内蔵ディスプレイを駆動 (2022年以降のモデルでサポート)\n4. オプティマイズド: バッテリー使用時にdGPUを無効化 (エコ)し、電源接続時に有効化 (スタンダード)\n\n![Screenshot 2024-03-11 111818](https://github.com/seerge/g-helper/assets/5920850/fd69a81e-978d-4d5c-a0a8-26da51f90a5b)\n\n![GPU Modes](https://github.com/seerge/g-helper/assets/5920850/65c6bdd5-728c-4965-b544-fcf5a85ed6a2)\n\n\n### :mouse: Asusマウスとその他の周辺機器のサポート\n\n[現在サポートされているモデル](https://github.com/seerge/g-helper/discussions/900)\n- ROG Chakram X \n- ROG Chakram Core \n- ROG Gladius II and Gladius II Origin\n- ROG Gladius II Wireless\n- ROG Gladius III\n- ROG Gladius III Wireless\n- ROG Harpe Ace Extreme\n- ROG Harpe Ace Aim Lab Edition\n- ROG Harpe Ace Mini\n- ROG Harpe II Ace\n- ROG Keris Wireless\n- ROG Keris II Ace\n- ROG Keris Wireless Aimpoint\n- ROG Strix Carry\n- ROG Strix III Gladius III Aimpoint Wireless \n- ROG Strix Impact III\n- ROG Strix Impact III Wireless \n- ROG Spatha X\n- ROG Strix Impact II Wireless\n- ROG Pugio\n- ROG Pugio II\n- TUF Gaming M4 Wireless\n- TUF Gaming M3\n- TUF Gaming M3 Gen II\n- TUF Gaming M4 AIR\n- TUF Gaming M5\n- TX Gaming Mini\n\n[@IceStormNG](https://github.com/IceStormNG) 👑 の貢献と研究に大いに感謝します。\n\n### ⌨️ キーバインディング\n\n- ``Fn + F5 / Fn + Shift + F5`` - パフォーマンスモードを前方/後方に切り替え\n- ``Ctrl + Shift + F5 / Ctrl + Shift + Alt + F5`` - パフォーマンスモードを前方/後方に切り替え\n- ``Ctrl + Shift + F12`` - G-Helperウィンドウを開く\n- ``Ctrl + M1 / M2`` - ディスプレイの明るさを下げる/上げる\n- ``Shift + M1 / M2`` - バックライトの明るさを下げる/上げる\n- ``Fn + C`` - Fnロック\n- ``Fn + Ctrl +  F7 / F8`` - フリッカーフリーディミングを下げる/上げる\n- ``Fn + Shift + F7 / F8`` - マトリックス/スラッシュライティングの明るさを下げる/上げる\n- ``Fn + Shift + F7 / F8`` - スクリーンパッドの明るさを下げる/上げる\n- ``Ctrl + Shift + F20`` - マイクをミュート\n- ``Ctrl + Shift + Alt + F13`` - ディスプレイのリフレッシュレートを切り替え\n- ``Ctrl + Shift + Alt + F14`` - エコGPUモード\n- ``Ctrl + Shift + Alt + F15`` - スタンダードGPUモード\n- ``Ctrl + Shift + Alt + F16`` - サイレント\n- ``Ctrl + Shift + Alt + F17`` - バランス\n- ``Ctrl + Shift + Alt + F18`` - ターボ\n- ``Ctrl + Shift + Alt + F19`` - カスタム1 (存在する場合)\n- ``Ctrl + Shift + Alt + F20`` - カスタム2 (存在する場合)\n- [カスタムキーバインディング/ホットキー](https://github.com/seerge/g-helper/wiki/Power-user-settings#custom-hotkey-actions)\n\n### 🎮ROG Allyバインディング\n- ``M + DPad Left / Right`` - ディスプレイの明るさ\n- ``M + DPad Up`` - タッチキーボード\n- ``M + DPad Down`` - デスクトップを表示\n- ``M + Y`` - AMDオーバーレイを切り替え\n- ``M + X`` - スクリーンショット\n- ``M + Right Stick Click`` - コントローラーモード\n\n------------------\n\n### 🔖 重要な注意事項\n\nG-Helperはオペレーティングシステム、ファームウェア、またはドライバではありません。ハードウェアをリアルタイムで「実行」することはありません。\n\nこれは、製造元が作成し、BIOSに保存されている事前定義された操作モードの1つを選択し、オプションでいくつかの設定を行うアプリケーションです。Armoury Crateと同じように機能します。Asus System Control Interface「ドライバ」を使用してすべての機能を実現します。\n\nArmoury Crateと同じモード/設定を使用する場合、デバイスのパフォーマンスや動作に違いはありません。\n\nG-Helperの役割は、リモコンがテレビに対して果たす役割に似ています。\n\n### 使用ライブラリとプロジェクト\n- [Linux Kernel](https://github.com/torvalds/linux/blob/master/include/linux/platform_data/x86/asus-wmi.h) - ASUS ACPI/WMIインターフェースの基本エンドポイント\n- [NvAPIWrapper](https://github.com/falahati/NvAPIWrapper) - Nvidia APIへのアクセス\n- [Starlight](https://github.com/vddCore/Starlight) - アニメマトリックス通信プロトコル\n- [UXTU](https://github.com/JamesCJ60/Universal-x86-Tuning-Utility) - Ryzen System Management Unitを使用したアンダーボルティング\n- [AsusCtl](https://gitlab.com/asus-linux/asusctl) - インスピレーションと逆アセンブル\n\n### 免責事項\n\"Asus\"、\"ROG\"、\"TUF\"、および\"Armoury Crate\"は、AsusTek Computer, Inc.の商標であり、AsusTek Computerに属する資産に対して一切の権利を主張しません。これらの資産は純粋に情報提供の目的で使用されています。\n\nソフトウェアは「現状のまま」提供され、明示または黙示のいかなる保証もなく、商品性、特定の目的への適合性、および非侵害の保証を含みますが、これに限定されません。このソフトウェアの誤用は、システムの不安定性や誤動作を引き起こす可能性があります。\n"
  },
  {
    "path": "docs/README.md",
    "content": "# G-Helper - Lightweight control tool for Asus laptops\n[![United24](https://raw.githubusercontent.com/seerge/g-helper/main/docs/ua.png)](https://u24.gov.ua/)\n[![GitHub release](https://img.shields.io/github/release/seerge/g-helper)](https://GitHub.com/seerge/g-helper/releases/) \n[![Github all releases](https://img.shields.io/github/downloads/seerge/g-helper/total)](https://GitHub.com/seerge/g-helper/releases/) [![SLSA3](https://img.shields.io/badge/SLSA-level%203-green?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAMAAAAolt3jAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABMlBMVEXvMQDvMADwMQDwMADwMADvMADvMADwMADwMQDvMQDvMQDwMADwMADvMADwMADwMADwMQDvMQDvMQDwMQDvMQDwMQDwMADwMADwMQDwMADwMADvMADvMQDvMQDwMADwMQDwMADvMQDwMADwMQDwMADwMADwMADwMADwMADwMADvMQDvMQDwMADwMQDwMADvMQDvMQDwMADvMQDvMQDwMADwMQDwMQDwMQDvMQDwMADvMADwMADwMQDvMQDwMADwMQDwMQDwMQDwMQDvMQDvMQDvMADwMADvMADvMADvMADwMQDwMQDvMADvMQDvMQDvMADvMADvMQDwMQDvMQDvMADvMADvMADvMQDwMQDvMQDvMQDvMADvMADwMADvMQDvMQDvMQDvMADwMADwMQDwMAAAAAA/HoSwAAAAY3RSTlMpsvneQlQrU/LQSWzvM5DzmzeF9Pi+N6vvrk9HuP3asTaPgkVFmO3rUrMjqvL6d0LLTVjI/PuMQNSGOWa/6YU8zNuDLihJ0e6aMGzl8s2IT7b6lIFkRj1mtvQ0eJW95rG0+Sid59x/AAAAAWJLR0Rltd2InwAAAAlwSFlzAAAOwwAADsMBx2+oZAAAAAd0SU1FB+YHGg0tGLrTaD4AAACqSURBVAjXY2BgZEqGAGYWVjYGdg4oj5OLm4eRgZcvBcThFxAUEk4WYRAVE09OlpCUkpaRTU6WY0iWV1BUUlZRVQMqUddgSE7W1NLS1gFp0NXTB3KTDQyNjE2Sk03NzC1A3GR1SytrG1s7e4dkBogtjk7OLq5uyTCuu4enl3cyhOvj66fvHxAIEmYICg4JDQuPiAQrEmGIio6JjZOFOjSegSHBBMpOToxPAgCJfDZC/m2KHgAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0wNy0yNlQxMzo0NToyNCswMDowMC8AywoAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjItMDctMjZUMTM6NDU6MjQrMDA6MDBeXXO2AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAABJRU5ErkJggg==)](https://github.com/seerge/g-helper/attestations) \n [![GitHub stars](https://img.shields.io/github/stars/seerge/g-helper.svg?style=social)](https://GitHub.com/seerge/g-helper/stargazers/) <sup>[中文版点这里](https://github.com/seerge/g-helper/blob/main/docs/README.zh-CN.md)</sup> <sup>[日本語はこちら](https://github.com/seerge/g-helper/blob/main/docs/README.ja-JP.md)</sup>\n\nSmall and lightweight Armoury Crate alternative for Asus laptops offering almost same functionality with a much smaller footprint. Works with all popular models, such as ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, Flow Z13, DUO, TUF Series, Strix or Scar Series, ProArt, Vivobook, Zenbook, Expertbook, ROG Ally or Ally X and many more! \n\n# [:floppy_disk: Download](https://github.com/seerge/g-helper/releases/latest/download/GHelper.zip)\n**⭐ If you like the app - please spread the word about it online**\n\n<table>\n<tr>\n   <td><b>Support Project</b></td>\n   <td >\n      <a href=\"https://www.paypal.com/donate/?hosted_button_id=Y7UNMPRNLB5X2\"><img src=\"https://raw.githubusercontent.com/seerge/g-helper/main/docs/paypal-eur.png\" width=\"150\" alt=\"PayPal EUR\"></a>&nbsp;\n      <a href=\"https://www.paypal.com/donate/?hosted_button_id=JSMU7DFHFSJMW\"><img src=\"https://raw.githubusercontent.com/seerge/g-helper/main/docs/paypal-usd.png\" width=\"150\" alt=\"PayPal USD\"></a>&nbsp;\n      <a href=\"https://buy.stripe.com/8wM6pt8HbgK50tWbIK\"><img src=\"https://raw.githubusercontent.com/seerge/g-helper/main/docs/stripe.png\" width=\"150\"alt=\"Stripe\"></a>&nbsp;\n      <a href=\"https://buy.stripe.com/6oE29dg9D3Xj7Wo28b\"><img src=\"https://raw.githubusercontent.com/seerge/g-helper/main/docs/alipay.png\" width=\"150\" alt=\"Alipay\"></a>\n   </td>\n</tr>\n</table>\n\n- [FAQ](https://github.com/seerge/g-helper/wiki/FAQ)\n- [Setup and Requirements](https://github.com/seerge/g-helper/wiki/Requirements)\n- [Troubleshooting](https://github.com/seerge/g-helper/wiki/Troubleshooting)\n- [Power User Settings](https://github.com/seerge/g-helper/wiki/Power-user-settings)\n\n\n[![G-Helper Download](https://github.com/seerge/g-helper/assets/5920850/4d98465a-63a5-4498-ae14-afb3e67e7e82)](https://github.com/seerge/g-helper/releases/latest/download/GHelper.zip)\n\n## :loudspeaker: YouTube Reviews and Guides\n| [![Youtube review Josh Cravey](https://i.ytimg.com/vi/hqe-PjuE-K8/hqdefault.jpg)](https://www.youtube.com/watch?v=hqe-PjuE-K8) | [![Youtube review Crimson Tech](https://i.ytimg.com/vi/5XUIMUzgHU0/hqdefault.jpg)](https://www.youtube.com/watch?v=5XUIMUzgHU0) | [![Youtube review cbutters Tech](https://i.ytimg.com/vi/6aVdwJKZSSc/hqdefault.jpg)](https://www.youtube.com/watch?v=6aVdwJKZSSc) |\n| ----------------- | ---------------- | ---------------- | \n| [Josh Cravey](https://www.youtube.com/watch?v=hqe-PjuE-K8) | [Crimson Tech](https://www.youtube.com/watch?v=5XUIMUzgHU0) | [cbutters Tech](https://www.youtube.com/watch?v=6aVdwJKZSSc) | \n\n## 📰 Articles\n1. https://www.digitaltrends.com/computing/g-helper-armoury-crate-alternative/\n2. https://binaryfork.com/ghelper-armoury-crate-alternative-10216/\n3. https://www.ultrabookreview.com/71392-optimized-quiet-gaming-5080-5090/\n4. https://www.notebookcheck.net/Unbloated-G-Helper-The-best-open-source-alternative-to-Asus-Armoury-Crate-Part-2.1213486.0.html\n5. https://www.lesnumeriques.com/appli-logiciel/marre-des-lenteurs-d-armoury-crate-sur-votre-pc-portable-asus-decouvrez-g-helper-l-alternative-ultra-legere-n240111.html\n\n## :gift: Advantages \n\n1. Seamless and automatic GPU switching\n2. All performance modes can be fully customized with power limits and fan curves\n3. Lightweight. Just a single exe to run. Doesn't install anything in your system. \n4. Simple and clean native UI with easy access to all settings\n5. FN-Lock and custom hotkeys\n\n![Screenshot 2024-03-11 104354](https://github.com/seerge/g-helper/assets/5920850/626a5a6e-fdae-431c-843e-92886c8420ee)\n\n### :zap: Features\n\n1. Performance modes: Silent - Balanced - Turbo (built-in, with default fan curves)\n2. GPU modes: Eco - Standard - Ultimate - Optimized\n3. Screen refresh rate control with display overdrive (OD) \n4. Custom fan curve editor, power limits and turbo boost selection for every performance mode\n5. Anime Matrix or Slash Lighting control including animated GIFs, clock and Audio visualizer\n6. Backlight animation modes and colors \n7. Hotkey handling\n8. Monitor CPU and GPU temperature, fan speeds and battery status\n9. Battery charge limit to preserve battery health\n10. NVidia GPU overclocking and undervolting\n11. XG Mobile Control\n12. AMD CPU Undervolting\n13. BIOS and Driver Updates\n14. Asus Mice settings\n15. Mini-led multi-zone switch\n16. Flicker-free dimming and Visual Modes\n\n### :gear: Automation\n- Performance Mode switching when on battery or plugged in\n- Optimized GPU mode - disables dGPU on battery and enables when plugged in\n- Auto Screen refresh rate (60Hz on battery and max Hz when plugged)\n- Keyboard backlight timeout on battery or when plugged in\n\n### :rocket: Performance Modes\n\n<img align=\"right\" width=\"300\" src=\"https://github.com/seerge/g-helper/assets/5920850/3e119674-db8d-486b-aa65-2bf9b61f9aa6\">\n\nAll Modes are **baked in BIOS** along with default fan curves and power limits and they are the **same** as in the Armoury Crate.\n\nEach BIOS mode is paired with matching Windows Power Mode. You can adjust this setting under ``Fans + Power``\n\n1. **Silent** in BIOS + **Best power efficiency** power mode\n2. **Balanced** (Performance in AC) in BIOS  + **Balanced** power mode\n3. **Turbo** in BIOS + **Best performance** power mode\n   \n\n### :video_game: GPU Modes\n\n1. **Eco** : only low power integrated GPU enabled, iGPU drives built in display\n2. **Standard** (MS Hybrid) : iGPU and dGPU enabled, iGPU drives built in display\n3. **Ultimate**: iGPU and dGPU enabled, but dGPU drives built in display (supported on 2022+ models)\n4. **Optimized**: disables dGPU on battery (Eco) and enables when plugged in (Standard)\n\n![Screenshot 2024-03-11 111818](https://github.com/seerge/g-helper/assets/5920850/fd69a81e-978d-4d5c-a0a8-26da51f90a5b)\n\n![GPU Modes](https://github.com/seerge/g-helper/assets/5920850/65c6bdd5-728c-4965-b544-fcf5a85ed6a2)\n\n\n### :mouse: Asus Mouse and other peripherals support\n\n[Currently supported models](https://github.com/seerge/g-helper/discussions/900)\n- ROG Chakram X \n- ROG Chakram Core \n- ROG Gladius II and Gladius II Origin\n- ROG Gladius II Wireless\n- ROG Gladius III\n- ROG Gladius III Wireless\n- ROG Harpe Ace Extreme\n- ROG Harpe Ace Aim Lab Edition\n- ROG Harpe Ace Mini\n- ROG Harpe II Ace\n- ROG Keris Wireless\n- ROG Keris II Ace\n- ROG Keris Wireless Aimpoint\n- ROG Strix Carry\n- ROG Strix III Gladius III Aimpoint Wireless \n- ROG Strix Impact III\n- ROG Strix Impact III Wireless \n- ROG Spatha X\n- ROG Strix Impact II Wireless\n- ROG Pugio\n- ROG Pugio II\n- TUF Gaming M4 Wireless\n- TUF Gaming M3\n- TUF Gaming M3 Gen II\n- TUF Gaming M4 AIR\n- TUF Gaming M5\n- TX Gaming Mini\n\nHuge thanks to [@IceStormNG](https://github.com/IceStormNG) 👑 for contribution and research (!).\n\n### ⌨️ Keybindings\n\n- ``Fn + F5 / Fn + Shift + F5`` - Toggle Performance Modes forwards / backwards\n- ``Ctrl + Shift + F5 / Ctrl + Shift + Alt + F5`` - Toggle Performance Modes forwards / backwards\n- ``Ctrl + Shift + F12`` - Open G-Helper window\n- ``Ctrl + M1 / M2`` - Screen brightness Down / Up\n- ``Shift + M1 / M2`` - Backlight brightness Down / Up\n- ``Fn + C`` - Fn-Lock\n- ``Fn + Ctrl +  F7 / F8`` / ``Ctrl + Shift + Alt +  F7 / F8`` - Flicker-free dimming Down / Up\n- ``Fn + Shift + F7 / F8`` - Matrix / Slash Lighting brightness Down / Up\n- ``Fn + Shift + F7 / F8`` / ``Ctrl + Shift + Alt +  F7 / F8`` - Screenpad brightness Down / Up\n- ``Ctrl + Shift + F20`` - Mute Microphone\n- ``Ctrl + Shift + Alt + F13`` - Toggle Display Refresh Rate\n- ``Ctrl + Shift + Alt + F14`` - Eco GPU Mode\n- ``Ctrl + Shift + Alt + F15`` - Standard GPU Mode\n- ``Ctrl + Shift + Alt + F16`` - Silent\n- ``Ctrl + Shift + Alt + F17`` - Balanced\n- ``Ctrl + Shift + Alt + F18`` - Turbo\n- ``Ctrl + Shift + Alt + F19`` - Custom 1 (if exists)\n- ``Ctrl + Shift + Alt + F20`` - Custom 2 (if exists)\n- [Custom keybindings / hotkeys](https://github.com/seerge/g-helper/wiki/Power-user-settings#custom-hotkey-actions)\n\n### 🎮ROG Ally Bindings\n- ``M + DPad Left / Right`` - Display Brightness\n- ``M + DPad Up`` - Touch keyboard\n- ``M + DPad Down`` - Show desktop\n- ``M + Y`` - Toggle AMD overay\n- ``M + X`` - Screenshot\n- ``M + Right Stick Click`` - Controller Mode\n\n------------------\n\n> [!NOTE]\n> ### 🔖 Important Notice\n> G-Helper is **NOT** an operating system, firmware, or driver. It **DOES NOT** \"run\" your hardware in real-time anyhow.\n> \n> It's an app that lets you select one of the predefined operating modes created by manufacturer (and stored in BIOS) and optionally(!) set some settings that already exist on your device same as Armoury Crate can. It does it by using the Asus System Control Interface \"driver\" that Armoury uses for it.\n> \n> If you use equivalent mode/settings as in Armoury Crate - the performance or the behavior of your device won't be different.\n> \n> The role of G-Helper for your laptop is similar to the role of a remote control for your TV.\n\n### Libraries and projects used\n- [Linux Kernel](https://github.com/torvalds/linux/blob/master/include/linux/platform_data/x86/asus-wmi.h) for some basic endpoints in ASUS ACPI/WMI interface\n- [NvAPIWrapper](https://github.com/falahati/NvAPIWrapper) for accessing Nvidia API\n- [Starlight](https://github.com/vddCore/Starlight) for anime matrix communication protocol\n- [UXTU](https://github.com/JamesCJ60/Universal-x86-Tuning-Utility) for undervolting using Ryzen System Management Unit\n- [AsusCtl](https://gitlab.com/asus-linux/asusctl) for inspiration and some reverse engineering\n\n### Code Signing Policy\nFree code signing provided by [SignPath.io](https://about.signpath.io/), certificate by [SignPath Foundation](https://signpath.org/)\n\n### Privacy Policy\nThis program will not transfer any information to other networked systems\n\n### Disclaimers\n\"Asus\", \"ROG\", \"TUF\", and \"Armoury Crate\" are trademarked by and belong to AsusTek Computer, Inc. I make no claims to these or any assets belonging to AsusTek Computer and use them purely for informational purposes only.\n\nTHE SOFTWARE IS PROVIDED “AS IS” AND WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. MISUSE OF THIS SOFTWARE COULD CAUSE SYSTEM INSTABILITY OR MALFUNCTION.\n"
  },
  {
    "path": "docs/README.zh-CN.md",
    "content": "# G-Helper——轻量级的华硕笔记本控制中心\n[![United24](https://raw.githubusercontent.com/seerge/g-helper/main/docs/ua.png)](https://u24.gov.ua/)\n[![GitHub release](https://img.shields.io/github/release/seerge/g-helper)](https://GitHub.com/seerge/g-helper/releases/) \n[![Github all releases](https://img.shields.io/github/downloads/seerge/g-helper/total)](https://GitHub.com/seerge/g-helper/releases/) [![GitHub stars](https://img.shields.io/github/stars/seerge/g-helper.svg?style=social)](https://GitHub.com/seerge/g-helper/stargazers/) \n\n\n语言: [English](https://github.com/seerge/g-helper#readme) | 中文 | [日本語](https://github.com/seerge/g-helper/blob/main/docs/README.ja-JP.md)\n\n适用于华硕（Asus）笔记本电脑的轻量级 Armoury Crate (奥创控制中心)替代品，在功能几乎相同的同时减少不必要的服务以减轻负载。\nG-helper兼容所有主流型号，例如 ROG 幻14、幻15、幻16、幻13、幻X、天选（飞行堡垒）系列、枪神/魔霸系列、创系列、灵耀系列、无畏系列、ROG Ally 等！\n\n\n# [:floppy_disk:下载应用](https://github.com/seerge/g-helper/releases/latest/download/GHelper.zip)\n\n<table>\n<tr>\n   <td><b>支持此项目</b></td>\n   <td >\n      <a href=\"https://www.paypal.com/donate/?hosted_button_id=Y7UNMPRNLB5X2\"><img src=\"https://raw.githubusercontent.com/seerge/g-helper/main/docs/paypal-eur.png\" height=\"36\" alt=\"PayPal EUR\"></a>&nbsp;\n      <a href=\"https://www.paypal.com/donate/?hosted_button_id=JSMU7DFHFSJMW\"><img src=\"https://raw.githubusercontent.com/seerge/g-helper/main/docs/paypal-usd.png\" height=\"36\" alt=\"PayPal USD\"></a>&nbsp;\n      <a href=\"https://buy.stripe.com/8wM6pt8HbgK50tWbIK\"><img src=\"https://raw.githubusercontent.com/seerge/g-helper/main/docs/stripe.png\" height=\"36\" alt=\"Stripe\"></a>&nbsp;\n      <a href=\"https://buy.stripe.com/6oE29dg9D3Xj7Wo28b\"><img src=\"https://raw.githubusercontent.com/seerge/g-helper/main/docs/alipay.png\" height=\"36\" alt=\"Alipay\"></a>\n   </td>\n</tr>\n</table>\n\n如果你喜欢这个应用，请[给这个项目⭐️](https://github.com/seerge/g-helper) 或者向别人推荐它！\n\n[常见问题解答(FAQ)](#常见问题解答)\n\n[安装指南](#安装指南)\n\n[高级用户设置](#高级用户设置)\n\n[![G-Helper Download](https://github.com/pasical/g-helper/assets/112304778/03f442b9-29e8-4e99-a095-8eaa533c995b)](https://github.com/seerge/g-helper/releases/latest/download/GHelper.zip)\n\n_如果你在别的地方提到这个软件-请记得加上这个项目的网址。十分感谢。_\n\n## 🎁 主要优点\n\n1. 自动且无缝的独立显卡模式切换(不需要关闭所有应用或执行其他操作)\n2. 可以手动调整所有的性能模式(包括自定义风扇曲线以及PPTs(Platform Power Threshold,即CPU总功耗,下文简称PPTs--译注))\n3. 极致的轻量化，几乎不消耗任何资源，也不需要安装系统服务。只需要下载一个exe文件就可以运行。\n4. 简洁的界面设计，可以轻松调整所有设置。\n5. FN 锁定和自定义热键\n\n![image](https://github.com/pasical/g-helper/assets/112304778/ee221865-cf36-4246-95f0-47313e647230)\n\n\n\n### ⚡️ 主要功能\n\n1. **性能模式**: 静音模式 - 平衡模式 - 增强模式 (笔电bios内置的性能模式，附带默认的风扇曲线)\n2. **显卡模式**: 集显模式 - 标准模式 - 独显直连 - 自动切换\n3. 笔记本屏幕刷新率 60hz 或 120hz 自动调节(或者 144hz 等刷新率)，包括屏幕Overdrive(OD,即ROG系列的屏幕快速响应/快显功能--译注)功能\n4. 可调节的风扇曲线、电源功耗设置(PPTs)(_注:请谨慎调节!_)和CPU超频选项\n5. ROG Anime matrix 光显矩阵屏控制， 感谢项目 [Starlight](https://github.com/vddCore/Starlight) + 应用侧的一些调整，包括动画GIF图片\n6. 键盘灯光效果和颜色设置 (包括睡眠模式下的灯光效果和对飞行堡垒/天选系列的键盘支持)\n7. 对M按键的自定义设置和 FN+X 快捷键的自定义\n8. CPU/GPU温度、风扇转速和电池充放电功率显示\n9. 电池充电上限设置，保护电池健康度\n10. Nvidia GPU 超频和降压\n11. XG Mobile 控制\n12. AMD CPU 的降压\n13. BIOS和驱动的升级\n14. 华硕鼠标的配置修改\n15. Mini-LED 屏幕的多区调光\n16. 低亮度防闪烁功能和显示风格的修改\n\n### ⚙️ 当使用电池供电或插上电源时，自动切换：\n\n- 性能模式 (软件会记住上一次使用电池或插上电源时的电源模式)\n- 自动切换独立显卡模式 - 使用电池时停用独显，并在插上电源时重新启用\n- 自动切换屏幕刷新率 (使用电池时切换为 60hz,插入电源后切换为 120+ hz)\n- 使用电池时键盘背光可自动关闭\n\n为了保证自动切换功能和按键绑定功能的正常工作，软件需要在后台运行并显示一个托盘图标。这并不会消耗其他资源。\n\n### 🚀 性能模式\n\n性能模式与 Armoury Crate(奥创控制中心)中的 **保持一致**，因为这些设置与其对应的风扇曲线都被保存在bios中\n\n1. 静音 (风扇转速最小或完全停转, 70W 总PPT, 其中 CPU 最高 45W PPT) + windows电源模式设置为最长续航/省电模式\n2. 平衡/性能 (平衡模式的风扇曲线设置, 100W 总PPT, 其中 CPU 最高 45W PPT) + windows电源模式设置为平衡\n3. 增强 (激进的风扇曲线设置, 125W 总PPT, 其中 CPU 最高 80W PPT) + windows电源模式设置为高性能/最佳性能\n\n_PPTs 默认在 幻14 2022版上显示, 对于其他型号 PPTs 的显示将会有所变化，因为它们在bios中的设置不同。_\n\n![Screenshot 2023-04-06 142234](https://user-images.githubusercontent.com/5920850/230377635-7032a480-3a94-4e35-9468-d8911e3e55ec.png)\n\n### 🎮 显卡模式\n\n1. 集显模式 : 只启用低功耗的内置显卡, 核显连接笔电内置屏幕\n2. 标准模式 (MS Hybrid) : 同时启用核显与独显, 核显连接笔电内置屏幕\n3. 独显直连: 同时启用核显与独显, 但独显直连笔电屏幕 (仅在幻14 2022版等机型上支持)\n4. 自动切换: 使用电池时关闭独显(集显模式)，并在插上电源后重新启用独显(混合输出)\n\n![Screenshot 2024-03-11 111818](https://github.com/seerge/g-helper/assets/5920850/fd69a81e-978d-4d5c-a0a8-26da51f90a5b)\n\n![GPU Modes](https://github.com/seerge/g-helper/assets/5920850/65c6bdd5-728c-4965-b544-fcf5a85ed6a2)\n\n### :mouse: 华硕鼠标和其他外设的支持\n\n[目前支持的型号](https://github.com/seerge/g-helper/discussions/900)\n\n*对于中国大陆发行的版本请自行参考\n- ROG Chakram X \n- ROG Chakram Core \n- ROG Gladius II and Gladius II Origin\n- ROG Gladius II Wireless\n- ROG Gladius III\n- ROG Gladius III Wireless\n- ROG Harpe Ace Extreme\n- ROG Harpe Ace Aim Lab Edition\n- ROG Harpe Ace Mini\n- ROG Harpe II Ace\n- ROG Keris Wireless\n- ROG Keris II Ace\n- ROG Keris Wireless Aimpoint\n- ROG Strix Carry\n- ROG Strix III Gladius III Aimpoint Wireless \n- ROG Strix Impact III\n- ROG Strix Impact III Wireless \n- ROG Spatha X\n- ROG Strix Impact II Wireless\n- ROG Pugio\n- ROG Pugio II\n- TUF Gaming M4 Wireless\n- TUF Gaming M3\n- TUF Gaming M3 Gen II\n- TUF Gaming M4 AIR\n- TUF Gaming M5\n- TX Gaming Mini\n\n特别感谢 [@IceStormNG](https://github.com/IceStormNG) 👑 的贡献和研究！\n\n### ⌨️ 按键绑定\n\n- ``Fn + F5 / Fn + Shift + F5`` - 向前/向后切换性能模式\n- ``Ctrl + Shift + F5 / Ctrl + Shift + Alt + F5`` - 向前/向后切换性能模式\n- ``Ctrl + Shift + F12`` - 打开G-Helper窗口\n- ``Ctrl + M1 / M2`` - 屏幕亮度调低/调高\n- ``Shift + M1 / M2`` - 键盘背光亮度调低/调高\n- ``Fn + C`` - Fn锁定\n- ``Fn + Shift + F7 / F8`` - 光显矩阵/光线矩阵亮度调低/调高\n- ``Fn + Shift + F7 / F8`` - 屏幕亮度调低/调高\n- ``Ctrl + Shift + F20`` - 麦克风静音\n- ``Ctrl + Shift + Alt + F14`` - 集显模式\n- ``Ctrl + Shift + Alt + F15`` - 标准模式\n- ``Ctrl + Shift + Alt + F16`` - 静音模式\n- ``Ctrl + Shift + Alt + F17`` - 平衡模式\n- ``Ctrl + Shift + Alt + F18`` - 增强模式\n- ``Ctrl + Shift + Alt + F19`` - 自定义 1（如果存在）\n- ``Ctrl + Shift + Alt + F20`` - 自定义 2（如果存在）\n- [自定义键绑定/热键](https://github.com/seerge/g-helper/wiki/Power-user-settings#custom-hotkey-actions)\n\n### 🎮ROG Ally 按键\n- ``M + DPad Left / Right`` - 显示亮度\n- ``M + DPad Up`` - 屏幕键盘\n- ``M + DPad Down`` - 显示桌面\n- ``M + Y`` - 切换 AMD 覆盖\n- ``M + X`` - 截屏\n- ``M + Right Stick Click`` - 控制器模式\n\n------------------\n#### 如果您喜欢本项目，可以扫描以下二维码捐赠 \n\n| [Paypal in EUR](https://www.paypal.com/donate/?hosted_button_id=4HMSHS4EBQWTA) | [Paypal in USD](https://www.paypal.com/donate/?hosted_button_id=SRM6QUX6ACXDY) |\n| ------------------------------------------ | ----------------------------------------------- |\n| [![QR Code](https://user-images.githubusercontent.com/5920850/233658717-0441494d-fede-4a2c-b4f2-4b16a184a69a.png)](https://www.paypal.com/donate/?hosted_button_id=4HMSHS4EBQWTA) | [![QR Code](https://github-production-user-asset-6210df.s3.amazonaws.com/5920850/239492811-b487e89a-3df6-42ea-bdb8-24c455ab2310.png)](https://www.paypal.com/donate/?hosted_button_id=SRM6QUX6ACXDY) |\n\n------------------\n\n\n# 常见问题解答\n\n#### 当我按下 M4 / Rog键的时候总是弹出安装Armoury Crate的弹窗提示，我该如何关闭它?\n\n删除下列文件或者把它移动(注:剪切+粘贴)到别的目录 ``C:\\Windows\\System32\\ASUSACCI\\ArmouryCrateKeyControl.exe``.\n\n如果还是出现弹窗 - 进入 BIOS (开机时按住 F2), 按照屏幕下方的快捷键提示进入 Advanced Settings,然后关闭 \"Armoury Crate Control Interface\" (注:把它设置为disabled)。\n\n#### 电池充电限制不起作用\n\n这有可能是因为ASUS服务在你设置后又覆写了对应的设置。你可以通过在G-helper中点击\"更多\"，然后在\"正在运行的Asus服务项\"右侧点击\"停止\"来停止ASUS服务。\n\n#### 我没看到显卡模式\n\n在一些旧型号中(比如幻14 2020)从硬件层上不支持禁用显卡，在这些机型中并不需要显卡模式，因此没有显示。\n\n#### 为什么我的电脑上没有独显直连\n\n独显直连(在硬件层面上)只对2022年之后的机型中生效。\n\n#### 我是否应该自行调整功耗设置(PPTs)和风扇曲线?\n\n你可以不那么做，这些操作是可选的。按照经验(bios)内置的性能模式工作的很好。请只在遇到问题的时候限制功耗或者手动设置风扇模式。当你在风扇与功率设置中按下“应用”时，bios将会认为风扇配置文件为“自定义”! (无论你是否真的修改了风扇曲线)\n\n#### G-helper是如何控制我的风扇转速的?\n\n软件并不会修改风扇转速。这个设置实际上由bios控制(与Armoury Crate的情况相同)。G-helper 所能做的 - 就是将一个自定义的风扇配置(可选地)应用到正在使用的性能模式，其中包括8组温度+风扇速度的百分比数值%。软件通过与Armoury Crate看起来相同的WMI endpoint来应用这一设置，\n\n#### 我如何把风扇转速显示从百分比%切换到RPM(每分钟转速)?\n\n点击一下百分比即可切换。\n\n#### 当我修改自定义风扇曲线时，我得到了\"BIOS拒绝修改风扇曲线\"(\"BIOS rejected fan curve\")提示\n\n2021之后的TUF机型不支持自定义风扇曲线。很可能在Armory Crate中也没有这个选项。\n\n#### 我没有在G-helper中看到独显温度\n\n很可能要么你正在使用核显模式/自动切换模式，这种情况下独显只是关闭了；或者你的windows系统为独显设置了睡眠模式(为了省电)。这种情况下，G-helper无法识别到独显，也不能获得温度读数。\n\n#### 打开应用后没有看到应用启动/弹窗提示\"G-Helper已经在运行\"\n\n请在系统托盘里找到 (G) 图标。windows会默认隐藏所有图标，所以你可能需要点击 ^ 来看见它们。建议任务栏右键进入任务栏设置 -> 其他系统图标 -> 将 G-Helper 设置为始终在任务栏上显示。\n\n#### 应用不能启动或者崩溃了，我该怎么做?\n\n从开始菜单里打开“事件管理器”， 进入 Windows日志 -> 应用，然后在最近的错误日志里寻找包含G-helper的日志。如果你找到一个 - 请提出一个 [新的 issue](https://github.com/seerge/g-helper/issues) ，其中包含来自这次错误的所有的详细信息。\n\n#### 我可以在用G-Helper的时候同时用myASUS吗?\n\n当然可以! 唯一的问题是myASUS可能会重置你之前在g-helper里设置的电池充电上限。在这种情况下，建议你在这两个应用(myASUS和g-helper)里设置相同的充电上限(60%/80%/100%)以避免冲突。\n\n#### 我如何将M3键设置为将麦克风静音?\n\n这个功能由 Asus Optimization Service 管理(所以 G-helper 没有这项设置，也不管理这个功能)。请确认这个系统服务是否正常运行\n\n#### 我如何设置不同的视觉风格(即 Armoury Crate 内的gamevisual功能)?\n\n因为这个功能让颜色显示不正确，我个人(注:作者 :) )并不喜欢这些。但是如果你需要这个功能 - 你可以使用 Nvidia 控制面板/GefoeceExperirence滤镜或者AMD控制面板(Radeon Software/AMD Software: Adrenalin Edition)来修改显示颜色(因显示器和配置而异)。如果你真的非常需要这个功能，你也可以使用 [微软商店中ASUS自己的工具](https://apps.microsoft.com/store/detail/gamevisual/9P4K1LFTXSH8?hl=nl-nl&gl=nl&rtc=1)\n\n#### 我能超频 Nvidia GPU 核心或显存吗?\n\n首先确保你的独立显卡是启用的，之后打开\"风扇 + 电源\"选项，在这里即可调整核心和显存频率。这个和Armoury Crate中的设置一样。注意，使用这项功能需要管理员权限，应用也会弹出需要管理员权限的提示。(*)\n\n#### Windows Defender将该应用标记为恶意软件/病毒\n\n这是Windows Defender的误报(其他使用机器学习来检测病毒的杀毒软件可能也出现同样的结果)，这可能是因为本应用没有数字签名和证书。如果你不放心的话，你可以自己编译安装本项目，本项目是完全开源的。\n\n#### 我该在哪找到应用的配置文件和日志文件\n\n你可以在 `%AppData%\\GHelper` 文件夹找到他们，当你在issue中提交bug的时候，请务必附上应用日志。\n\n#### 应用无法在开机时启动或者启动的时候在任务栏没有提示\n\n打开应用，取消再重新勾选\"开机自启\"项目。如果还是不行的话，你可以手动在Windows 任务计划程序(Task Scheduler)中为G-helper应用增加几秒延迟后再启动。\n\n#### 我该如何卸载G-helper?\n\nG-helper是一个单文件的exe文件, 而且它不会向系统中安装任何东西。如果要“卸载”它 - 你可以直接删除exe文件 :) 如果你已经设置了自定义的风扇配置或者功耗设置(PPTs) - 在删除软件之前建议你选择你最喜欢的配置模式(比如\"平衡\")，然后在“风扇与电源设置”里点击“恢复默认设置”。\n\n#### 我如何给我的CPU降压？\n\n目前你只能给AMD CPU降压。如果你的机型支持这个功能 - 你会在“风扇 + 电源”项中看到对应的设置。如果你看不到该项设置，说明你的CPU不支持降压。所有支持的型号可以[点此查询](https://github.com/seerge/g-helper/discussions/736)。\n\n#### 我的机型是幻14 2023并且我无法关闭/开启我的独立显卡\n\n这应该是旧版本的BIOS的问题。根据[用户反馈](https://github.com/seerge/g-helper/issues/680)，更新最近的BIOS 312版本即可解决问题(可以通过MyASUS或者G-helper \"更新\" 项进行安装)。\n\n#### 我的机型是幻15 2022并且我无法关闭/开启我的独立显卡或者风扇出问题\n\n幻15 2022款在BIOS 313以上版本会有很多小问题。许多用户反馈可以通过[将BIOS版本降级到311版本来解决](https://rog.asus.com/nl/laptops/rog-zephyrus/rog-zephyrus-g15-2022-series/helpdesk_bios/)。\n\n#### 我删除了Armoury之后我的GPU性能降低了\n\n检查你的 Nvidia Experience 设置，确保Whisper Mode项是关闭的。你还可以尝试重置所有设置。`Nvidia 控制面板 -> 管理 3D  设置 -> 恢复`\n\n#### 我如何从硬件层面重启我的笔记本？\n\n所有的华硕笔记本都支持方便的硬重启。它不会影响你的数据，但是会重置所有硬件相关的东西(例如启动独立显卡，唤醒wifi/蓝牙模块等)\n关闭你的电脑，长按“电源”按钮30-40秒。之后正常启动你的电脑(会比正常情况下花更长时间启动)。\n\n#### G-helper 是什么?\n\n这是一个轻量化的Armoury Crate(奥创控制中心)替代工具，而且不需要任何多余的功能或安装不必要的系统服务的。在ROG G14, G15, G16, M16, X13, Z13, X16, TUF, Scar, Vivobook, ProArt等热门笔记本中都适用。\n\n---\n\n### 如何开始\n\n1.下载[**最新版本**](https://github.com/seerge/g-helper/releases/latest/download/GHelper.zip)\n2. 解压到您选择的文件夹_（不要直接从zip运行exe，因为Windows会将其放入临时文件夹并在之后删除）_\n3.运行**GHelper.exe**\n\n- 如果您在启动时收到来自 Windows Defender 的警告（Windows 保护了您的电脑）。\n单击“更多信息”->“仍然运行”。\n- 如果出现“在商店中搜索应用程序”对话框，则这是 Windows Defender 的一个错误。\n右键单击 GHelper.exe -> 选择“属性” -> 选择“取消阻止复选框”\n\n### 要求（强制）\n\n- [Microsoft .NET 7](https://download.visualstudio.microsoft.com/download/pr/8091a826-e1c4-424a-b17b-5c10776cd3de/8957f21a279322d8fac9b542c6aba12e/dotnet-sdk-7.0.408-win-x64.exe)\n- [华硕系统控制界面](https://dlcdnets.asus.com/pub/ASUS/nb/Image/CustomComponent/ASUSSystemControlInterfaceV3/ASUSSystemControlInterfaceV3.exe)\n\n### 建议（可选）\n\n- **不建议**将该应用程序与 Armoury Crate 服务结合使用，因为它们调整相同的设置。 您可以[使用AC自带的卸载工具卸载](https://dlcdnets.asus.com/pub/ASUS/mb/14Utilities/Armoury_Crate_Uninstall_Tool.zip?model=armoury%20crate)。 以防万一，您可以稍后再安装它。\n- **不建议**运行“ASUS Smart Display Control”应用程序，因为它会尝试更改刷新率并与 g-helper 争夺相同的功能。 您可以安全地卸载它。\n- 如果您不打算使用 MyASUS，您可以停止/禁用不必要的服务：转到应用程序中的 **Extra**，然后按 Asus 服务部分中的“停止”。 要重新启动/启用服务 - 单击“开始”。\n\n\n---\n\n精简你的windows可以帮助延长电池的使用时间，同时让笔电的温度更低一些\n\n![Helps to save your battery](https://raw.githubusercontent.com/seerge/g-helper/main/docs/screenshots/screen-5w.png)\n\n---\n\n# 高级用户设置\n\n### 为每一个模式自定义用户计划\n\n在 config.json (位于 `%appdata%/GHelper`) 中你可以手动添加自定义电源设置的GUID (它既可以是\"真正的\"可被选择的电源计划，也可以是\"覆盖式(overlay)\"的电源计划，就像g-helper默认设置的那样)\n\n格式如下 : \"scheme_`<mode>`\" : \"GUID\"\n\nWhere ``mode = 0 (balanced), 1 (turbo), 2 (silent)``\n\n```\n\"scheme_0\": \"2ac1d0e0-17a7-44ed-8091-d88ef75a4eb0\",\n\"scheme_1\": \"381b4222-f694-41f0-9685-ff5bb260df2e\"\n```\n\n确保修改时保证json文件的结构不被打乱 (例如不要增减或缺失逗号、括号等操作) - 否则应用会读取失败，并将重新创建一个新的配置文件来替代它。\n\n### 自定义热键行为\n\n软件支持热键自定义配置。如要设置，在按键旁的选项框中选择\"自定义设置\"，然后执行下面的操作(任选其一):\n\n1. 要想运行任意应用 - 向 \"action\" 文本框中粘贴应用文件exe的完整路径，例如:\n   ``C:\\Program Files\\EA Games\\Battlefield 2042\\BF2042.exe``\n2. 要想模拟任意windows按键 - 向\"action\"文本框中粘贴相对应的 keycode，例如 ``0x2C`` 为屏幕截图键。\n   Keycodes的完整列表: https://learn.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes\n\n![image](https://github.com/pasical/g-helper/assets/112304778/1280b7c9-f0c1-4b91-b502-2b9dd79b12d8)\n\n\n\n---\n\n### 使用的库和项目\n- [Linux Kernel](https://github.com/torvalds/linux/blob/master/drivers/platform/x86/asus-wmi.c)华硕 ACPI/WMI 接口中一些基本端点的 Linux 内核 \n- [NvAPIWrapper](https://github.com/falahati/NvAPIWrapper) 用于访问 Nvidia API\n- [Starlight](https://github.com/vddCore/Starlight) 光显矩阵通信协议\n- [UXTU](https://github.com/JamesCJ60/Universal-x86-Tuning-Utility) 使用 Ryzen 系统管理单元进行降压\n- [AsusCtl](https://gitlab.com/asus-linux/asusctl) 提供灵感和一些逆向工程\n\n### 🔖 注意事项\n\nG-Helper 不是操作系统、固件或驱动程序。它无论如何都不会实时“运行”您的硬件。\n\n这只是一个应用程序，允许您选择制造商创建的预定义操作模式之一（并存储在 BIOS 中），并可选地（！）设置一些已经存在于您的设备上的设置，与 Armoury Crate 的原理相同。它通过使用 Armoury Crate 所使用的 Asus System Control Interface “驱动程序”来实现所有功能。\n\n如果您使用的模式/设置与 Armoury Crate 中的相同 - 您设备的性能或行为不会有差异。\n\nG-Helper 对您笔记本电脑的作用，类似于遥控器对您电视的作用。\n\n### 免责声明\n\n\"ROG\"、\"TUF\" 和 \"Armoury Crate\" 是 AsusTek Computer, Inc. 的注册商标。我对这些或任何属于 AsusTek Computer 的资产不提出任何主张，仅出于信息传递目的而使用它们。\n\n软件按“现状”提供，不提供任何形式的明示或暗示保证，包括但不限于对适销性、特定用途的适用性和非侵权的保证。滥用此软件可能导致系统不稳定或故障。\n\n_注:请务必参考下方 **免责声明** 原文，以避免或减小错误或不恰当之翻译引起的负面影响。翻译仅为便于阅读之目的，并非专业翻译，可能存在错误，可能与最新版本有所差异。本文不具有法律效力，亦不作为发生争端时处理之依据。_\n\n**Disclaimers**\n\"ROG\", \"TUF\", and \"Armoury Crate\" are trademarked by and belong to AsusTek Computer, Inc. I make no claims to these or any assets belonging to AsusTek Computer and use them purely for informational purposes only.\n\nTHE 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. MISUSE OF THIS SOFTWARE COULD CAUSE SYSTEM INSTABILITY OR MALFUNCTION.\n"
  },
  {
    "path": "docs/_config.yml",
    "content": "title: G-Helper\ndescription: Open source Armory Crate alternative for Asus ROG Zephyrus G14, G15, Flow X13, Flow X16, and other models\nplugins:\n  - jemoji\n"
  },
  {
    "path": "docs/_layouts/default.html",
    "content": "<!DOCTYPE html>\n<html lang=\"{{ page.lang | default: site.lang | default: \"en-US\" }}\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n{% seo %}\n    <link rel=\"stylesheet\" href=\"{{ \"/assets/css/style.css?v=\" | append: site.github.build_revision | relative_url }}\">\n    {% include head-custom.html %}\n  </head>\n  <body>\n    <div class=\"container-lg px-3 my-5 markdown-body\">\n\n      {{ content }}\n\n      {% if site.github.private != true and site.github.license %}\n      <div class=\"footer border-top border-gray-light mt-5 pt-3 text-right text-gray\">\n        This site is open source. {% github_edit_link \"Improve this page\" %}.\n      </div>\n      {% endif %}\n    </div>\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/anchor-js/4.1.0/anchor.min.js\" integrity=\"sha256-lZaRhKri35AyJSypXXs4o6OPFTbTmUoltBbDCbdzegg=\" crossorigin=\"anonymous\"></script>\n    <script>anchors.add();</script>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/bloat.bat",
    "content": "sc config  AsusAppService start= auto\nsc config  ASUSLinkNear start= auto\nsc config  ASUSLinkRemote start= auto\nsc config  ASUSSoftwareManager start= auto\nsc config  ASUSSwitch start= auto\nsc config  ASUSSystemAnalysis start= auto\nsc config  ASUSSystemDiagnosis start= auto\nsc config  ArmouryCrateControlInterface start= auto\nsc config  AsusCertService start= auto\nsc config  ASUSOptimization start= auto\n\nsc START  AsusAppService\nsc START  ASUSLinkNear\nsc START  ASUSLinkRemote\nsc START  ASUSSoftwareManager\nsc START  ASUSSwitch\nsc START  ASUSSystemAnalysis\nsc START  ASUSSystemDiagnosis\nsc START  ArmouryCrateControlInterface\nsc START  AsusCertService\nsc START  ASUSOptimization\n\nset /p asd=\"Hit enter to finish\"\n"
  },
  {
    "path": "docs/debloat.bat",
    "content": "sc STOP  AsusAppService\nsc STOP  ASUSLinkNear\nsc STOP  ASUSLinkRemote\nsc STOP  ASUSSoftwareManager\nsc STOP  ASUSSwitch\nsc STOP  ASUSSystemAnalysis\nsc STOP  ASUSSystemDiagnosis\nsc STOP  ArmouryCrateControlInterface\nsc STOP  AsusCertService \nsc STOP  ASUSOptimization\n\nsc config  AsusAppService start= disabled\nsc config  ASUSLinkNear start= disabled\nsc config  ASUSLinkRemote start= disabled\nsc config  ASUSSoftwareManager start= disabled\nsc config  ASUSSwitch start= disabled\nsc config  ASUSSystemAnalysis start= disabled\nsc config  ASUSSystemDiagnosis start= disabled\nsc config  ArmouryCrateControlInterface start= disabled\nsc config  AsusCertService start= disabled\nsc config  ASUSOptimization start= disabled\n\nset /p asd=\"Hit enter to finish\"\n"
  }
]