Full Code of seerge/g-helper for AI

main b6e3735c028e cached
178 files
2.4 MB
634.8k tokens
2488 symbols
1 requests
Download .txt
Showing preview only (2,536K chars total). Download the full file or copy to clipboard to get everything.
Repository: seerge/g-helper
Branch: main
Commit: b6e3735c028e
Files: 178
Total size: 2.4 MB

Directory structure:
gitextract_q6r1djhm/

├── .gitattributes
├── .github/
│   ├── CODE_OF_CONDUCT.md
│   ├── CONTRIBUTING.md
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   ├── feature_request.yml
│   │   └── peripherals_request.yml
│   ├── SECURITY.md
│   └── workflows/
│       ├── build.yml
│       ├── codeql.yml
│       └── release.yml
├── .gitignore
├── LICENSE
├── app/
│   ├── .editorconfig
│   ├── Ally/
│   │   └── AllyControl.cs
│   ├── AnimeMatrix/
│   │   ├── AniMatrixControl.cs
│   │   ├── AnimeMatrixDevice.cs
│   │   ├── Communication/
│   │   │   ├── Device.cs
│   │   │   ├── Packet.cs
│   │   │   └── Platform/
│   │   │       ├── UsbProvider.cs
│   │   │       └── WindowsUsbProvider.cs
│   │   └── SlashDevice.cs
│   ├── App.config
│   ├── AppConfig.cs
│   ├── AsusACPI.cs
│   ├── AsusMouseSettings.Designer.cs
│   ├── AsusMouseSettings.cs
│   ├── AsusMouseSettings.resx
│   ├── AutoUpdate/
│   │   └── AutoUpdateControl.cs
│   ├── Battery/
│   │   └── BatteryControl.cs
│   ├── Display/
│   │   ├── AmdDisplay.cs
│   │   ├── ColorProfileHelper.cs
│   │   ├── DisplayGammaRamp.cs
│   │   ├── GammaRamp.cs
│   │   ├── ScreenBrightness.cs
│   │   ├── ScreenCCD.cs
│   │   ├── ScreenControl.cs
│   │   ├── ScreenInterrogatory.cs
│   │   ├── ScreenNative.cs
│   │   └── VisualControl.cs
│   ├── Extra.Designer.cs
│   ├── Extra.cs
│   ├── Extra.resx
│   ├── Fan/
│   │   └── FanSensorControl.cs
│   ├── Fans.Designer.cs
│   ├── Fans.cs
│   ├── Fans.resx
│   ├── GHelper.csproj
│   ├── GHelper.sln
│   ├── Gpu/
│   │   ├── AMD/
│   │   │   ├── AmdAdl2.cs
│   │   │   └── AmdGpuControl.cs
│   │   ├── GPUModeControl.cs
│   │   ├── IGpuControl.cs
│   │   └── NVidia/
│   │       ├── NvidiaGpuControl.cs
│   │       └── NvidiaSmi.cs
│   ├── Handheld.Designer.cs
│   ├── Handheld.cs
│   ├── Handheld.resx
│   ├── HardwareControl.cs
│   ├── Helpers/
│   │   ├── AsusService.cs
│   │   ├── Audio.cs
│   │   ├── ClamshellModeControl.cs
│   │   ├── ColorUtilities.cs
│   │   ├── DynamicLightingHelper.cs
│   │   ├── Logger.cs
│   │   ├── OSDBase.cs
│   │   ├── OnScreenKeyboard.cs
│   │   ├── ProcessHelper.cs
│   │   ├── RestrictedProcessHelper.cs
│   │   ├── Startup.cs
│   │   ├── ToastForm.cs
│   │   └── TouchscreenHelper.cs
│   ├── Input/
│   │   ├── InputDispatcher.cs
│   │   ├── KeyboardHook.cs
│   │   └── KeyboardListener.cs
│   ├── Matrix.Designer.cs
│   ├── Matrix.cs
│   ├── Matrix.resx
│   ├── Mode/
│   │   ├── ModeControl.cs
│   │   ├── Modes.cs
│   │   └── PowerNative.cs
│   ├── NativeMethods.cs
│   ├── Peripherals/
│   │   ├── IPeripheral.cs
│   │   ├── Mouse/
│   │   │   ├── AsusMouse.cs
│   │   │   └── Models/
│   │   │       ├── Chakram.cs
│   │   │       ├── ChakramCore.cs
│   │   │       ├── ChakramX.cs
│   │   │       ├── GladiusII.cs
│   │   │       ├── GladiusIIIAimpoint.cs
│   │   │       ├── GladiusIIIWireless.cs
│   │   │       ├── GladiusIIWireless.cs
│   │   │       ├── HarpeAceAimLab.cs
│   │   │       ├── HarpeAceMini.cs
│   │   │       ├── HarpeIIAce.cs
│   │   │       ├── KerisIIAce.cs
│   │   │       ├── KerisIIOrigin.cs
│   │   │       ├── KerisWireless.cs
│   │   │       ├── KerisWirelssAimpoint.cs
│   │   │       ├── Pugio.cs
│   │   │       ├── PugioII.cs
│   │   │       ├── SpathaX.cs
│   │   │       ├── StrixCarry.cs
│   │   │       ├── StrixEvolve.cs
│   │   │       ├── StrixImpact.cs
│   │   │       ├── StrixImpactII.cs
│   │   │       ├── StrixImpactIII.cs
│   │   │       ├── StrixImpactIIIWireless.cs
│   │   │       ├── StrixImpactIIWireless.cs
│   │   │       ├── TUFM3.cs
│   │   │       ├── TUFM4Air.cs
│   │   │       ├── TUFM4Wireless.cs
│   │   │       └── TUFM5.cs
│   │   └── PeripheralsProvider.cs
│   ├── Program.cs
│   ├── Properties/
│   │   ├── Resources.Designer.cs
│   │   ├── Resources.resx
│   │   ├── Settings.Designer.cs
│   │   ├── Settings.settings
│   │   ├── Strings.Designer.cs
│   │   ├── Strings.ar.resx
│   │   ├── Strings.da.resx
│   │   ├── Strings.de.resx
│   │   ├── Strings.es.resx
│   │   ├── Strings.fr.resx
│   │   ├── Strings.hu.resx
│   │   ├── Strings.id.resx
│   │   ├── Strings.it.resx
│   │   ├── Strings.ja.resx
│   │   ├── Strings.ko.resx
│   │   ├── Strings.lt.resx
│   │   ├── Strings.pl.resx
│   │   ├── Strings.pt-BR.resx
│   │   ├── Strings.pt-PT.resx
│   │   ├── Strings.resx
│   │   ├── Strings.ro.resx
│   │   ├── Strings.tr.resx
│   │   ├── Strings.uk.resx
│   │   ├── Strings.vi.resx
│   │   ├── Strings.zh-CN.resx
│   │   ├── Strings.zh-TW.resx
│   │   └── launchSettings.json
│   ├── Resources/
│   │   └── Font.otf
│   ├── Ryzen/
│   │   ├── OpenLibSys.cs
│   │   ├── RyzenControl.cs
│   │   ├── RyzenSmu.cs
│   │   └── SendCommand.cs
│   ├── Settings.Designer.cs
│   ├── Settings.cs
│   ├── Settings.resx
│   ├── UI/
│   │   ├── ControlHelper.cs
│   │   ├── CustomContextMenu.cs
│   │   ├── IconHelper.cs
│   │   ├── NumericUpDownWithUnit.cs
│   │   ├── RBadgeButton.cs
│   │   ├── RButton.cs
│   │   ├── RCheckBox.cs
│   │   ├── RComboBox.cs
│   │   ├── RForm.cs
│   │   ├── RForm.resx
│   │   └── Slider.cs
│   ├── USB/
│   │   ├── AsusHid.cs
│   │   ├── Aura.cs
│   │   └── XGM.cs
│   ├── Updates.Designer.cs
│   ├── Updates.cs
│   ├── Updates.resx
│   ├── WinRing0x64.sys
│   ├── app.manifest
│   └── global.json
├── crowdin.yml
└── docs/
    ├── README.ja-JP.md
    ├── README.md
    ├── README.zh-CN.md
    ├── _config.yml
    ├── _layouts/
    │   └── default.html
    ├── bloat.bat
    └── debloat.bat

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto

###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs     diff=csharp

###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following 
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln       merge=binary
#*.csproj    merge=binary
#*.vbproj    merge=binary
#*.vcxproj   merge=binary
#*.vcproj    merge=binary
#*.dbproj    merge=binary
#*.fsproj    merge=binary
#*.lsproj    merge=binary
#*.wixproj   merge=binary
#*.modelproj merge=binary
#*.sqlproj   merge=binary
#*.wwaproj   merge=binary

###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg   binary
#*.png   binary
#*.gif   binary

###############################################################################
# diff behavior for common document formats
# 
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the 
# entries below.
###############################################################################
#*.doc   diff=astextplain
#*.DOC   diff=astextplain
#*.docx  diff=astextplain
#*.DOCX  diff=astextplain
#*.dot   diff=astextplain
#*.DOT   diff=astextplain
#*.pdf   diff=astextplain
#*.PDF   diff=astextplain
#*.rtf   diff=astextplain
#*.RTF   diff=astextplain


================================================
FILE: .github/CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.

## Our Standards

Examples of behavior that contributes to a positive environment for our
community include:

* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
  and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
  overall community

Examples of unacceptable behavior include:

* The use of sexualized language or imagery, and sexual attention or
  advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
  address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Enforcement Responsibilities

Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.

Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.

## Scope

This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
.
All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the
reporter of any incident.

## Enforcement Guidelines

Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:

### 1. Correction

**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.

**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.

### 2. Warning

**Community Impact**: A violation through a single incident or series
of actions.

**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.

### 3. Temporary Ban

**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.

**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.

### 4. Permanent Ban

**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior,  harassment of an
individual, or aggression toward or disparagement of classes of individuals.

**Consequence**: A permanent ban from any sort of public interaction within
the community.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.

Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).

[homepage]: https://www.contributor-covenant.org

For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.


================================================
FILE: .github/CONTRIBUTING.md
================================================
Please, feel free to contribute. Especially if you own model differnt from G14 2022 and can offer extra features or support.


================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
custom: https://g-helper.com/support


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: Bug Report
description: Something isn't working correctly
body:
  - type: markdown
    attributes:
      value: |
        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!
  - type: checkboxes
    id: rules
    attributes:
      label: Rules
      options:
        - 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>.
          required: true
        - label: I understand that, if insufficient information or no app logs will be provided, my issue will be closed without an answer.
          required: true
    validations:
      required: true
  - type: textarea
    id: description
    attributes:
      label: What's wrong?
      description: Provide detailed description of what is wrong or does not work as expected.
      placeholder: Provide detailed description of what is wrong or does not work as expected.
    validations:
      required: true
  - type: textarea
    id: reproduce
    attributes:
      label: How to reproduce the bug?
      description: Describe how to reproduce the behavior. Be as specific as possible and provide as many details as possible.
      placeholder: |
        1. Go to '...'
        2. Click on '....'
        3. Scroll down to '....'
        4. See error
    validations:
      required: true
  - type: textarea
    id: logs
    attributes:
      label: Logs
      placeholder: Please drag and drop complete log file from ``%APPDATA%\GHelper\log.txt``
      description: Please drag and drop complete log file from ``%APPDATA%\GHelper\log.txt``
    validations:
      required: true
  - type: input
    id: device
    attributes:
      label: Device and Model
      description: Which laptop do you use?
      placeholder: e.g. Asus Zephyrus G14 GA404RK
    validations:
      required: true
  - type: textarea
    id: additional
    attributes:
      label: Additional information. 
      description: If applicable, add screenshots or other relevant information to help explain your problem.
  - type: dropdown
    id: armoury
    attributes:
      label: Armoury Crate
      description: Do you have Armoury Crate installed?
      options:
        - Uninstalled
        - Installed
        - Never installed
      default: 0   
  - type: input
    id: asus
    attributes:
      label: Asus Services
      description: How many Asus services do you have running (check ``Extra`` section in G-Helper)?
      placeholder: e.g. None
  - type: input
    id: version
    attributes:
      label: Version
      description: G-Helper version?
      placeholder: e.g. 0.146
  - type: input
    id: os
    attributes:
      label: OS
      description: Which operating system do you use?
      placeholder: e.g. Windows 11 21H2     
          


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: Feature request
description: Suggest an idea for this project
body:
  - type: checkboxes
    id: rules
    attributes:
      label: Rules
      options:
        - 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>.
          required: true
        - label: I understand that, if insufficient information will be provided, my issue will be closed without an answer.
          required: true
    validations:
      required: true
  - type: textarea
    id: description
    attributes:
      label: Is your feature request related to a problem? Please describe
      placeholder: A clear and concise description of what the problem is.
    validations:
      required: true
  - type: textarea
    id: solution
    attributes:
      label: Describe the solution you'd like
      placeholder: A clear and concise description of what you want to happen.
    validations:
      required: true
  - type: textarea
    id: alternatives
    attributes:
      label: Describe alternatives you've considered
      placeholder: A clear and concise description of any alternative solutions or features you've considered.
  - type: input
    id: device
    attributes:
      label: Device and Model
      description: Which laptop do you use?
      placeholder: e.g. Asus Zephyrus G14 GA404RK
    validations:
      required: true
  - type: textarea
    id: additional
    attributes:
      label: Additional information. 
      placeholder: If applicable, add screenshots or other relevant information          


================================================
FILE: .github/ISSUE_TEMPLATE/peripherals_request.yml
================================================
name: Mouse and other peripherals support request
description: Request support for a new device
body:
  - type: input
    id: device
    attributes:
      label: Mouse / peripheral model and version
      placeholder: e.g. Asus TUF M4 Wireless
    validations:
      required: true
  - type: textarea
    id: description
    attributes:
      label: Armoury Crate Screenshots
      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.
      placeholder: Drag and drop screenshots here
    validations:
      required: true
  - type: textarea
    id: solution
    attributes:
      label: USB Details
      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">
      placeholder: USB Tree View details
    validations:
      required: true
  - type: textarea
    id: additional
    attributes:
      label: Additional information. 
      placeholder: If applicable, add screenshots or other relevant information          


================================================
FILE: .github/SECURITY.md
================================================
# Security Policy

## Supported Versions

| Version | Supported          |
| ------- | ------------------ |
| 0.200+   | :white_check_mark: |
| < 0.200  | :x:                |

## Reporting a Vulnerability

Use this section to tell people how to report a vulnerability.

Tell them where to go, how often they can expect to get an update on a
reported vulnerability, what to expect if the vulnerability is accepted or
declined, etc.


================================================
FILE: .github/workflows/build.yml
================================================
name: Build

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]
  workflow_dispatch:

permissions:
  contents: read

jobs:
  build:
    runs-on: windows-2022
    steps:
    - uses: actions/checkout@v4
    - name: Setup dotnet
      uses: actions/setup-dotnet@v4
      with:
        dotnet-version: '8.0.x'
    - name: Build
      run: |
        dotnet build app/GHelper.sln


================================================
FILE: .github/workflows/codeql.yml
================================================
name: CodeQL

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]
  schedule:
  - cron: '34 18 * * 3'

permissions:
  actions: read
  contents: read
  security-events: write

jobs:
  codeql:
    runs-on: windows-2022
    steps:
    - uses: actions/checkout@v4
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v3
      with:
        languages: c#
    - name: Autobuild
      uses: github/codeql-action/autobuild@v3
    - name: Analyze
      uses: github/codeql-action/analyze@v3


================================================
FILE: .github/workflows/release.yml
================================================
name: Release

on:
  release:
    types: [ published ]
  workflow_dispatch:

permissions:
  contents: write
  id-token: write
  attestations: write

jobs:
  release:
    runs-on: windows-2022
    steps:
    - uses: actions/checkout@v4
    - name: Setup dotnet
      uses: actions/setup-dotnet@v4
      with:
        dotnet-version: '8.0.x'

    - name: Publish
      run: |
        dotnet publish app/GHelper.sln --configuration Release --runtime win-x64 -p:PublishSingleFile=true --no-self-contained

    - name: Upload unsigned EXE
      id: upload-unsigned
      uses: actions/upload-artifact@v4
      with:
        path: app/bin/x64/Release/net8.0-windows/win-x64/publish/GHelper.exe

    - id: sign-exe
      uses: signpath/github-action-submit-signing-request@v1.1
      with:
        api-token: ${{ secrets.SIGNPATH_API_TOKEN }}
        organization-id: ${{ secrets.SIGNPATH_ORG_ID }}
        project-slug: ${{ secrets.SIGNPATH_PROJECT }}
        signing-policy-slug: ${{ secrets.SIGNPATH_POLICY }}
        github-artifact-id: ${{ steps.upload-unsigned.outputs.artifact-id }}
        wait-for-completion: true
        output-artifact-directory: './signed'

    - name: Create ZIP from signed EXE
      run: powershell Compress-Archive ./signed/GHelper.exe ./signed/GHelper.zip

    - name: Upload signed EXE and ZIP
      env:
        GH_TOKEN: ${{ github.token }}
      run: |
        gh release upload "${{ github.event.release.tag_name }}" ./signed/GHelper.exe ./signed/GHelper.zip --clobber
    - name: Generate SLSA build provenance attestation
      uses: actions/attest-build-provenance@v2
      with:
        subject-path: |
          ./signed/GHelper.exe
          ./signed/GHelper.zip


================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore

# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Mono auto generated files
mono_crash.*

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Oo]ut/
[Ll]og/
[Ll]ogs/

# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

# Visual Studio 2017 auto generated files
Generated\ Files/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# Benchmark Results
BenchmarkDotNet.Artifacts/

# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/

# ASP.NET Scaffolding
ScaffoldingReadMe.txt

# StyleCop
StyleCopReport.xml

# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# Visual Studio Trace Files
*.e2e

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json

# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info

# Visual Studio code coverage results
*.coverage
*.coveragexml

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/

# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs

# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak

# SQL Server files
*.mdf
*.ldf
*.ndf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# Paket dependency manager
.paket/paket.exe
paket-files/

# FAKE - F# Make
.fake/

# CodeRush personal settings
.cr/personal

# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc

# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config

# Tabs Studio
*.tss

# Telerik's JustMock configuration file
*.jmconfig

# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs

# OpenCover UI analysis results
OpenCover/

# Azure Stream Analytics local run output
ASALocalRun/

# MSBuild Binary and Structured Log
*.binlog

# NVidia Nsight GPU debugger configuration file
*.nvuser

# MFractors (Xamarin productivity tool) working folder
.mfractor/

# Local History for Visual Studio
.localhistory/

# BeatPulse healthcheck temp database
healthchecksdb

# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/

# Ionide (cross platform F# VS Code tools) working folder
.ionide/

# Fody - auto-generated XML schema
FodyWeavers.xsd

================================================
FILE: LICENSE
================================================
                    GNU GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU General Public License is a free, copyleft license for
software and other kinds of works.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.  We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors.  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received.  You must make sure that they, too, receive
or can get the source code.  And you must show them these terms so they
know their rights.

  Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

  For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software.  For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

  Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so.  This is fundamentally incompatible with the aim of
protecting users' freedom to change the software.  The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable.  Therefore, we
have designed this version of the GPL to prohibit the practice for those
products.  If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.

  Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary.  To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Use with the GNU Affero General Public License.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

    <program>  Copyright (C) <year>  <name of author>
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.

  The GNU General Public License does not permit incorporating your program
into proprietary programs.  If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.  But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.


================================================
FILE: app/.editorconfig
================================================
[*.{cs,vb}]

# IDE0017: Simplify object initialization
dotnet_style_object_initializer = true


================================================
FILE: app/Ally/AllyControl.cs
================================================
using GHelper.Gpu.AMD;
using GHelper.Helpers;
using GHelper.Input;
using GHelper.Mode;
using GHelper.USB;
using HidSharp;
using System.Text;



namespace GHelper.Ally
{

    public enum ControllerMode : int
    {
        Auto = 0,
        Gamepad = 1,
        WASD = 2,
        Mouse = 3,
        Skip = -1,
    }

    public enum BindingZone : byte
    {
        DPadUpDown = 1,
        DPadLeftRight = 2,
        StickClick = 3,
        Bumper = 4,
        AB = 5,
        XY = 6,
        ViewMenu = 7,
        M1M2 = 8,
        Trigger = 9
    }

    public class AllyControl
    {
        static System.Timers.Timer timer = default!;
        static AmdGpuControl amdControl = new AmdGpuControl();

        SettingsForm settings;

        static ControllerMode _mode = ControllerMode.Auto;
        static ControllerMode _applyMode = ControllerMode.Mouse;

        static int _autoCount = 0;

        static int _upCount = 0;
        static int _downCount = 0;

        static int tdpMin = 6;
        static int tdpStable = tdpMin;
        static int tdpCurrent = -1;

        static bool autoTDP = false;

        static int fpsLimit = -1;


        public const string BindA = "01-01";
        public const string BindB = "01-02";
        public const string BindX = "01-03";
        public const string BindY = "01-04";
        public const string BindLB = "01-05";
        public const string BindRB = "01-06";
        public const string BindLS = "01-07";
        public const string BindRS = "01-08";
        public const string BindDU = "01-09";
        public const string BindDD = "01-0A";
        public const string BindDL = "01-0B";
        public const string BindDR = "01-0C";
        public const string BindVB = "01-11";
        public const string BindMB = "01-12";
        public const string BindM1 = "02-8F";
        public const string BindM2 = "02-8E";
        public const string BindLT = "01-0D";
        public const string BindRT = "01-0E";
        public const string BindXB = "01-13";

        public const string BindMouseL = "03-01";
        public const string BindMouseR = "03-02";

        public const string BindKBU = "02-98";
        public const string BindKBD = "02-99";
        public const string BindKBL = "02-9A";
        public const string BindKBR = "02-9B";

        public const string BindTab = "02-0D";
        public const string BindEnter = "02-5A";
        public const string BindBack = "02-66";
        public const string BindEsc = "02-76";

        public const string BindPgU = "02-96";
        public const string BindPgD = "02-97";

        public const string BindShift = "02-88";
        public const string BindCtrl = "02-8C";
        public const string BindAlt = "02-8A";
        public const string BindWin = "02-82";

        public const string BindTaskManager = "04-03-8C-88-76";
        public const string BindCloseWindow = "04-02-8A-0C";

        public const string BindBrightnessDown = "04-04-8C-88-8A-05";
        public const string BindBrightnessUp = "04-04-8C-88-8A-06";
        public const string BindXGM = "04-04-8C-88-8A-04";
        public const string BindToggleMode = "04-04-8C-88-8A-0C";
        public const string BindToggleFPSLimit = "04-04-8C-88-8A-01";
        public const string BindToggleTouchScreen = "04-04-8C-88-8A-0B";

        public const string BindOverlay = "04-03-8C-88-44";

        public const string BindShiftTab = "04-02-88-0D";
        public const string BindAltTab = "04-02-8A-0D";
        public const string BindWinTab = "04-02-82-0D";

        public const string BindVolUp = "05-03";
        public const string BindVolDown = "05-02";

        public const string BindPrintScrn = "02-C3";

        public const string BindScreenshot = "04-03-82-88-1B";
        public const string BindShowDesktop = "04-02-82-23";

        public const string BindShowKeyboard = "05-19";

        static byte[] CommandReady = new byte[] { AsusHid.INPUT_ID, 0xD1, 0x0A, 0x01 };
        static byte[] CommandSave = new byte[] { AsusHid.INPUT_ID, 0xD1, 0x0F, 0x20 };

        public static Dictionary<string, string> BindCodes = new Dictionary<string, string>
        {
            { "", "--------" },
            { "00-00", "[ Disabled ]" },

            { BindM1, "M1" },
            { BindM2, "M2" },

            { BindA, "A" },
            { BindB, "B" },

            { BindX, "X" },
            { BindY, "Y" },

            { BindLB, "Left Bumper" },
            { BindRB, "Right Bumper" },

            { BindLS, "Left Stick Click" },
            { BindRS, "Right Stick Click" },

            { BindDU, "DPad Up" },
            { BindDD, "DPad Down" },

            { BindDL, "DPad Left" },
            { BindDR, "DPad Right" },

            { BindVB, "View Button" },
            { BindMB, "Menu Button" },

            { BindXB, "XBox/Steam" },

            { BindToggleMode, "Controller Mode" },
            { BindToggleFPSLimit, "FPS Limit" },
            { BindToggleTouchScreen, "Toggle TouchScreen" },

            { BindVolUp, "Vol Up" },
            { BindVolDown, "Vol Down" },
            { BindBrightnessUp, "Bright Up" },
            { BindBrightnessDown, "Bright Down" },

            { BindShowKeyboard, "Show Keyboard" },
            { BindShowDesktop, "Show Desktop" },
            { BindScreenshot, "Screenshot" },

            { BindOverlay, "AMD Overlay" },
            { BindTaskManager, "Task Manager" },
            { BindCloseWindow, "Close Window" },
            { BindShiftTab, "Shift-Tab" },
            { BindAltTab, "Alt-Tab" },
            { BindWinTab, "Win-Tab" },
            { BindXGM, "XGM Toggle" },


            { BindEsc, "Esc" },
            { BindBack, "Backspace" },
            { BindTab, "Tab" },
            { BindEnter, "Enter" },
            { BindShift, "LShift" },
            { BindAlt, "LAlt" },
            { BindCtrl, "LCtl" },
            { BindWin, "WIN" },
            { BindPrintScrn, "PrntScn" },

            { BindPgU, "PgUp" },
            { BindPgD, "PgDwn" },
            { BindKBU, "UpArrow" },
            { BindKBD, "DownArrow" },
            { BindKBL, "LeftArrow" },
            { BindKBR, "RightArrow" },

            { "02-05", "F1" },
            { "02-06", "F2" },
            { "02-04", "F3" },
            { "02-0C", "F4" },
            { "02-03", "F5" },
            { "02-0B", "F6" },
            { "02-80", "F7" },
            { "02-0A", "F8" },
            { "02-01", "F9" },
            { "02-09", "F10" },
            { "02-78", "F11" },
            { "02-07", "F12" },
            { "02-0E", "`" },
            { "02-16", "1" },
            { "02-1E", "2" },
            { "02-26", "3" },
            { "02-25", "4" },
            { "02-2E", "5" },
            { "02-36", "6" },
            { "02-3D", "7" },
            { "02-3E", "8" },
            { "02-46", "9" },
            { "02-45", "0" },
            { "02-4E", "-" },
            { "02-55", "=" },
            { "02-15", "Q" },
            { "02-1D", "W" },
            { "02-24", "E" },
            { "02-2D", "R" },
            { "02-2C", "T" },
            { "02-35", "Y" },
            { "02-3C", "U" },
            { "02-44", "O" },
            { "02-4D", "P" },
            { "02-54", "[" },
            { "02-5B", "]" },
            { "02-5D", "|" },
            { "02-58", "Caps" },
            { "02-1C", "A" },
            { "02-1B", "S" },
            { "02-23", "D" },
            { "02-2B", "F" },
            { "02-34", "G" },
            { "02-33", "H" },
            { "02-3B", "J" },
            { "02-42", "k" },
            { "02-4B", "l" },
            { "02-4C", ";" },
            { "02-52", "'" },
            { "02-22", "X" },
            { "02-1A", "Z" },
            { "02-21", "C" },
            { "02-2A", "V" },
            { "02-32", "B" },
            { "02-31", "N" },
            { "02-3A", "M" },
            { "02-41", "," },
            { "02-49", "." },
            { "02-89", "RShift" },
            { "02-29", "Space" },
            { "02-8B", "RAlt" },
            { "02-84", "App menu" },
            { "02-8D", "RCtl" },
            { "02-7E", "ScrLk" },
            { "02-C2", "Insert" },
            { "02-C0", "Delete" },
            { "02-94", "Home" },
            { "02-95", "End" },
            { "02-77", "NumLock" },
            { "02-90", "NumSlash" },
            { "02-7C", "NumStar" },
            { "02-7B", "NumHyphen" },
            { "02-70", "Num0" },
            { "02-69", "Num1" },
            { "02-72", "Num2" },
            { "02-7A", "Num3" },
            { "02-6B", "Num4" },
            { "02-73", "Num5" },
            { "02-74", "Num6" },
            { "02-6C", "Num7" },
            { "02-75", "Num8" },
            { "02-7D", "Num9" },
            { "02-79", "NumPlus" },
            { "02-81", "NumEnter" },
            { "02-71", "NumPeriod" },

            { BindMouseL, "Mouse left click" },
            { BindMouseR, "Mouse right click" },
            { "03-03", "Mouse middle click" },
            { "03-04", "Mouse scroll up" },
            { "03-05", "Mouse scroll down" },

            //{ "05-16", "Screenshot" },
            //{ "05-1C", "Show desktop" },

            { "05-1E", "Begin recording" },
            { "05-01", "Mic off" },

        };

        public AllyControl(SettingsForm settingsForm)
        {
            if (!AppConfig.IsAlly()) return;
            settings = settingsForm;

            if (timer is null)
            {
                timer = new System.Timers.Timer(300);
                timer.Elapsed += Timer_Elapsed;
                Logger.WriteLine("Ally timer");
            }
        }

        private int GetMaxTDP()
        {
            int tdp = AppConfig.GetMode("limit_total");
            if (tdp > 0) return tdp;
            switch (Modes.GetCurrentBase())
            {
                case 1:
                    return 25;
                case 2:
                    return 10;
                default:
                    return 15;
            }
        }

        private int GetTDP()
        {
            if (tdpCurrent < 0) tdpCurrent = GetMaxTDP();
            return tdpCurrent;
        }

        private void SetTDP(int tdp, string log)
        {
            if (tdp < tdpStable) tdp = tdpStable;

            int max = GetMaxTDP();
            if (tdp > max) tdp = max;

            if (tdp == tdpCurrent) return;
            if (!autoTDP) return;

            Program.acpi.DeviceSet(AsusACPI.PPT_APUA0, tdp, log);
            Program.acpi.DeviceSet(AsusACPI.PPT_APUA3, tdp, null);
            Program.acpi.DeviceSet(AsusACPI.PPT_APUC1, tdp, null);

            tdpCurrent = tdp;
        }

        private void Timer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)
        {
            if (!autoTDP && _mode != ControllerMode.Auto) return;

            float fps = amdControl.GetFPS();
            int? usage = 0;

            if (autoTDP && fpsLimit > 0 && fpsLimit <= 120)
            {
                int power = (int)amdControl.GetGpuPower();
                //Debug.WriteLine($"{power}: {fps}");

                if (fps <= Math.Min(fpsLimit * 0.9, fpsLimit - 4)) _upCount++;
                else _upCount = 0;

                if (fps >= Math.Min(fpsLimit * 0.95, fpsLimit - 2)) _downCount++;
                else _downCount = 0;

                var tdp = GetTDP();
                if (_upCount >= 1)
                {
                    _downCount = 0;
                    _upCount = 0;
                    SetTDP(tdp + 1, $"AutoTDP+ [{power}]{fps}");
                }

                if (_downCount >= 8 && power < tdp)
                {
                    _upCount = 0;
                    _downCount--;
                    SetTDP(tdp - 1, $"AutoTDP- [{power}]{fps}");
                }
            }

            if (_mode == ControllerMode.Auto)
            {
                if (fps > 0) usage = amdControl.GetiGpuUse();
                ControllerMode newMode = (fps > 0 && usage > 15) ? ControllerMode.Gamepad : ControllerMode.Mouse;

                if (_applyMode != newMode) _autoCount++;
                else _autoCount = 0;

                if (_autoCount == 3)
                {
                    _autoCount = 0;
                    ApplyMode(newMode);
                    Logger.WriteLine($"Controller Mode (FPS={fps}, USAGE={usage}%): {newMode}");
                }
            }

        }

        public void ToggleAutoTDP()
        {
            autoTDP = !autoTDP;
            tdpCurrent = -1;

            if (!autoTDP)
            {
                Program.modeControl.SetPerformanceMode();
            }

            settings.VisualiseAutoTDP(autoTDP);

        }

        public void Init()
        {
            if (AppConfig.IsAlly()) settings.VisualiseAlly(true);
            else return;

            SetMode((ControllerMode)AppConfig.Get("controller_mode", (int)ControllerMode.Auto), true);

            settings.VisualiseBacklight(InputDispatcher.GetBacklight());

            fpsLimit = amdControl.GetFPSLimit();
            settings.VisualiseFPSLimit(fpsLimit);
        }

        public void ToggleFPSLimit(bool toast = false)
        {
            switch (fpsLimit)
            {
                case 30:
                    fpsLimit = 40;
                    break;
                case 40:
                    fpsLimit = 45;
                    break;
                case 45:
                    fpsLimit = 50;
                    break;
                case 50:
                    fpsLimit = 60;
                    break;
                case 60:
                    fpsLimit = 75;
                    break;
                case 75:
                    fpsLimit = 90;
                    break;
                case 90:
                    fpsLimit = 120;
                    break;
                case 120:
                    fpsLimit = 240;
                    break;
                default:
                    fpsLimit = 30;
                    break;
            }

            int result = amdControl.SetFPSLimit(fpsLimit);
            Logger.WriteLine($"FPS Limit {fpsLimit}: {result}");

            settings.VisualiseFPSLimit(fpsLimit);
            if (toast) Program.toast.RunToast("FPS Limit " + ((fpsLimit > 0 && fpsLimit <= 120) ? fpsLimit : "OFF"));

        }


        public void ToggleBacklight()
        {
            InputDispatcher.SetBacklight(4, true);
            settings.VisualiseBacklight(InputDispatcher.GetBacklight());
        }

        static private byte[] DecodeBinding(string binding = "")
        {
            byte[] bytes;

            if (binding == "" || binding is null) return new byte[2];

            try
            {
                bytes = AppConfig.StringToBytes(binding);
            }
            catch
            {
                return new byte[2];
            }

            byte[] code = new byte[10];
            code[0] = bytes[0];

            switch (bytes[0])
            {
                case 0x02:
                    code[2] = bytes[1];
                    break;
                case 0x03:
                    code[4] = bytes[1];
                    break;
                case 0x04:
                    bytes.Skip(1).ToArray().CopyTo(code, 5);
                    break;
                case 0x05:
                    code[3] = bytes[1];
                    break;
                default:
                    code[1] = bytes[1];
                    break;
            }

            return code;
        }

        static private void BindZone(BindingZone zone)
        {
            string KeyL1, KeyR1;
            string KeyL2, KeyR2;

            bool desktop = (_applyMode == ControllerMode.Mouse);

            switch (zone)
            {
                case BindingZone.DPadUpDown:
                    KeyL1 = AppConfig.GetString("bind_du", desktop ? BindKBU : BindDU);
                    KeyR1 = AppConfig.GetString("bind_dd", desktop ? BindKBD : BindDD);
                    KeyL2 = AppConfig.GetString("bind2_du", BindShowKeyboard);
                    KeyR2 = AppConfig.GetString("bind2_dd", BindShowDesktop);
                    break;
                case BindingZone.DPadLeftRight:
                    KeyL1 = AppConfig.GetString("bind_dl", desktop ? BindKBL : BindDL);
                    KeyR1 = AppConfig.GetString("bind_dr", desktop ? BindKBR : BindDR);
                    KeyL2 = AppConfig.GetString("bind2_dl", BindBrightnessDown);
                    KeyR2 = AppConfig.GetString("bind2_dr", BindBrightnessUp);
                    break;
                case BindingZone.StickClick:
                    KeyL1 = AppConfig.GetString("bind_ls", desktop ? BindShift : BindLS);
                    KeyR1 = AppConfig.GetString("bind_rs", desktop ? BindMouseL : BindRS);
                    KeyL2 = AppConfig.GetString("bind2_ls");
                    KeyR2 = AppConfig.GetString("bind2_rs", BindToggleMode);
                    break;
                case BindingZone.Bumper:
                    KeyL1 = AppConfig.GetString("bind_lb", desktop ? BindTab : BindLB);
                    KeyR1 = AppConfig.GetString("bind_rb", desktop ? BindMouseL : BindRB);
                    KeyL2 = AppConfig.GetString("bind2_lb");
                    KeyR2 = AppConfig.GetString("bind2_rb");
                    break;
                case BindingZone.AB:
                    KeyL1 = AppConfig.GetString("bind_a", desktop ? BindEnter : BindA);
                    KeyR1 = AppConfig.GetString("bind_b", desktop ? BindEsc : BindB);
                    KeyL2 = AppConfig.GetString("bind2_a");
                    KeyR2 = AppConfig.GetString("bind2_b");
                    break;
                case BindingZone.XY:
                    KeyL1 = AppConfig.GetString("bind_x", desktop ? BindPgD : BindX);
                    KeyR1 = AppConfig.GetString("bind_y", desktop ? BindPgU : BindY);
                    KeyL2 = AppConfig.GetString("bind2_x", BindScreenshot);
                    KeyR2 = AppConfig.GetString("bind2_y", BindOverlay);
                    break;
                case BindingZone.ViewMenu:
                    KeyL1 = AppConfig.GetString("bind_vb", BindVB);
                    KeyR1 = AppConfig.GetString("bind_mb", BindMB);
                    KeyL2 = AppConfig.GetString("bind2_vb");
                    KeyR2 = AppConfig.GetString("bind2_mb");
                    break;
                case BindingZone.M1M2:
                    KeyL1 = AppConfig.GetString("bind_m2", BindM2);
                    KeyR1 = AppConfig.GetString("bind_m1", BindM1);
                    KeyL2 = AppConfig.GetString("bind2_m2", BindM2);
                    KeyR2 = AppConfig.GetString("bind2_m1", BindM1);
                    break;
                default:
                    KeyL1 = AppConfig.GetString("bind_lt", desktop ? BindShiftTab : BindLT);
                    KeyR1 = AppConfig.GetString("bind_rt", desktop ? BindMouseR : BindRT);
                    KeyL2 = AppConfig.GetString("bind2_lt");
                    KeyR2 = AppConfig.GetString("bind2_rt");
                    break;
            }

            if (KeyL1 == "" && KeyR1 == "") return;

            byte[] bindings = new byte[50];
            byte[] init = new byte[] { AsusHid.INPUT_ID, 0xd1, 0x02, (byte)zone, 0x2c };

            init.CopyTo(bindings, 0);

            DecodeBinding(KeyL1).CopyTo(bindings, 5);
            DecodeBinding(KeyL2).CopyTo(bindings, 16);

            DecodeBinding(KeyR1).CopyTo(bindings, 27);
            DecodeBinding(KeyR2).CopyTo(bindings, 38);

            //AsusHid.WriteInput(CommandReady, null);
            AsusHid.WriteInput(bindings, null);

        }

        static void WakeUp()
        {
            AsusHid.WriteInput(Encoding.ASCII.GetBytes("ZASUS Tech.Inc."), "Init");
        }

        static public void SetDeadzones()
        {
            AsusHid.WriteInput(new byte[] { AsusHid.INPUT_ID, 0xd1, 4, 4,
                (byte)AppConfig.Get("ls_min", 0),
                (byte)AppConfig.Get("ls_max", 100),
                (byte)AppConfig.Get("rs_min", 0),
                (byte)AppConfig.Get("rs_max", 100)
            }, null);

            AsusHid.WriteInput(new byte[] { AsusHid.INPUT_ID, 0xd1, 5, 4,
                (byte)AppConfig.Get("lt_min", 0),
                (byte)AppConfig.Get("lt_max", 100),
                (byte)AppConfig.Get("rt_min", 0),
                (byte)AppConfig.Get("rt_max", 100)
            }, null);

            AsusHid.WriteInput(new byte[] { AsusHid.INPUT_ID, 0xd1, 6, 2,
                (byte)AppConfig.Get("vibra", 100),
                (byte)AppConfig.Get("vibra", 100)
            }, null);

        }

        public static void DisableXBoxController(bool disabled)
        {
            AsusHid.WriteInput([AsusHid.INPUT_ID, 0xD1, 0x0B, 0x01, disabled ? (byte)0x02 : (byte)0x01], $"ControllerDisabled: {disabled}");
        }

        public static void ApplyMode(ControllerMode applyMode = ControllerMode.Auto, bool init = false)
        {
            Task.Run(() =>
            {

                if (applyMode == ControllerMode.Skip) return;

                HidStream? input = AsusHid.FindHidStream(AsusHid.INPUT_ID);
                int count = 0;

                while (input == null && count++ < 10)
                {
                    input = AsusHid.FindHidStream(AsusHid.INPUT_ID);
                    Thread.Sleep(500);
                }

                if (input == null)
                {
                    Logger.WriteLine($"Controller not found");
                    return;
                }

                if (applyMode != ControllerMode.Auto) _applyMode = applyMode;

                if (init)
                {
                    WakeUp();
                    InputDispatcher.SetBacklightAuto();
                }

                AsusHid.WriteInput([AsusHid.INPUT_ID, 0xD1, 0x01, 0x01, (byte)_applyMode], "Controller");
                //AsusHid.WriteInput(CommandSave, null);

                BindZone(BindingZone.M1M2);
                BindZone(BindingZone.DPadUpDown);
                BindZone(BindingZone.DPadLeftRight);
                BindZone(BindingZone.StickClick);
                BindZone(BindingZone.Bumper);
                BindZone(BindingZone.AB);
                BindZone(BindingZone.XY);
                BindZone(BindingZone.ViewMenu);
                BindZone(BindingZone.Trigger);

                AsusHid.WriteInput(CommandSave, null);

                SetDeadzones();

                if (init && AppConfig.Is("controller_disabled"))
                {
                    Thread.Sleep(500);
                    DisableXBoxController(false);
                    DisableXBoxController(true);
                }

            });
        }

        private void SetMode(ControllerMode mode, bool init = false)
        {

            _mode = mode;
            AppConfig.Set("controller_mode", (int)mode);

            amdControl.StopFPS();
            ApplyMode(mode, init);

            amdControl.StartFPS();
            timer.Start();

            settings.VisualiseController(mode);
        }


        public void ToggleModeHotkey()
        {
            if (_applyMode == ControllerMode.Gamepad)
            {
                SetMode(ControllerMode.Mouse);
                Program.toast.RunToast("Mouse", ToastIcon.Controller);
            }
            else
            {
                SetMode(ControllerMode.Gamepad);
                Program.toast.RunToast("Gamepad", ToastIcon.Controller);
            }
        }

        public void ToggleMode()
        {
            switch (_mode)
            {
                case ControllerMode.Auto:
                    SetMode(ControllerMode.Gamepad);
                    break;
                case ControllerMode.Gamepad:
                    SetMode(ControllerMode.Mouse);
                    break;
                case ControllerMode.Mouse:
                    SetMode(ControllerMode.Skip);
                    break;
                case ControllerMode.Skip:
                    SetMode(ControllerMode.Auto);
                    break;
            }
        }

    }
}


================================================
FILE: app/AnimeMatrix/AniMatrixControl.cs
================================================
using NAudio.CoreAudioApi;
using NAudio.Wave;
using System.Diagnostics;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Timers;

namespace GHelper.AnimeMatrix
{

    public class AniMatrixControl : NAudio.CoreAudioApi.Interfaces.IMMNotificationClient
    {

        SettingsForm settings;

        System.Timers.Timer matrixTimer = default!;
        System.Timers.Timer slashTimer = default!;

        public AnimeMatrixDevice? deviceMatrix;
        public SlashDevice? deviceSlash;

        public static bool lidClose = false;
        private static bool _wakeUp = false;

        double[]? AudioValues;
        WasapiCapture? AudioDevice;
        string? AudioDeviceId;
        private MMDeviceEnumerator? AudioDeviceEnum;

        private readonly object _audioLock = new();
        private volatile bool _listeningToAudio;
        private volatile bool _stoppingAudio;

        public bool IsValid => deviceMatrix != null || deviceSlash != null;
        public bool IsSlash => deviceSlash != null;

        private long lastPresent;
        private List<double> maxes = new List<double>();
        
        private int slashBrightness = 0;
        private SlashMode slashMode;

        public AniMatrixControl(SettingsForm settingsForm)
        {
            settings = settingsForm;
            if (!AppConfig.IsSlash() && !AppConfig.IsAnimeMatrix()) return;
            
            try
            {
                if (AppConfig.IsSlash())
                {
                    if (AppConfig.IsSlashAura())
                        deviceSlash = new SlashDeviceAura();
                    else
                        deviceSlash = new SlashDevice();
                }
                else
                {
                    deviceMatrix = new AnimeMatrixDevice();
                }

                matrixTimer = new System.Timers.Timer(100);
                matrixTimer.Elapsed += MatrixTimer_Elapsed;

            }
            catch (Exception ex)
            {
                Logger.WriteLine(ex.Message);
            }

        }

        public void SetDevice(bool wakeUp = false)
        {
            if (deviceMatrix is not null) SetMatrix(wakeUp);
            if (deviceSlash is not null) SetSlash(wakeUp);
        }

        public void SetSlash(bool wakeUp = false)
        {
            if (deviceSlash is null) return;

            int brightness = AppConfig.Get("matrix_brightness", 0);
            int running = AppConfig.Get("matrix_running", 0);
            int inteval = AppConfig.Get("matrix_interval", 0);

            bool auto = AppConfig.Is("matrix_auto");
            bool lid = AppConfig.Is("matrix_lid");

            StopAudio();

            Task.Run(() =>
            {
                try
                {
                    deviceSlash.SetProvider();
                }
                catch (Exception ex)
                {
                    Logger.WriteLine(ex.Message);
                    return;
                }

                if (wakeUp) _wakeUp = true;

                if (brightness == 0 || (auto && SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Online) || (lid && lidClose))
                {
                    deviceSlash.SetSleepActive(false);
                    deviceSlash.SetEnabled(false);
                    //deviceSlash.Init();
                    //deviceSlash.SetOptions(false, 0, 0);
                }
                else
                {
                    if (_wakeUp)
                    {
                        deviceSlash.WakeUp();
                        _wakeUp = false;
                    }

                    deviceSlash.SetEnabled(true);
                    deviceSlash.Init();

                    switch ((SlashMode)running)
                    {
                        case SlashMode.Static:
                            var custom = AppConfig.GetString("slash_custom");
                            if (custom is not null && custom.Length > 0)
                            {
                                Logger.WriteLine("Slash: Static");
                                deviceSlash.SetCustom(AppConfig.StringToBytes(custom));
                            }
                            else
                            {
                                deviceSlash.SetMode((SlashMode)running);
                                deviceSlash.SetOptions(true, brightness, inteval);
                                deviceSlash.Save();
                            }
                            break;
                        case SlashMode.BatteryLevel:
                            // call tick to immediately update the pattern
                            Logger.WriteLine("Slash: Battery Level");
                            SlashTimer_start();
                            SlashTimer_tick();
                            break;
                        case SlashMode.Audio:
                        case SlashMode.AudioSpectrum:
                            slashMode = (SlashMode)running;
                            Logger.WriteLine("Slash: Audio");
                            SetAudio();
                            break;
                        default:
                            deviceSlash.SetMode((SlashMode)running);
                            deviceSlash.SetOptions(true, brightness, inteval);
                            deviceSlash.Save();
                            break;
                    }

                    // kill the timer if we are not displaying battery pattern

                    deviceSlash.SetSleepActive(AppConfig.IsNotFalse("slash_sleep"));
                }
            });
        }

        public void SetLidMode(bool force = false)
        {
            bool matrixLid = AppConfig.Is("matrix_lid");

            if (deviceSlash is not null)
            {
                deviceSlash.SetLidCloseAnimation(!matrixLid && !AppConfig.Is("slash_sleep"));
            }

            if (matrixLid || force)
            {
                Logger.WriteLine($"Matrix LidClosed: {lidClose}");
                SetDevice(true);
            }
        }

        public void SetBatteryAuto()
        {
            if (deviceSlash is not null)
            {
                bool auto = AppConfig.Is("matrix_auto");
                deviceSlash.SetBatterySaver(auto);
                if (!auto) SetSlash();
            }

            if (deviceMatrix is not null) SetMatrix();
        }

        public void SetMatrix(bool wakeUp = false)
        {

            if (deviceMatrix is null) return;

            int brightness = AppConfig.Get("matrix_brightness", 0);
            int running = AppConfig.Get("matrix_running", 0);
            bool auto = AppConfig.Is("matrix_auto");
            bool lid = AppConfig.Is("matrix_lid");

            StopMatrixTimer();
            StopAudio();

            Task.Run(() =>
            {
                try
                {
                    deviceMatrix.SetProvider();
                }
                catch (Exception ex)
                {
                    Logger.WriteLine(ex.Message);
                    return;
                }

                if (wakeUp) deviceMatrix.WakeUp();

                if (brightness == 0 || (auto && SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Online) || (lid && lidClose))
                {
                    deviceMatrix.SetDisplayState(false);
                    deviceMatrix.SetDisplayState(false); // some devices are dumb
                    Logger.WriteLine("Matrix Off");
                }
                else
                {
                    if (wakeUp) deviceMatrix.WakeUp();
                    deviceMatrix.SetDisplayState(true);
                    deviceMatrix.SetBrightness((BrightnessMode)brightness);

                    switch (running)
                    {
                        case 2:
                            SetMatrixPicture(AppConfig.GetString("matrix_picture"), false);
                            break;
                        case 3:
                            SetMatrixClock();
                            break;
                        case 4:
                            SetAudio();
                            break;
                        default:
                            SetBuiltIn(running);
                            break;
                    }

                }
            });


        }

        private void SetBuiltIn(int running)
        {
            BuiltInAnimation animation = new BuiltInAnimation(
                (BuiltInAnimation.Running)running,
                (BuiltInAnimation.Sleeping)AppConfig.Get("matrix_sleep", (int)BuiltInAnimation.Sleeping.Starfield),
                (BuiltInAnimation.Shutdown)AppConfig.Get("matrix_shutdown", (int)BuiltInAnimation.Shutdown.SeeYa),
                (BuiltInAnimation.Startup)AppConfig.Get("matrix_startup", (int)BuiltInAnimation.Startup.StaticEmergence)
            );
            deviceMatrix.SetBuiltInAnimation(true, animation);
            Logger.WriteLine("Matrix builtin: " + animation.AsByte);
        }

        private void StartMatrixTimer(int interval = 100)
        {
            matrixTimer.Interval = interval;
            matrixTimer.Start();
        }

        private void StopMatrixTimer()
        {
            matrixTimer.Stop();
        }

        private void MatrixTimer_Elapsed(object? sender, ElapsedEventArgs e)
        {

            if (deviceMatrix is null) return;

            switch (AppConfig.Get("matrix_running"))
            {
                case 2:
                    deviceMatrix.PresentNextFrame();
                    break;
                case 3:
                    deviceMatrix.PresentClock();
                    break;
            }

        }

        public void SetMatrixClock()
        {
            deviceMatrix.SetBuiltInAnimation(false);
            StartMatrixTimer(1000);
            Logger.WriteLine("Matrix Clock");
        }


        private void SlashTimer_start(int interval = 180000)
        {
            // 100% to 0% in 1hr = 1% every 36 seconds
            // 1 bracket every 14.2857 * 36s = 514s ~ 8m 30s
            // only ~5 actually distinguishable levels, so refresh every <= 514/5 ~ 100s
            // default is 60s

            // create the timer if first call
            // this way, the timer only spawns if user tries to use battery pattern
            if (slashTimer == default(System.Timers.Timer))
            {
                slashTimer = new System.Timers.Timer(interval);
                slashTimer.Elapsed += SlashTimer_elapsed;
                slashTimer.AutoReset = true;
            }
            // only write if interval changed
            if (slashTimer.Interval != interval)
            {
                slashTimer.Interval = interval;
            }

            slashTimer.Start();
        }

        private void SlashTimer_elapsed(object? sender, ElapsedEventArgs e)
        {
            SlashTimer_tick();
        }

        private void SlashTimer_tick()
        {
            if (deviceSlash is null) return;

            //kill timer if called but not in battery pattern mode
            if ((SlashMode)AppConfig.Get("matrix_running", 0) != SlashMode.BatteryLevel)
            {
                slashTimer.Stop();
                slashTimer.Dispose();
                return;
            }

            deviceSlash.SetBatteryPattern(AppConfig.Get("matrix_brightness", 0));
        }


        public void Dispose()
        {
            StopAudio();
        }

        void StopAudio()
        {
            lock (_audioLock)
            {
                _stoppingAudio = true;
                _listeningToAudio = false;

                if (AudioDeviceEnum is not null)
                {
                    try
                    {
                        AudioDeviceEnum.UnregisterEndpointNotificationCallback(this);
                    }
                    catch (Exception ex)
                    {
                        Logger.WriteLine("UnregisterEndpointNotificationCallback failed: " + ex);
                    }
                }

                if (AudioDevice is not null)
                {
                    try
                    {
                        AudioDevice.DataAvailable -= WaveIn_DataAvailable;
                        AudioDevice.StopRecording();
                        AudioDevice.Dispose();
                    }
                    catch (Exception ex)
                    {
                        Logger.WriteLine(ex.ToString());
                    }

                    AudioDevice = null;
                }

                AudioDeviceId = null;

                if (AudioDeviceEnum is not null)
                {
                    try { AudioDeviceEnum.Dispose(); } catch { /* ignore */ }
                    AudioDeviceEnum = null;
                }

                _stoppingAudio = false;
            }
        }

        void SetAudio()
        {
            if (deviceMatrix is not null) deviceMatrix.SetBuiltInAnimation(false);
            else if (deviceSlash is not null) deviceSlash.SetEmpty();
            else return;

            StopAudio();
            slashBrightness = AppConfig.Get("matrix_brightness", 0);

            lock (_audioLock)
            {
                _stoppingAudio = false;
                _listeningToAudio = true;

                try
                {
                    AudioDeviceEnum = new MMDeviceEnumerator();
                    AudioDeviceEnum.RegisterEndpointNotificationCallback(this);

                    using (MMDevice device = AudioDeviceEnum.GetDefaultAudioEndpoint(DataFlow.Render, Role.Console))
                    {
                        AudioDevice = new WasapiLoopbackCapture(device);
                        AudioDeviceId = device.ID;

                        var fmt = AudioDevice.WaveFormat;
                        AudioValues = new double[fmt.SampleRate / 1000];

                        AudioDevice.DataAvailable += WaveIn_DataAvailable;
                        AudioDevice.StartRecording();
                    }

                    Logger.WriteLine("Subscribed to Audio");
                }
                catch (Exception ex)
                {
                    Logger.WriteLine(ex.ToString());
                    _listeningToAudio = false;
                }
            }
        }

        private void WaveIn_DataAvailable(object? sender, WaveInEventArgs e)
        {
            int bytesPerSamplePerChannel = AudioDevice.WaveFormat.BitsPerSample / 8;
            int bytesPerSample = bytesPerSamplePerChannel * AudioDevice.WaveFormat.Channels;
            int bufferSampleCount = e.Buffer.Length / bytesPerSample;

            if (bufferSampleCount >= AudioValues.Length)
            {
                bufferSampleCount = AudioValues.Length;
            }

            if (bytesPerSamplePerChannel == 2 && AudioDevice.WaveFormat.Encoding == WaveFormatEncoding.Pcm)
            {
                for (int i = 0; i < bufferSampleCount; i++)
                    AudioValues[i] = BitConverter.ToInt16(e.Buffer, i * bytesPerSample);
            }
            else if (bytesPerSamplePerChannel == 4 && AudioDevice.WaveFormat.Encoding == WaveFormatEncoding.Pcm)
            {
                for (int i = 0; i < bufferSampleCount; i++)
                    AudioValues[i] = BitConverter.ToInt32(e.Buffer, i * bytesPerSample);
            }
            else if (bytesPerSamplePerChannel == 4 && AudioDevice.WaveFormat.Encoding == WaveFormatEncoding.IeeeFloat)
            {
                for (int i = 0; i < bufferSampleCount; i++)
                    AudioValues[i] = BitConverter.ToSingle(e.Buffer, i * bytesPerSample);
            }

            double[] paddedAudio = FftSharp.Pad.ZeroPad(AudioValues);
            var fft = FftSharp.FFT.Forward(paddedAudio);
            double[] fftMag = FftSharp.FFT.Magnitude(fft);

            PresentAudio(fftMag);
        }

        void PresentAudio(double[] audio)
        {

            if (deviceMatrix is null && deviceSlash is null) return;

            if (Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastPresent) < 30)   return;
            lastPresent = DateTimeOffset.Now.ToUnixTimeMilliseconds();

            int size = 20;
            double[] bars = new double[size];
            double max = 2, maxAverage;

            for (int i = 0; i < size; i++)
            {
                bars[i] = Math.Sqrt(audio[i] * 10000);
                if (bars[i] > max) max = bars[i];
            }

            maxes.Add(max);
            if (maxes.Count > 20) maxes.RemoveAt(0);
            maxAverage = maxes.Average();

            if (deviceMatrix is not null)
            {
                deviceMatrix.Clear();
                for (int i = 0; i < size; i++) deviceMatrix.DrawBar(20 - i, bars[i] * 20 / maxAverage);
                deviceMatrix.Present();
            }

            if (deviceSlash is not null)
            {
                if (slashMode == SlashMode.Audio)
                {
                    var bassLevel = 30 * (bars[0] + bars[1]) / maxAverage;
                    deviceSlash.SetAudioPattern(slashBrightness, bassLevel, 10 * (bars[3] + bars[4] + bars[5] + bars[6]) / maxAverage);
                    //Program.settingsForm.VisualiseAudio(bassLevel);
                } 
                else
                {
                    var payload = new byte[7];
                    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));
                    deviceSlash.ContinueCustom(payload, null);
                }
            }
        }

        public void OpenMatrixPicture()
        {
            string fileName = null;

            Thread t = new Thread(() =>
            {
                OpenFileDialog of = new OpenFileDialog();
                of.Filter = "Image Files (*.bmp;*.jpg;*.jpeg,*.png,*.gif)|*.BMP;*.JPG;*.JPEG;*.PNG;*.GIF";
                if (of.ShowDialog() == DialogResult.OK)
                {
                    fileName = of.FileName;
                }
                return;
            });

            t.SetApartmentState(ApartmentState.STA);
            t.Start();
            t.Join();

            if (fileName is not null)
            {
                AppConfig.Set("matrix_picture", fileName);
                AppConfig.Set("matrix_running", 2);

                SetMatrixPicture(fileName);
                settings.VisualiseMatrixRunning(2);

            }

        }

        public void SetMatrixPicture(string fileName, bool visualise = true)
        {

            if (deviceMatrix is null) return;

            StopMatrixTimer();

            try
            {
                using (var fs = new FileStream(fileName, FileMode.Open))
                //using (var ms = new MemoryStream())
                {
                    /*
                    ms.SetLength(0);
                    fs.CopyTo(ms);
                    ms.Position = 0;
                    */
                    using (Image image = Image.FromStream(fs))
                    {
                        ProcessPicture(image);
                        Logger.WriteLine("Matrix " + fileName);
                    }

                    fs.Close();
                    if (visualise) settings.VisualiseMatrixPicture(fileName);
                }
            }
            catch
            {
                Debug.WriteLine("Error loading picture");
                return;
            }

        }

        protected void ProcessPicture(Image image)
        {
            deviceMatrix.SetBuiltInAnimation(false);
            deviceMatrix.ClearFrames();

            int matrixX = AppConfig.Get("matrix_x", 0);
            int matrixY = AppConfig.Get("matrix_y", 0);

            int matrixZoom = AppConfig.Get("matrix_zoom", 100);
            int matrixContrast = AppConfig.Get("matrix_contrast", 100);
            int matrixGamma = AppConfig.Get("matrix_gamma", 0);

            int matrixSpeed = AppConfig.Get("matrix_speed", 50);

            MatrixRotation rotation = (MatrixRotation)AppConfig.Get("matrix_rotation", 0);

            InterpolationMode matrixQuality = (InterpolationMode)AppConfig.Get("matrix_quality", 0);


            FrameDimension dimension = new FrameDimension(image.FrameDimensionsList[0]);
            int frameCount = image.GetFrameCount(dimension);

            if (frameCount > 1)
            {
                var delayPropertyBytes = image.GetPropertyItem(0x5100).Value;
                var frameDelay = BitConverter.ToInt32(delayPropertyBytes) * 10;

                for (int i = 0; i < frameCount; i++)
                {
                    image.SelectActiveFrame(dimension, i);

                    if (rotation == MatrixRotation.Planar)
                        deviceMatrix.GenerateFrame(image, matrixZoom, matrixX, matrixY, matrixQuality, matrixContrast, matrixGamma);
                    else
                        deviceMatrix.GenerateFrameDiagonal(image, matrixZoom, matrixX, matrixY, matrixQuality, matrixContrast, matrixGamma);

                    deviceMatrix.AddFrame();
                }


                Logger.WriteLine("GIF Delay:" + frameDelay);
                StartMatrixTimer(Math.Max(matrixSpeed, frameDelay));

                //image.SelectActiveFrame(dimension, 0);

            }
            else
            {
                if (rotation == MatrixRotation.Planar)
                    deviceMatrix.GenerateFrame(image, matrixZoom, matrixX, matrixY, matrixQuality, matrixContrast, matrixGamma);
                else
                    deviceMatrix.GenerateFrameDiagonal(image, matrixZoom, matrixX, matrixY, matrixQuality, matrixContrast, matrixGamma);

                deviceMatrix.Present();
            }

        }

        public void OnDeviceStateChanged(string deviceId, DeviceState newState)
        {

        }

        public void OnDeviceAdded(string pwstrDeviceId)
        {

        }

        public void OnDeviceRemoved(string deviceId)
        {

        }

        public void OnDefaultDeviceChanged(DataFlow flow, Role role, string defaultDeviceId)
        {
            if (!_listeningToAudio) return;
            if (_stoppingAudio) return;

            int running = AppConfig.Get("matrix_running");
            if (flow != DataFlow.Render || role != Role.Console || running != 4) return;

            var currentId = AudioDeviceId;
            if (!string.IsNullOrEmpty(currentId) && currentId == defaultDeviceId) return;

            //Restart audio if default audio changed
            Logger.WriteLine("Matrix Audio: Default Output changed to " + defaultDeviceId);

            //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.
            AudioDeviceId = defaultDeviceId;

            Task.Delay(50).ContinueWith(_ =>
            {
                if (!_listeningToAudio) return;
                SetMatrix();
            });
        }

        public void OnPropertyValueChanged(string pwstrDeviceId, PropertyKey key)
        {

        }
    }
}


================================================
FILE: app/AnimeMatrix/AnimeMatrixDevice.cs
================================================
// Source thanks to https://github.com/vddCore/Starlight with some adjustments from me

using GHelper.AnimeMatrix.Communication;
using System.Drawing.Drawing2D;
using System.Drawing.Text;
using System.Text;

namespace GHelper.AnimeMatrix
{
    public class BuiltInAnimation
    {
        public enum Startup
        {
            GlitchConstruction,
            StaticEmergence
        }

        public enum Shutdown
        {
            GlitchOut,
            SeeYa
        }

        public enum Sleeping
        {
            BannerSwipe,
            Starfield
        }

        public enum Running
        {
            BinaryBannerScroll,
            RogLogoGlitch
        }

        public byte AsByte { get; }

        public BuiltInAnimation(
            Running running,
            Sleeping sleeping,
            Shutdown shutdown,
            Startup startup
        )
        {
            AsByte |= (byte)(((int)running & 0x01) << 0);
            AsByte |= (byte)(((int)sleeping & 0x01) << 1);
            AsByte |= (byte)(((int)shutdown & 0x01) << 2);
            AsByte |= (byte)(((int)startup & 0x01) << 3);
        }
    }

    public enum MatrixRotation
    {
        Planar,
        Diagonal
    }

    internal class AnimeMatrixPacket : Packet
    {
        public AnimeMatrixPacket(byte[] command)
            : base(0x5E, 640, command)
        {
        }
    }

    public enum AnimeType
    {
        GA401,
        GA402,
        GU604,
        STRIX
    }


    public enum BrightnessMode : byte
    {
        Off = 0,
        Dim = 1,
        Medium = 2,
        Full = 3
    }


    public class AnimeMatrixDevice : Device
    {
        int UpdatePageLength = 490;
        int LedCount = 1450;

        byte[] _displayBuffer;
        List<byte[]> frames = new List<byte[]>();

        public int MaxRows = 61;
        public int MaxColumns = 34;
        public int LedStart = 0;
        public int FullRows = 11;

        private int frameIndex = 0;

        private static AnimeType _model = AnimeType.GA402;

        [System.Runtime.InteropServices.DllImport("gdi32.dll")]
        private static extern IntPtr AddFontMemResourceEx(IntPtr pbFont, uint cbFont, IntPtr pdv, [System.Runtime.InteropServices.In] ref uint pcFonts);
        private PrivateFontCollection fonts = new PrivateFontCollection();

        public AnimeMatrixDevice() : base(0x0B05, 0x193B, 640)
        {
            if (AppConfig.ContainsModel("401"))
            {
                _model = AnimeType.GA401;
                MaxColumns = 33;
                MaxRows = 55;
                LedCount = 1245;
                UpdatePageLength = 410;
                FullRows = 5;
                LedStart = 1;
            }

            if (AppConfig.ContainsModel("GU604"))
            {
                _model = AnimeType.GU604;
                MaxColumns = 39;
                MaxRows = 92;
                LedCount = 1711;
                UpdatePageLength = 630;
                FullRows = 9;
            }

            if (AppConfig.ContainsModel("G635") || AppConfig.ContainsModel("G615") || AppConfig.ContainsModel("G835") || AppConfig.ContainsModel("G815"))
            {
                _model = AnimeType.STRIX;
                MaxColumns = 34;
                MaxRows = 68;
                LedCount = 810;
                UpdatePageLength = 490;
                FullRows = 29;
            }

            _displayBuffer = new byte[LedCount];

            LoadMFont();

        }

        public void WakeUp()
        {
            Set(Packet<AnimeMatrixPacket>(Encoding.ASCII.GetBytes("ASUS Tech.Inc.")));
        }

        public void SetBrightness(BrightnessMode mode)
        {
            Set(Packet<AnimeMatrixPacket>(0xC0, 0x04, (byte)mode));
        }

        public void SetDisplayState(bool enable)
        {
            Set(Packet<AnimeMatrixPacket>(0xC3, 0x01, enable ? (byte)0x00 : (byte)0x80));
        }

        public void SetBuiltInAnimation(bool enable)
        {
            Set(Packet<AnimeMatrixPacket>(0xC4, 0x01, enable ? (byte)0x00 : (byte)0x80));
        }

        public void SetBuiltInAnimation(bool enable, BuiltInAnimation animation)
        {
            SetBuiltInAnimation(enable);
            Set(Packet<AnimeMatrixPacket>(0xC5, animation.AsByte));
        }

        public void Present()
        {

            int page = 0;
            int start, end;

            while (page * UpdatePageLength < LedCount)
            {
                start = page * UpdatePageLength;
                end = Math.Min(LedCount, (page + 1) * UpdatePageLength);

                Set(Packet<AnimeMatrixPacket>(0xC0, 0x02)
                    .AppendData(BitConverter.GetBytes((ushort)(start + 1)))
                    .AppendData(BitConverter.GetBytes((ushort)(end - start)))
                    .AppendData(_displayBuffer[start..end])
                );

                page++;
            }

            Set(Packet<AnimeMatrixPacket>(0xC0, 0x03));
        }


        private void LoadMFont()
        {
            byte[] fontData = GHelper.Properties.Resources.MFont;
            IntPtr fontPtr = System.Runtime.InteropServices.Marshal.AllocCoTaskMem(fontData.Length);
            System.Runtime.InteropServices.Marshal.Copy(fontData, 0, fontPtr, fontData.Length);
            uint dummy = 0;

            fonts.AddMemoryFont(fontPtr, GHelper.Properties.Resources.MFont.Length);
            AddFontMemResourceEx(fontPtr, (uint)GHelper.Properties.Resources.MFont.Length, IntPtr.Zero, ref dummy);
            System.Runtime.InteropServices.Marshal.FreeCoTaskMem(fontPtr);
        }


        public void PresentNextFrame()
        {
            if (frameIndex >= frames.Count) frameIndex = 0;
            _displayBuffer = frames[frameIndex];
            Present();
            frameIndex++;
        }

        public void ClearFrames()
        {
            frames.Clear();
            frameIndex = 0;
        }

        public void AddFrame()
        {
            frames.Add(_displayBuffer.ToArray());
        }

        public int Width(int y)
        {
            switch (_model)
            {
                case AnimeType.GA401:
                    return 33;
                case AnimeType.GU604:
                    return 39;
                case AnimeType.STRIX:
                    return 1 + y / 2;
                default:
                    return 34;
            }
        }

        public int FirstX(int y)
        {
            switch (_model)
            {
                case AnimeType.GA401:
                    if (y < 5 && y % 2 == 0)
                    {
                        return 1;
                    }
                    return (int)Math.Ceiling(Math.Max(0, y - FullRows) / 2F);
                case AnimeType.GU604:
                    if (y < 9 && y % 2 == 0)
                    {
                        return 1;
                    }
                    return (int)Math.Ceiling(Math.Max(0, y - FullRows) / 2F);
                default:
                    return (int)Math.Ceiling(Math.Max(0, y - FullRows) / 2F);
            }
        }


        public int Pitch(int y)
        {
            switch (_model)
            {
                case AnimeType.GA401:
                    switch (y)
                    {
                        case 0:
                        case 2:
                        case 4:
                            return 33;
                        case 1:
                        case 3:
                            return 35;
                        default:
                            return 36 - y / 2;
                    }
                case AnimeType.GU604:
                    switch (y)
                    {
                        case 0:
                        case 2:
                        case 4:
                        case 6:
                        case 8:
                            return 38;
                        case 1:
                        case 3:
                        case 5:
                        case 7:
                        case 9:
                            return 39;
                        default:
                            return Width(y) - FirstX(y);
                    }
                default:
                    return Width(y) - FirstX(y);
            }
        }


        public int RowToLinearAddress(int y)
        {
            int ret = LedStart;
            for (var i = 0; i < y; i++)
                ret += Pitch(i);

            return ret;
        }

        public void SetLedPlanar(int x, int y, byte value)
        {
            if (!IsRowInRange(y)) return;

            if (x >= FirstX(y) && x < Width(y))
                SetLedLinear(RowToLinearAddress(y) - FirstX(y) + x, value);
            }

        public void SetLedDiagonal(int x, int y, byte color, int deltaX = 0, int deltaY = 0)
        {
            x += deltaX;
            y -= deltaY;

            int plX = (x - y) / 2;
            int plY = x + y;

            if (x - y == -1) plX = -1;

            SetLedPlanar(plX, plY, color);
        }


        public void SetLedLinear(int address, byte value)
        {
            if (!IsAddressableLed(address)) return;
            _displayBuffer[address] = value;
        }


        public void Clear(bool present = false)
        {
            for (var i = 0; i < _displayBuffer.Length; i++) _displayBuffer[i] = 0;
            if (present) Present();
        }

        private void SetBitmapDiagonal(Bitmap bmp, int deltaX = 0, int deltaY = 0, int contrast = 100, int gamma = 0)
        {
            for (int y = 0; y < bmp.Height; y++)
            {
                for (int x = 0; x < bmp.Width; x++)
                {
                    var pixel = bmp.GetPixel(x, y);
                    var color = Math.Min((pixel.R + pixel.G + pixel.B + gamma) * contrast / 300, 255);
                    if (color > 20)
                        SetLedDiagonal(x, y, (byte)color, deltaX, deltaY - (FullRows / 2) - 1);
                }
            }
        }

        private void SetBitmapLinear(Bitmap bmp, int contrast = 100, int gamma = 0)
        {
            for (int y = 0; y < bmp.Height; y++)
            {
                for (int x = 0; x < bmp.Width; x++)
                    if (x % 2 == y % 2)
                    {
                        var pixel = bmp.GetPixel(x, y);
                        var color = Math.Min((pixel.R + pixel.G + pixel.B + gamma) * contrast / 300, 255);
                        if (color > 20)
                            SetLedPlanar(x / 2, y, (byte)color);
                    }
            }
        }

        public void Text(string text, float fontSize = 10, int x = 0, int y = 0)
        {

            int width = MaxRows;
            int height = MaxRows - FullRows;
            int textHeight, textWidth;

            using (Bitmap bmp = new Bitmap(width, height))
            {
                using (Graphics g = Graphics.FromImage(bmp))
                {
                    g.CompositingQuality = CompositingQuality.HighQuality;
                    g.SmoothingMode = SmoothingMode.AntiAlias;
                    g.TextRenderingHint = TextRenderingHint.SingleBitPerPixel;

                    using (Font font = new Font(fonts.Families[0], fontSize, FontStyle.Regular, GraphicsUnit.Pixel))
                    {
                        SizeF textSize = g.MeasureString(text, font);
                        textHeight = (int)textSize.Height;
                        textWidth = (int)textSize.Width;
                        g.DrawString(text, font, Brushes.White, x, height - y);
                    }
                }

                SetBitmapDiagonal(bmp, 5, height);

            }
        }

        public void PresentClock()
        {
            string timeFormat = AppConfig.GetString("matrix_time", "HH:mm");
            string dateFormat = AppConfig.GetString("matrix_date", "yy.MM.dd");

            if (DateTime.Now.Second % 2 != 0) timeFormat = timeFormat.Replace(":", "  ");

            Clear();
            switch (_model)
            {
                case AnimeType.STRIX:
                //case AnimeType.GA402:
                    Text(DateTime.Now.ToString(timeFormat), 15, 4, 20);
                    break;
                default:
                    Text(DateTime.Now.ToString(timeFormat), 15, 7 - FullRows / 2, 25);
                    Text(DateTime.Now.ToString(dateFormat), 11.5F, 0, 14);
                    break;
            }
            Present();

        }

        public void DrawBar(int pos, double h)
        {
            switch (_model)
            {
                //case AnimeType.GA402:
                case AnimeType.STRIX:
                    DrawBarDiagonal(pos, h);
                    break;
                default:
                    DrawBarPlanar(pos, h);
                    break;
            }
        }

        public void DrawBarPlanar(int pos, double h)
        {
            int dx = pos * 2;
            int dy = 20;

            byte color;

            for (int y = 0; y < h - (h % 2); y++)
                for (int x = 0; x < 2 - (y % 2); x++)
                {
                    //color = (byte)(Math.Min(1,(h - y - 2)*2) * 255);
                    SetLedPlanar(x + dx, dy + y, (byte)(h * 255 / 30));
                    SetLedPlanar(x + dx, dy - y, 255);
                }
        }

        public void DrawBarDiagonal(int pos, double h)
        {
            int dx = pos * 2;
            int dy = 0;

            byte color;

            for (int y = 0; y < h/2 ; y++)
                for (int x = 0; x < 2 ; x++)
                {
                    color = (byte)(Math.Min(1, (h - y - 2) * 2) * 255);
                    SetLedDiagonal(x + dx, dy - y, (byte)(h * 255 / 30), 10, -(FullRows/2));
                }
        }

        public void GenerateFrame(Image image, float zoom = 100, int panX = 0, int panY = 0, InterpolationMode quality = InterpolationMode.Default, int contrast = 100, int gamma = 0)
        {
            int width = MaxColumns / 2 * 6;
            int height = MaxRows;

            int targetWidth = MaxColumns * 2;

            float scale;

            using (Bitmap bmp = new Bitmap(targetWidth, height))
            {
                scale = Math.Min((float)width / (float)image.Width, (float)height / (float)image.Height) * zoom / 100;

                using (var graph = Graphics.FromImage(bmp))
                {
                    var scaleWidth = (float)(image.Width * scale);
                    var scaleHeight = (float)(image.Height * scale);

                    graph.InterpolationMode = quality;
                    graph.CompositingQuality = CompositingQuality.HighQuality;
                    graph.SmoothingMode = SmoothingMode.AntiAlias;

                    graph.DrawImage(image, (float)Math.Round(targetWidth - (scaleWidth + panX) * targetWidth / width), -panY, (float)Math.Round(scaleWidth * targetWidth / width), scaleHeight);

                }

                Clear();
                SetBitmapLinear(bmp, contrast, gamma);
            }
        }

        public void GenerateFrameDiagonal(Image image, float zoom = 100, int panX = 0, int panY = 0, InterpolationMode quality = InterpolationMode.Default, int contrast = 100, int gamma = 0)
        {
            int width = MaxRows + FullRows;
            int height = MaxColumns + FullRows;

            if ((image.Height / image.Width) > (height / width)) height = MaxColumns;

            float scale;

            using (Bitmap bmp = new Bitmap(width, height))
            {
                scale = Math.Min((float)width / (float)image.Width, (float)height / (float)image.Height) * zoom / 100;

                using (var graph = Graphics.FromImage(bmp))
                {
                    var scaleWidth = (float)(image.Width * scale);
                    var scaleHeight = (float)(image.Height * scale);

                    graph.InterpolationMode = quality;
                    graph.CompositingQuality = CompositingQuality.HighQuality;
                    graph.SmoothingMode = SmoothingMode.AntiAlias;

                    graph.DrawImage(image, (width - scaleWidth) / 2, height - scaleHeight, scaleWidth, scaleHeight);

                }

                Clear();
                SetBitmapDiagonal(bmp, -panX, height + panY, contrast, gamma);
            }
        }


        private bool IsRowInRange(int row)
        {
            return (row >= 0 && row < MaxRows);
        }

        private bool IsAddressableLed(int address)
        {
            return (address >= 0 && address < LedCount);
        }
    }
}

================================================
FILE: app/AnimeMatrix/Communication/Device.cs
================================================
// Source thanks to https://github.com/vddCore/Starlight :)

using GHelper.AnimeMatrix.Communication.Platform;

namespace GHelper.AnimeMatrix.Communication
{
    public abstract class Device : IDisposable
    {
        protected UsbProvider? _usbProvider;

        protected ushort _vendorId;
        protected ushort _productId;
        protected int _maxFeatureReportLength;

        protected Device(ushort vendorId, ushort productId)
        {
            _vendorId = vendorId;
            _productId = productId;
        }

        protected Device(ushort vendorId, ushort productId, int maxFeatureReportLength)
        {
            _vendorId = vendorId;
            _productId = productId;
            _maxFeatureReportLength = maxFeatureReportLength;
            SetProvider();
        }

        public ushort VendorID()
        {
            return _vendorId;
        }

        public ushort ProductID()
        {
            return _productId;
        }

        public virtual void SetProvider()
        {
            _usbProvider = new WindowsUsbProvider(_vendorId, _productId, _maxFeatureReportLength);
        }

        protected T Packet<T>(params byte[] command) where T : Packet
        {
            return (T)Activator.CreateInstance(typeof(T), command)!;
        }

        public void Set(Packet packet)
            => _usbProvider?.Set(packet.Data);

        public byte[] Get(Packet packet)
            => _usbProvider?.Get(packet.Data);

        public void Read(byte[] data)
            => _usbProvider?.Read(data);
        public void Write(byte[] data)
            => _usbProvider?.Write(data);

        public virtual void Dispose()
        {
            _usbProvider?.Dispose();
        }
    }
}

================================================
FILE: app/AnimeMatrix/Communication/Packet.cs
================================================
// Source thanks to https://github.com/vddCore/Starlight :)

namespace GHelper.AnimeMatrix.Communication
{
    public abstract class Packet
    {
        private int _currentDataIndex = 1;

        public byte[] Data { get; }

        internal Packet(byte reportId, int packetLength, params byte[] data)
        {
            if (packetLength < 1)
            {
                throw new ArgumentOutOfRangeException(
                    nameof(packetLength),
                    "Packet length must be at least 1."
                );
            }

            Data = new byte[packetLength];
            Data[0] = reportId;

            if (data.Length > 0)
            {
                if (_currentDataIndex >= Data.Length)
                {
                    throw new ArgumentOutOfRangeException(
                        nameof(data),
                        "Your packet length does not allow for initial data to be appended."
                    );
                }

                AppendData(data);
            }
        }

        public Packet AppendData(params byte[] data)
            => AppendData(out _, data);

        public Packet AppendData(out int bytesWritten, params byte[] data)
        {
            bytesWritten = 0;

            for (var i = 0;
                 i < data.Length && _currentDataIndex < Data.Length - 1;
                 i++, bytesWritten++, _currentDataIndex++)
            {
                if (_currentDataIndex > Data.Length - 1)
                    break;

                Data[_currentDataIndex] = data[i];
            }

            return this;
        }
    }
}

================================================
FILE: app/AnimeMatrix/Communication/Platform/UsbProvider.cs
================================================
namespace GHelper.AnimeMatrix.Communication.Platform
{
    public abstract class UsbProvider : IDisposable
    {
        protected ushort VendorID { get; }
        protected ushort ProductID { get; }

        protected UsbProvider(ushort vendorId, ushort productId)
        {
            VendorID = vendorId;
            ProductID = productId;
        }

        public abstract void Set(byte[] data);
        public abstract byte[] Get(byte[] data);
        public abstract void Read(byte[] data);
        public abstract void Write(byte[] data);

        public abstract void Dispose();
    }
}

================================================
FILE: app/AnimeMatrix/Communication/Platform/WindowsUsbProvider.cs
================================================
using System.ComponentModel;
using HidSharp;

namespace GHelper.AnimeMatrix.Communication.Platform
{
    internal class WindowsUsbProvider : UsbProvider
    {
        protected HidDevice HidDevice { get; }
        protected HidStream HidStream { get; }

        public WindowsUsbProvider(ushort vendorId, ushort productId, string path, int timeout = 500) : base(vendorId, productId)
        {
            try
            {
                HidDevice = DeviceList.Local.GetHidDevices(vendorId, productId)
                   .First(x => x.DevicePath.Contains(path));
            }
            catch
            {
                throw new IOException("HID device was not found on your machine.");
            }

            var config = new OpenConfiguration();
            config.SetOption(OpenOption.Interruptible, true);
            config.SetOption(OpenOption.Exclusive, false);
            config.SetOption(OpenOption.Priority, 10);
            HidStream = HidDevice.Open(config);
            HidStream.ReadTimeout = timeout;
            HidStream.WriteTimeout = timeout;
        }

        public WindowsUsbProvider(ushort vendorId, ushort productId, int maxFeatureReportLength)
            : base(vendorId, productId)
        {
            try
            {
                HidDevice = DeviceList.Local
                    .GetHidDevices(vendorId, productId)
                    .First(x => x.GetMaxFeatureReportLength() >= maxFeatureReportLength);
                Logger.WriteLine("Matrix Device: " + HidDevice.DevicePath + " " + HidDevice.GetMaxFeatureReportLength());
            }
            catch
            {
                throw new IOException("Matrix control device was not found on your machine.");
            }

            var config = new OpenConfiguration();
            config.SetOption(OpenOption.Interruptible, true);
            config.SetOption(OpenOption.Exclusive, false);
            config.SetOption(OpenOption.Priority, 10);

            HidStream = HidDevice.Open(config);
        }

        public override void Set(byte[] data)
        {
            WrapException(() =>
            {
                HidStream.SetFeature(data);
                HidStream.Flush();
            });
        }

        public override byte[] Get(byte[] data)
        {
            var outData = new byte[data.Length];
            Array.Copy(data, outData, data.Length);

            WrapException(() =>
            {
                HidStream.GetFeature(outData);
                HidStream.Flush();
            });

            return data;
        }

        public override void Read(byte[] data)
        {
            WrapException(() =>
            {
                HidStream.Read(data);
            });
        }

        public override void Write(byte[] data)
        {
            WrapException(() =>
            {
                HidStream.Write(data);
                HidStream.Flush();
            });
        }

        public override void Dispose()
        {
            HidStream.Dispose();
        }

        private void WrapException(Action action)
        {
            try
            {
                action();
            }
            catch (IOException e)
            {
                if (e.InnerException is Win32Exception w32e)
                {
                    if (w32e.NativeErrorCode != 0)
                    {
                        throw;
                    }
                }
            }
        }
    }
}

================================================
FILE: app/AnimeMatrix/SlashDevice.cs
================================================
using GHelper.AnimeMatrix.Communication;
using System.Management;
using System.Text;

namespace GHelper.AnimeMatrix
{
    public enum SlashMode
    {
        Bounce,
        Slash,
        Loading,
        BitStream,
        Transmission,
        Flow,
        Flux,
        Phantom,
        Spectrum,
        Hazard,
        Interfacing,
        Ramp,
        GameOver,
        Start,
        Buzzer,
        Static,
        FX1,
        FX2,
        FX3,
        BatteryLevel,
        Audio,
        AudioSpectrum
    }

    public class SlashPacket : Packet
    {
        public SlashPacket(byte[] command, byte reportID = 0x5E) : base(reportID, 128, command)
        {
        }
    }


    public class SlashDevice : Device
    {

        protected virtual byte reportID => 0x5E;

        protected virtual SlashPacket CreatePacket(byte[] command)
        {
            return new SlashPacket(command, reportID);
        }

        public static Dictionary<SlashMode, string> Modes = new Dictionary<SlashMode, string>
        {
            { SlashMode.Bounce, Properties.Strings.SlashBounce},
            { SlashMode.Slash, Properties.Strings.SlashMode},
            { SlashMode.Loading, Properties.Strings.SlashLoading},

            { SlashMode.BitStream, Properties.Strings.SlashBitStream},
            { SlashMode.Transmission, Properties.Strings.SlashTransmission},

            { SlashMode.Flow, Properties.Strings.SlashFlow},
            { SlashMode.Flux, Properties.Strings.SlashFlux},
            { SlashMode.Phantom, Properties.Strings.SlashPhantom},
            { SlashMode.Spectrum, Properties.Strings.SlashSpectrum},

            { SlashMode.Hazard, Properties.Strings.SlashHazard},
            { SlashMode.Interfacing, Properties.Strings.SlashInterfacing},
            { SlashMode.Ramp, Properties.Strings.SlashRamp},

            { SlashMode.GameOver, Properties.Strings.SlashGameOver},
            { SlashMode.Start, Properties.Strings.SlashStart},
            { SlashMode.Buzzer, Properties.Strings.SlashBuzzer},

            { SlashMode.Static, Properties.Strings.SlashStatic},

            { SlashMode.FX1, "FX1"},
            { SlashMode.FX2, "FX2"},
            { SlashMode.FX3, "FX3"},

            { SlashMode.BatteryLevel, Properties.Strings.SlashBatteryLevel},
            { SlashMode.Audio, Properties.Strings.MatrixAudio}

        };

        private static Dictionary<SlashMode, byte> modeCodes = new Dictionary<SlashMode, byte>
        {
            { SlashMode.Static, 0x06},
            { SlashMode.Bounce, 0x10},
            { SlashMode.Slash, 0x12},
            { SlashMode.Loading, 0x13},

            { SlashMode.BitStream, 0x1D},
            { SlashMode.Transmission, 0x1A},

            { SlashMode.Flow, 0x19},
            { SlashMode.Flux, 0x25},
            { SlashMode.Phantom, 0x24},
            { SlashMode.Spectrum, 0x26},

            { SlashMode.Hazard, 0x32},
            { SlashMode.Interfacing, 0x33},
            { SlashMode.Ramp, 0x34},

            { SlashMode.GameOver, 0x42},
            { SlashMode.Start, 0x43},
            { SlashMode.Buzzer, 0x44},

            { SlashMode.FX1, 0x60},
            { SlashMode.FX2, 0x61},
            { SlashMode.FX3, 0x62},
        };

        public SlashDevice(ushort productId = 0x193B) : base(0x0B05, productId, 128)
        {
        }

        public void WakeUp()
        {
            Set(CreatePacket(Encoding.ASCII.GetBytes("ASUS Tech.Inc.")), "SlashWakeUp");
            Set(CreatePacket([0xC2]), "SlashWakeUp");
            Set(CreatePacket([0xD1, 0x01, 0x00, 0x01 ]), "SlashWakeUp");
        }

        public void Init()
        {
            Set(CreatePacket([0xD7, 0x00, 0x00, 0x01, 0xAC]), "SlashInit");
            Set(CreatePacket([0xD2, 0x02, 0x01, 0x08, 0xAB]), "SlashInit");
        }

        public void SetEnabled(bool status = true)
        {
            Set(CreatePacket([0xD8, 0x02, 0x00, 0x01, status ? (byte)0x00 : (byte)0x80]), $"SlashEnable {status}");
        }

        public void Save()
        {
            Set(CreatePacket([0xD4, 0x00, 0x00, 0x01, 0xAB]), "SlashSave");
        }

        public void SetMode(SlashMode mode)
        {
            byte modeByte;

            try
            {
                modeByte = modeCodes[mode];
            }
            catch (Exception)
            {
                modeByte = 0x00;
            }

            Set(CreatePacket([0xD2, 0x03, 0x00, 0x0C]), "SlashMode");
            //Set(CreatePacket([0xD3, 0x04, 0x00, 0x0C, 0x01, modeByte, 0x02, 0x19, 0x03, 0x13, 0x04, 0x11, 0x05, 0x12, 0x06, 0x13]), "SlashMode");
            Set(CreatePacket([0xD3, 0x04, 0x00, 0x0C, 0x01, modeByte, 0x02, 0x42, 0x03, 0x13, 0x04, 0x11, 0x05, 0x12, 0x06, 0x13]), "SlashMode");
        }

        private byte[] GetPercentagePattern(int brightness, double percentage)
        {
            // because 7 segments, within each led segment represents a percentage bracket of (100/7 = 14.2857%)
            // set brightness to reflect battery's percentage within that range

            int bracket = (int)Math.Floor(percentage / 14.2857);
            if (bracket >= 7) return Enumerable.Repeat((byte)(brightness * 85.333), 7).ToArray();

            byte[] batteryPattern = Enumerable.Repeat((byte)(0x00), 7).ToArray();
            for (int i = 6; i > 6 - bracket; i--)
            {
                batteryPattern[i] = (byte)(brightness * 85.333);
            }

            //set the "selected" bracket to the percentage of that bracket filled from 0 to 255 as a hex
            batteryPattern[6 - bracket] = (byte)(((percentage % 14.2857) * brightness * 85.333) / 14.2857);

            return batteryPattern;
        }

        public void SetBatteryPattern(int brightness)
        {
            SetCustom(GetPercentagePattern(brightness, 100 * (HardwareControl.GetBatteryChargePercentage() / AppConfig.Get("charge_limit", 100))), null);
        }

        public void SetEmpty()
        {
            SetCustom(GetPercentagePattern(0, 0));
        }

        public void SetAudioPattern(int brightness, double bass, double treble)
        {
            byte[] payload = new byte[7];
            double step = 100.0 / 7.0;
            for (int i = 0; i < 7; i++)
            {
                double s = step * i, e = step * (i + 1);
                if (bass > s) payload[6 - i] |= (byte)(Math.Min((bass - s) / (e - s), 1) * brightness * 0x20);
                if (treble > s) payload[6 - i] |= (byte)(Math.Min((treble - s) / (e - s), 1) * brightness * 0x50);
            }
            ContinueCustom(payload, null);
        }


        public void SetCustom(byte[] data, string? log = "Static Data")
        {
            Set(CreatePacket([0xD2, 0x02, 0x01, 0x08, 0xAC]), null);
            Set(CreatePacket([0xD3, 0x03, 0x01, 0x08, 0xAC, 0xFF, 0xFF, 0x01, 0x05, 0xFF, 0xFF]), null);
            Set(CreatePacket([0xD4, 0x00, 0x00, 0x01, 0xAC]), null);
            ContinueCustom(data, log);
        }

        public void ContinueCustom(byte[] data, string? log)
        {
            byte[] payload = new byte[] { 0xD3, 0x00, 0x00, 0x07 };
            Set(CreatePacket(payload.Concat(data.Take(7)).ToArray()), log);
        }

        public void SetOptions(bool status, int brightness = 0, int interval = 0)
        {
            byte brightnessByte = (byte)(brightness * 85.333);

            Set(CreatePacket([0xD3, 0x03, 0x01, 0x08, 0xAB, 0xFF, 0x01, status ? (byte)0x01 : (byte)0x00, 0x06, brightnessByte, 0xFF, (byte)interval]), "SlashOptions");
        }

        public void SetBatterySaver(bool status)
        {
            Set(CreatePacket([0xD8, 0x01, 0x00, 0x01, status ? (byte)0x80 : (byte)0x00]), $"SlashBatterySaver {status}");
        }

        public void SetLidCloseAnimation(bool status)
        {
            Set(CreatePacket([0xD8, 0x00, 0x00, 0x02, 0xA5, status ? (byte)0x00 : (byte)0x80]), $"SlashLidCloseAnimation {status}");
        }

        public void SetSleepActive(bool status)
        {
            Set(CreatePacket([0xD2, 0x02, 0x01, 0x08, 0xA1]), "SlashSleepInit");
            Set(CreatePacket([0xD3, 0x03, 0x01, 0x08, 0xA1, 0x00, 0xFF, status ? (byte)0x01 : (byte)0x00, 0x02, 0xFF, 0xFF]), $"SlashSleep {status}");
        }

        public void Set(Packet packet, string? log = null)
        {
            _usbProvider?.Set(packet.Data);
            if (log is not null) Logger.WriteLine($"{log}:" + BitConverter.ToString(packet.Data).Substring(0, 48));
        }
    }

    public class SlashDeviceAura : SlashDevice
    {
        protected override byte reportID => 0x5D;

        public SlashDeviceAura() : base(0x19B6)
        {
        }

        protected override SlashPacket CreatePacket(byte[] command)
        {
            return new SlashPacket(command, reportID);
        }

    }
}

================================================
FILE: app/App.config
================================================
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<System.Windows.Forms.ApplicationConfigurationSection>
		<add key="DpiAwareness" value="PerMonitorV2" />
	</System.Windows.Forms.ApplicationConfigurationSection>
	<appSettings>
		<add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
	</appSettings>
</configuration>



================================================
FILE: app/AppConfig.cs
================================================
using GHelper.Mode;
using System.Diagnostics;
using System.Management;
using System.Text.Json;

public static class AppConfig
{

    private static string configFile;

    private static string? _model;
    private static string? _modelShort;
    private static string? _bios;

    private static Dictionary<string, object> config = new Dictionary<string, object>();
    private static System.Timers.Timer timer = new System.Timers.Timer(2000);
    private static long lastWrite;

    static AppConfig()
    {

        string startupPath = Application.StartupPath.Trim('\\');
        string appPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\GHelper";
        string configName = "\\config.json";

        if (File.Exists(startupPath + configName))
        {
            configFile = startupPath + configName;
        }
        else
        {
            configFile = appPath + configName;
        }


        if (!System.IO.Directory.Exists(appPath))
            System.IO.Directory.CreateDirectory(appPath);

        if (File.Exists(configFile))
        {
            string text = File.ReadAllText(configFile);
            try
            {
                config = JsonSerializer.Deserialize<Dictionary<string, object>>(text);
            }
            catch (Exception ex)
            {
                Logger.WriteLine($"Broken config: {ex.Message} {text}");
                try
                {
                    text = File.ReadAllText(configFile + ".bak");
                    config = JsonSerializer.Deserialize<Dictionary<string, object>>(text);
                }
                catch (Exception exb)
                {
                    Logger.WriteLine($"Broken backup config: {exb.Message} {text}");
                    File.Copy(configFile, configFile + ".old", true);
                    File.Copy(configFile + ".bak", configFile + ".bak.old", true);
                    Init();
                }
            }
        }
        else
        {
            Init();
        }

        timer.Elapsed += Timer_Elapsed;

    }

    private static void Timer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)
    {

        timer.Stop();
        string jsonString = JsonSerializer.Serialize(config, new JsonSerializerOptions { WriteIndented = true });
        var backup = configFile + ".bak";

        try
        {
            File.WriteAllText(configFile, jsonString);
            //Debug.WriteLine($"{DateTime.Now}: Config write");
        }
        catch (Exception)
        {
            Thread.Sleep(1000);
            try
            {
                File.WriteAllText(configFile, jsonString);
            }
            catch (Exception ex)
            {
                Logger.WriteLine(ex.Message);
            }
            return;
        }

        lastWrite = DateTimeOffset.Now.ToUnixTimeMilliseconds();

        Thread.Sleep(5000);

        if (Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastWrite) < 4000) return;

        var backupText = File.ReadAllText(configFile);
        bool isValid =
            !string.IsNullOrWhiteSpace(backupText) &&
            backupText.IndexOf('\0') == -1 &&                     
            backupText.StartsWith("{") &&
            backupText.Trim().EndsWith("}") &&
            backupText.Length >= 10;

        if (isValid)
        {
            File.Copy(configFile, backup, true);
            //Debug.WriteLine($"{DateTime.Now}: Config backup");
        }
        else
        {
            Logger.WriteLine("Error writing config");
        }

    }

    public static string GetModel()
    {
        if (_model is null)
        {
            _model = "";
            try
            {
                using (var searcher = new ManagementObjectSearcher(@"Select * from Win32_ComputerSystem"))
                {
                    foreach (var process in searcher.Get())
                    {
                        _model = process["Model"].ToString();
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.WriteLine(ex.Message);
            }
        }

        //if (_model.Contains("GA402RK")) _model = "ROG Flow Z13 GZ302EA"; // Debug Purposes

        return _model;
    }

    public static (string, string) GetBiosAndModel()
    {
        if (_bios is not null && _modelShort is not null) return (_bios, _modelShort);

        using (ManagementObjectSearcher objSearcher = new ManagementObjectSearcher(@"SELECT * FROM Win32_BIOS"))
        {
            using (ManagementObjectCollection objCollection = objSearcher.Get())
            {
                foreach (ManagementObject obj in objCollection)
                    if (obj["SMBIOSBIOSVersion"] is not null)
                    {
                        string[] results = obj["SMBIOSBIOSVersion"].ToString().Split(".");
                        if (results.Length > 1)
                        {
                            _modelShort = results[0];
                            _bios = results[1];
                        }
                        else
                        {
                            _modelShort = obj["SMBIOSBIOSVersion"].ToString();
                        }
                    }

                return (_bios, _modelShort);
            }
        }
    }

    public static string GetModelShort()
    {
        string model = GetModel();
        int trim = model.LastIndexOf("_");
        if (trim > 0) model = model.Substring(0, trim);
        return model;
    }

    public static bool ContainsModel(string contains)
    {
        GetModel();
        return (_model is not null && _model.ToLower().Contains(contains.ToLower()));
    }


    private static void Init()
    {
        config = new Dictionary<string, object>();
        config["performance_mode"] = 0;
        string jsonString = JsonSerializer.Serialize(config);
        File.WriteAllText(configFile, jsonString);
    }

    public static bool Exists(string name)
    {
        return config.ContainsKey(name);
    }

    public static int Get(string name, int empty = -1)
    {
        if (config.ContainsKey(name))
        {
            //Debug.WriteLine(name);
            return int.Parse(config[name].ToString());
        }
        else
        {
            //Debug.WriteLine(name + "E");
            return empty;
        }
    }

    public static bool Is(string name)
    {
        return Get(name) == 1;
    }

    public static bool IsNotFalse(string name)
    {
        return Get(name) != 0;
    }

    public static bool IsOnBattery(string zone)
    {
        return Get(zone + "_bat", Get(zone)) != 0;
    }

    public static string GetString(string name, string empty = null)
    {
        if (config.ContainsKey(name))
            return config[name].ToString();
        else return empty;
    }

    private static void Write()
    {
        timer.Stop();
        timer.Start();
    }

    public static void Set(string name, int value)
    {
        config[name] = value;
        Write();
    }

    public static void Set(string name, string value)
    {
        config[name] = value;
        Write();
    }
    public static void Remove(string name)
    {
        config.Remove(name);
        Write();
    }

    public static void RemoveMode(string name)
    {
        Remove(name + "_" + Modes.GetCurrent());
    }

    public static string GgetParamName(AsusFan device, string paramName = "fan_profile")
    {
        int mode = Modes.GetCurrent();
        string name;

        switch (device)
        {
            case AsusFan.GPU:
                name = "gpu";
                break;
            case AsusFan.Mid:
                name = "mid";
                break;
            case AsusFan.XGM:
                name = "xgm";
                break;
            default:
                name = "cpu";
                break;

        }

        return paramName + "_" + name + "_" + mode;
    }

    public static byte[] GetFanConfig(AsusFan device)
    {
        string curveString = GetString(GgetParamName(device));
        byte[] curve = { };

        if (curveString is not null)
            curve = StringToBytes(curveString);

        return curve;
    }

    public static void SetFanConfig(AsusFan device, byte[] curve)
    {
        string bitCurve = BitConverter.ToString(curve);
        Set(GgetParamName(device), bitCurve);
    }


    public static byte[] StringToBytes(string str)
    {
        String[] arr = str.Split('-');
        byte[] array = new byte[arr.Length];
        for (int i = 0; i < arr.Length; i++) array[i] = Convert.ToByte(arr[i], 16);
        return array;
    }

    public static byte[] GetDefaultCurve(AsusFan device)
    {
        int mode = Modes.GetCurrentBase();
        byte[] curve;

        switch (mode)
        {
            case AsusACPI.PerformanceTurbo:
                switch (device)
                {
                    case AsusFan.GPU:
                        return StringToBytes("1E-3F-44-48-4C-50-54-62-16-1F-26-2D-39-47-55-5F");
                    default:
                        return StringToBytes("1E-3F-44-48-4C-50-54-62-11-1A-22-29-34-43-51-5A");
                }
            case AsusACPI.PerformanceSilent:
                switch (device)
                {
                    case AsusFan.GPU:
                        return StringToBytes("1E-31-3B-42-47-50-5A-64-00-00-04-11-1B-23-28-2D");
                    default:
                        return StringToBytes("1E-31-3B-42-47-50-5A-64-00-00-03-0C-14-1C-22-29");
                }
            default:
                switch (device)
                {
                    case AsusFan.GPU:
                        return StringToBytes("3A-3D-40-44-48-4D-51-62-0C-16-1D-1F-26-2D-34-4A");
                    default:
                        return StringToBytes("3A-3D-40-44-48-4D-51-62-08-11-16-1A-22-29-30-45");
                }
        }

    }

    public static string GetModeString(string name)
    {
        return GetString(name + "_" + Modes.GetCurrent());
    }

    public static int GetMode(string name, int empty = -1)
    {
        return Get(name + "_" + Modes.GetCurrent(), empty);
    }

    public static bool IsMode(string name)
    {
        return Get(name + "_" + Modes.GetCurrent()) == 1;
    }

    public static void SetMode(string name, int value)
    {
        Set(name + "_" + Modes.GetCurrent(), value);
    }

    public static void SetMode(string name, string value)
    {
        Set(name + "_" + Modes.GetCurrent(), value);
    }

    public static bool IsAlly()
    {
        return ContainsModel("RC7");
    }

    public static bool NoMKeys()
    {
        return (ContainsModel("Z13") && !IsARCNM()) ||
               ContainsModel("FX706") ||
               ContainsModel("FA706") ||
               ContainsModel("FA506") ||
               ContainsModel("FX506") ||
               ContainsModel("Duo") ||
               ContainsModel("FX505");
    }

    public static bool IsARCNM()
    {
        return ContainsModel("GZ301VIC");
    }

    public static bool IsTUF()
    {
        return ContainsModel("TUF") || ContainsModel("TX Gaming") || ContainsModel("TX Air");
    }

    public static bool IsProArt()
    {
        return ContainsModel("ProArt");
    }

    public static bool IsVivoZenbook()
    {
        return ContainsModel("Vivobook") || ContainsModel("Zenbook") || ContainsModel("EXPERTBOOK") || ContainsModel(" V16");
    }

    public static bool IsVivoZenPro()
    {
        return ContainsModel("Vivobook") || ContainsModel("Zenbook") || ContainsModel("ProArt") || ContainsModel("EXPERTBOOK") || ContainsModel(" V16");
    }

    public static bool IsHardwareFnLock()
    {
        return IsVivoZenPro() || ContainsModel("GZ302EA");
    }

    // Devices with bugged bios command to change brightness
    public static bool SwappedBrightness()
    {
        return ContainsModel("FA506IEB") || ContainsModel("FA506IH") || ContainsModel("FA506IC") || ContainsModel("FA506II") || ContainsModel("FX506LU") || ContainsModel("FX506IC") || ContainsModel("FX506LH") || ContainsModel("FA506IV") || ContainsModel("FA706IC") || ContainsModel("FA706IH");
    }


    public static bool IsDUO()
    {
        return ContainsModel("Duo") || ContainsModel("GX550") || ContainsModel("GX551") || ContainsModel("GX650") || ContainsModel("UX840") || ContainsModel("UX482");
    }

    public static bool IsM4Button()
    {
        return IsDUO() || ContainsModel("GZ302EA");
    }

    // G14 2020 has no aura, but media keys instead
    public static bool NoAura()
    {
        return (ContainsModel("GA401I") && !ContainsModel("GA401IHR")) || ContainsModel("GA502IU") || ContainsModel("HN7306") || ContainsModel("M6500X");
    }

    public static bool MediaKeys()
    {
        return (ContainsModel("GA401I") && !ContainsModel("GA401IHR")) || ContainsModel("G712L") || ContainsModel("GX502L");
    }

    public static bool IsSingleColor()
    {
        return ContainsModel("GA401") || ContainsModel("FX517Z") || ContainsModel("FX516P") || ContainsModel("X13") || IsARCNM() || ContainsModel("FA617N") || ContainsModel("FA617X") || NoAura() || Is("no_rgb");
    }

    public static bool IsSleepBacklight()
    {
        return ContainsModel("FA617") || ContainsModel("FX507");
    }

    public static bool IsAnimeMatrix()
    {
        return ContainsModel("GA401") || ContainsModel("GA402") || ContainsModel("GU604V") || ContainsModel("GU604V") || ContainsModel("G835") || ContainsModel("G815") || ContainsModel("G635") || ContainsModel("G615");
    }
    
    public static bool IsSlash()
    {
        return ContainsModel("GA403") || ContainsModel("GU605") || ContainsModel("GA605");
    }

    public static bool IsSlashAura()
    {
        return ContainsModel("GA605") || ContainsModel("GU605C") || ContainsModel("GA403W") || ContainsModel("GA403UM") || ContainsModel("GA403UP") || ContainsModel("GA403UH");
    }

    public static bool IsInputBacklight()
    {
        return ContainsModel("GA503") || IsSlash() || IsVivoZenPro();
    }

    public static bool IsInvertedFNLock()
    {
        return ContainsModel("M140") || ContainsModel("S550") || ContainsModel("P540") || IsTUF();
    }

    public static bool IsOLED()
    {
        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");
    }

    public static bool IsNoOverdrive()
    {
        return Is("no_overdrive");
    }

    public static bool IsNoSleepEvent()
    {
        return ContainsModel("FX505");
    }

    public static bool IsStrix()
    {
        return ContainsModel("Strix") || ContainsModel("Scar") || ContainsModel("G703G");
    }

    public static bool IsAdvancedRGB()
    {
        return IsStrix() || ContainsModel("GX650");
    }

    public static bool IsBacklightZones()
    {
        return IsStrix() || IsZ13();
    }

    public static bool IsStrixLimitedRGB()
    {
        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");
    }

    public static bool IsPossible4ZoneRGB()
    {
        return ContainsModel("G614JI_") || ContainsModel("G614JV_") || ContainsModel("G614JZ") || ContainsModel("G614JU") || IsStrixLimitedRGB();
    }

    public static bool Is4ZoneRGB()
    {
        return IsPossible4ZoneRGB() && !Is("per_key_rgb");
    }

    public static bool IsHardwareHotkeys()
    {
        return ContainsModel("FX506");
    }

    public static bool NoWMI()
    {
        return ContainsModel("GL704G") || ContainsModel("GM501G") || ContainsModel("GX501G");
    }

    public static bool IsNoDirectRGB()
    {
        return ContainsModel("GA503") || ContainsModel("G533Q") || ContainsModel("GU502") || ContainsModel("GU603") || IsSlash() || IsAlly();
    }

    public static bool IsStrixNumpad()
    {
        return ContainsModel("G713R");
    }

    public static bool IsZ1325()
    {
        return ContainsModel("GZ302E");
    }

    public static bool IsZ13()
    {
        return ContainsModel("Z13");
    }

    public static bool IsPZ13()
    {
        return ContainsModel("PZ13");
    }

    public static bool IsS17()
    {
        return ContainsModel("S17");
    }

    public static bool HasTabletMode()
    {
        return ContainsModel("X16") || ContainsModel("X13") || ContainsModel("Z13");
    }

    public static bool IsX13()
    {
        return ContainsModel("X13");
    }

    public static bool IsG14AMD()
    {
        return ContainsModel("GA402R");
    }

    public static bool DynamicBoost5()
    {
        return ContainsModel("GZ301ZE");
    }

    public static bool DynamicBoost15()
    {
        return ContainsModel("FX507ZC4") || ContainsModel("GA403UM") || ContainsModel("GU605CP") || ContainsModel("FX608J") || ContainsModel("FX608L") || ContainsModel("FA608U") || ContainsModel("FA608P") || ContainsModel("FA608W") ||
               ContainsModel("FA401K") || ContainsModel("FA401UM") || ContainsModel("FA401UH");
    }

    public static bool DynamicBoost20()
    {
        return ContainsModel("GU605") || ContainsModel("GA605");
    }

    public static bool IsAdvantageEdition()
    {
        return ContainsModel("13QY");
    }

    public static bool NoAutoUltimate()
    {
        return ContainsModel("G614") || ContainsModel("GU604") || ContainsModel("FX507") || ContainsModel("G513") || ContainsModel("FA617") || ContainsModel("G834") || ContainsModel("GA403") || ContainsModel("GU605") || ContainsModel("GA605") || ContainsModel("GU603VV");
    }

    public static bool IsAlwaysUltimate()
    {
        return ContainsModel("FA507NUR") || ContainsModel("FA506NCR") || ContainsModel("FA507NVR");
    }

    public static bool IsManualModeRequired()
    {
        if (!IsMode("auto_apply_power")) return false;
        return Is("manual_mode") || ContainsModel("G733");
    }

    public static bool IsResetRequired()
    {
        return ContainsModel("GA403") || ContainsModel("FA507XV");
    }

    public static bool IsFanRequired()
    {
        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");
    }

    public static bool IsAMDLight()
    {
        return ContainsModel("GA402X") || ContainsModel("GA605") || ContainsModel("GA403") || ContainsModel("FA507N") || ContainsModel("FA507X") || ContainsModel("FA707N") || ContainsModel("FA707X") || ContainsModel("GZ302");
    }

    public static bool IsPowerRequired()
    {
        return ContainsModel("FX507") || ContainsModel("FX517") || ContainsModel("FX707");
    }

    public static bool IsModeReapplyRequired()
    {
        return Is("mode_reapply") || ContainsModel("FA401");
    }

    public static bool IsGPUFix()
    {
        return Is("gpu_fix") || (ContainsModel("GA402X") && IsNotFalse("gpu_fix"));
    }

    public static bool IsShutdownReset()
    {
        return Is("shutdown_reset") || ContainsModel("FX507Z");
    }

    public static bool IsNVPlatform()
    {
        return Is("nv_platform");
    }

    public static bool IsForceSetGPUMode()
    {
        return Is("gpu_mode_force_set") || (ContainsModel("503") && IsNotFalse("gpu_mode_force_set"));
    }

    public static bool IsAMDiGPU()
    {
        return ContainsModel("GV301RA") || ContainsModel("GV302XA") || ContainsModel("GZ302") || IsFA401EA() || IsAlly();
    }

    public static bool NoGpu()
    {
        return Is("no_gpu") || ContainsModel("UX540") || ContainsModel("M560") || ContainsModel("GZ302") || IsFA401EA();
    }

    public static bool IsFA401EA()
    {
        return ContainsModel("FA401EA");
    }

    public static bool IsHardwareTouchpadToggle()
    {
        return ContainsModel("FA507");
    }

    public static bool IsIntelHX()
    {
        return ContainsModel("G814") || ContainsModel("G614") || ContainsModel("G834") || ContainsModel("G634") || ContainsModel("G835") || ContainsModel("G635") || ContainsModel("G815") || ContainsModel("G615");
    }

    public static bool Is8Ecores()
    {
        return ContainsModel("FX507Z") || ContainsModel("GU603ZV");
    }

    public static bool IsNoFNV()
    {
        return ContainsModel("FX507") || ContainsModel("FX707");
    }

    public static bool IsROG()
    {
        return ContainsModel("ROG");
    }
    public static bool IsASUS()
    {
        return ContainsModel("ROG") || ContainsModel("TUF") || ContainsModel("Vivobook") || ContainsModel("Zenbook");
    }

    public static bool IsBWIcon()
    {
        return Is("bw_icon");
    }

    public static bool IsStopAC()
    {
        return IsAlly() || Is("stop_ac");
    }

    public static bool IsChargeLimit6080()
    {
        return ContainsModel("H760") || ContainsModel("GA403") || ContainsModel("GU605") || ContainsModel("GA605") || ContainsModel("GA503R") || (IsTUF() && !(ContainsModel("FX507Z") || ContainsModel("FA617") || ContainsModel("FA607")));

    }

    // 2024 Models support Dynamic Lighting
    public static bool IsDynamicLighting()
    {
        return IsSlash() || IsIntelHX() || IsTUF() || IsZ13();
    }

    public static bool IsDynamicLightingOnly()
    {
        return ContainsModel("S560") || ContainsModel("M540") || ContainsModel("UX760");
    }

    public static bool IsDynamicLightingInit()
    {
        return ContainsModel("FA608") || Is("lighting_init");
    }

    public static bool IsForceMiniled()
    {
        return ContainsModel("G834JYR") || ContainsModel("G834JZR") || ContainsModel("G634JZR") || ContainsModel("G835LW") || ContainsModel("G835LX") || ContainsModel("G635LW") || ContainsModel("G635LX") || Is("force_miniled");
    }
    public static bool SaveDimming()
    {
        return Is("save_dimming");
    }

    public static bool IsAutoStatusLed()
    {
        return Is("auto_status_led");
    }

    public static bool IsClampFanDots()
    {
        return Is("fan_clamp") || (IsTUF() && IsNotFalse("fan_clamp"));
    }


}


================================================
FILE: app/AsusACPI.cs
================================================
using GHelper;
using GHelper.USB;
using System.Management;
using System.Runtime.InteropServices;

public enum AsusFan
{
    CPU = 0,
    GPU = 1,
    Mid = 2,
    XGM = 3
}

public enum AsusMode
{
    Balanced = 0,
    Turbo = 1,
    Silent = 2
}

public enum AsusGPU
{
    Eco = 0,
    Standard = 1,
    Ultimate = 2
}

public class AsusACPI
{

    const string FILE_NAME = @"\\.\\ATKACPI";
    const uint CONTROL_CODE = 0x0022240C;

    const uint DSTS = 0x53545344;
    const uint DEVS = 0x53564544;
    const uint INIT = 0x54494E49;
    const uint WDOG = 0x474F4457;

    public const uint UniversalControl = 0x00100021;

    public const int Airplane = 0x88;
    public const int KB_Light_Up = 0xc4;
    public const int KB_Light_Down = 0xc5;
    public const int Brightness_Down = 0x10;
    public const int Brightness_Up = 0x20;
    public const int KB_Sleep = 0x6c;

    public const int KB_TouchpadToggle = 0x6b;
    public const int KB_MuteToggle = 0x7c;
    public const int KB_FNlockToggle = 0x4e;

    public const int KB_DUO_PgUpDn = 0x4B;
    public const int KB_DUO_SecondDisplay = 0x6A;

    public const int Touchpad_Toggle = 0x6B;

    public const int ChargerMode = 0x0012006C;

    public const int ChargerUSB = 2;
    public const int ChargerBarrel = 1;

    public const uint CPU_Fan = 0x00110013;
    public const uint GPU_Fan = 0x00110014;
    public const uint Mid_Fan = 0x00110031;

    public const uint BatteryDischarge = 0x0012005A;

    public const uint StatusMode = 0x00090031;
    public const uint PerformanceMode = 0x00120075; // Performance modes
    public const uint VivoBookMode = 0x00110019; // Vivobook performance modes

    public const uint GPUEcoROG = 0x00090020;
    public const uint GPUEcoVivo = 0x00090120;

    public const uint GPUXGConnected = 0x00090018;
    public const uint GPUXG = 0x00090019;

    public const uint GPUMuxROG = 0x00090016;
    public const uint GPUMuxVivo = 0x00090026;

    public const uint BatteryLimit = 0x00120057;

    public const uint ScreenOverdrive = 0x00050019;
    public const uint ScreenMiniled1 = 0x0005001E;
    public const uint ScreenMiniled2 = 0x0005002E;
    public const uint ScreenFHD = 0x0005001C;
    public const uint ScreenHDRControl = 0x00050071;

    public const uint ScreenOptimalBrightness = 0x0005002A;
    public const uint ScreenInit = 0x00050011; // ?

    public const uint DevsCPUFan = 0x00110022;
    public const uint DevsGPUFan = 0x00110023;

    public const uint DevsCPUFanCurve = 0x00110024;
    public const uint DevsGPUFanCurve = 0x00110025;
    public const uint DevsMidFanCurve = 0x00110032;

    public const int Temp_CPU = 0x00120094;
    public const int Temp_GPU = 0x00120097;

    public const int PPT_APUA0 = 0x001200A0;  // sPPT (slow boost limit) / PL2
    public const int PPT_EDCA1 = 0x001200A1;  // CPU EDC
    public const int PPT_TDCA2 = 0x001200A2;  // CPU TDC
    public const int PPT_APUA3 = 0x001200A3;  // SPL (sustained limit) / PL1

    public const int PPT_CPUB0 = 0x001200B0;  // CPU PPT on 2022 (PPT_LIMIT_APU)
    public const int PPT_CPUB1 = 0x001200B1;  // Total PPT on 2022 (PPT_LIMIT_SLOW)

    public const int PPT_GPUC0 = 0x001200C0;  // NVIDIA GPU Boost
    public const int PPT_APUC1 = 0x001200C1;  // fPPT (fast boost limit)
    public const int PPT_GPUC2 = 0x001200C2;  // NVIDIA GPU Temp Target (75.. 87 C) 

    public const uint CORES_CPU = 0x001200D2; // Intel E-core and P-core configuration in a format 0x0[E]0[P]
    public const uint CORES_MAX = 0x001200D3; // Maximum Intel E-core and P-core availability

    public const uint GPU_BASE  = 0x00120099;  // Base part GPU TGP
    public const uint GPU_POWER = 0x00120098;  // Additonal part of GPU TGP

    public const int APU_MEM = 0x000600C1;

    public const int TUF_KB_BRIGHTNESS = 0x00050021;
    public const int KBD_BACKLIGHT_OOBE = 0x0005002F;

    public const int TUF_KB = 0x00100056;
    public const int TUF_KB2 = 0x0010005a;

    public const int TUF_KB_STATE = 0x00100057;

    public const int MicMuteLed = 0x00040017;
    public const int SoundMuteLed = 0x0004001C;

    public const int SlateMode = 0x00120063;
    public const int TabletState = 0x00060077;
    public const int TentState = 0x00060062;
    public const int FnLock = 0x00100023;

    public const int ScreenPadToggle = 0x00050031;
    public const int ScreenPadBrightness = 0x00050032;

    public const int CameraShutter = 0x00060078;
    public const int CameraLed = 0x00060079;
    public const int StatusLed = 0x000600C2;

    public const int BootSound = 0x00130022;

    public const int Tablet_Notebook = 0;
    public const int Tablet_Tablet = 1;
    public const int Tablet_Tent = 2;
    public const int Tablet_Rotated = 3;

    public const int PerformanceBalanced = 0;
    public const int PerformanceTurbo = 1;
    public const int PerformanceSilent = 2;
    public const int PerformanceManual = 4;

    public const int GPUModeEco = 0;
    public const int GPUModeStandard = 1;
    public const int GPUModeUltimate = 2;

    public const int MinTotal = 5;

    public static int MaxTotal = 150;
    public static int DefaultTotal = 80;

    public const int MinCPU = 5;
    public static int MaxCPU = 100;
    public const int DefaultCPU = 80;

    public const int MinGPUBoost = 5;
    public static int MaxGPUBoost = 25;

    public static int MinGPUPower = 0;
    public static int MaxGPUPower = 70;

    public const int MinGPUTemp = 75;
    public const int MaxGPUTemp = 87;

    public const int PCoreMin = 4;
    public const int ECoreMin = 0;

    public const int PCoreMax = 16;
    public const int ECoreMax = 16;

    private bool? _allAMD = null;
    private bool? _overdrive = null;

    public static uint GPUEco => AppConfig.IsVivoZenPro() ? GPUEcoVivo : GPUEcoROG;
    public static uint GPUMux => AppConfig.IsVivoZenPro() ? GPUMuxVivo : GPUMuxROG;

    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    private static extern IntPtr CreateFile(
        string lpFileName,
        uint dwDesiredAccess,
        uint dwShareMode,
        IntPtr lpSecurityAttributes,
        uint dwCreationDisposition,
        uint dwFlagsAndAttributes,
        IntPtr hTemplateFile
    );

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool DeviceIoControl(
        IntPtr hDevice,
        uint dwIoControlCode,
        byte[] lpInBuffer,
        uint nInBufferSize,
        byte[] lpOutBuffer,
        uint nOutBufferSize,
        ref uint lpBytesReturned,
        IntPtr lpOverlapped
    );

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool CloseHandle(IntPtr hObject);

    private const uint GENERIC_READ = 0x80000000;
    private const uint GENERIC_WRITE = 0x40000000;
    private const uint OPEN_EXISTING = 3;
    private const uint FILE_ATTRIBUTE_NORMAL = 0x80;
    private const uint FILE_SHARE_READ = 1;
    private const uint FILE_SHARE_WRITE = 2;

    private IntPtr handle;

    // Event handling attempt

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern IntPtr CreateEvent(IntPtr lpEventAttributes, bool bManualReset, bool bInitialState, string lpName);

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool WaitForSingleObject(IntPtr hHandle, int dwMilliseconds);

    private IntPtr eventHandle;
    private bool _connected = false;

    // still works only with asus optimization service on , if someone knows how to get ACPI events from asus without that - let me know
    public void RunListener()
    {

        eventHandle = CreateEvent(IntPtr.Zero, false, false, "ATK4001");

        byte[] outBuffer = new byte[16];
        byte[] data = new byte[8];
        bool result;

        data[0] = BitConverter.GetBytes(eventHandle.ToInt32())[0];
        data[1] = BitConverter.GetBytes(eventHandle.ToInt32())[1];

        Control(0x222400, data, outBuffer);
        Logger.WriteLine("ACPI :" + BitConverter.ToString(data) + "|" + BitConverter.ToString(outBuffer));

        while (true)
        {
            WaitForSingleObject(eventHandle, Timeout.Infinite);
            Control(0x222408, new byte[0], outBuffer);
            int code = BitConverter.ToInt32(outBuffer);
            Logger.WriteLine("ACPI Code: " + code);
        }
    }

    public bool IsConnected()
    {
        return _connected;
    }

    public AsusACPI()
    {
        try
        {
            handle = CreateFile(
                FILE_NAME,
                GENERIC_READ | GENERIC_WRITE,
                FILE_SHARE_READ | FILE_SHARE_WRITE,
                IntPtr.Zero,
                OPEN_EXISTING,
                FILE_ATTRIBUTE_NORMAL,
                IntPtr.Zero
            );

            //handle = new IntPtr(-1);
            //throw new Exception("ERROR");
            _connected = true;

        }
        catch (Exception ex)
        {
            Logger.WriteLine($"Can't connect to ACPI: {ex.Message}");
        }

        if (AppConfig.IsAdvantageEdition())
        {
            MaxTotal = 250;
        }

        if (AppConfig.IsG14AMD())
        {
            DefaultTotal = 125;
        }

        if (AppConfig.IsX13())
        {
            MaxTotal = 75;
            DefaultTotal = 50;
        }

        if (AppConfig.IsAlly())
        {
            MaxTotal = 50;
            DefaultTotal = 30;
        }

        if (AppConfig.IsIntelHX())
        {
            MaxTotal = 175;
        }

        if (AppConfig.DynamicBoost5())
        {
            MaxGPUBoost = 5;
        }

        if (AppConfig.DynamicBoost15())
        {
            MaxGPUBoost = 15;
        }

        if (AppConfig.DynamicBoost20())
        {
            MaxGPUBoost = 20;
        }

        if (AppConfig.IsAMDLight())
        {
            MaxTotal = 90;
        }

        if (AppConfig.IsZ1325())
        {
            MaxTotal = 93;
        }

        if (AppConfig.IsFA401EA())
        {
            MaxTotal = 115;
            MaxCPU = 115;
        }

    }

    public void Control(uint dwIoControlCode, byte[] lpInBuffer, byte[] lpOutBuffer)
    {

        uint lpBytesReturned = 0;
        DeviceIoControl(
            handle,
            dwIoControlCode,
            lpInBuffer,
            (uint)lpInBuffer.Length,
            lpOutBuffer,
            (uint)lpOutBuffer.Length,
            ref lpBytesReturned,
            IntPtr.Zero
        );
    }

    public void Close()
    {
        CloseHandle(handle);
    }


    protected byte[] CallMethod(uint MethodID, byte[] args)
    {
        byte[] acpiBuf = new byte[8 + args.Length];
        byte[] outBuffer = new byte[16];

        BitConverter.GetBytes((uint)MethodID).CopyTo(acpiBuf, 0);
        BitConverter.GetBytes((uint)args.Length).CopyTo(acpiBuf, 4);
        Array.Copy(args, 0, acpiBuf, 8, args.Length);

        // if (MethodID == DEVS)  Debug.WriteLine(BitConverter.ToString(acpiBuf, 0, acpiBuf.Length));

        Control(CONTROL_CODE, acpiBuf, outBuffer);

        return outBuffer;

    }

    public byte[] DeviceInit()
    {
        byte[] args = new byte[8];
        return CallMethod(INIT, args);

    }

    public byte[] DeviceWatchDog()
    {
        byte[] args = new byte[8];
        return CallMethod(WDOG, args);

    }

    public int DeviceSet(uint DeviceID, int Status, string? logName)
    {
        byte[] args = new byte[8];
        BitConverter.GetBytes((uint)DeviceID).CopyTo(args, 0);
        BitConverter.GetBytes((uint)Status).CopyTo(args, 4);

        byte[] status = CallMethod(DEVS, args);
        int result = BitConverter.ToInt32(status, 0);

        if (logName is not null)
            Logger.WriteLine(logName + " = " + Status + " : " + (result == 1 ? "OK" : result));

        return result;
    }


    public int DeviceSet(uint DeviceID, byte[] Params, string? logName)
    {
        byte[] args = new byte[4 + Params.Length];
        BitConverter.GetBytes((uint)DeviceID).CopyTo(args, 0);
        Params.CopyTo(args, 4);

        byte[] status = CallMethod(DEVS, args);
        int result = BitConverter.ToInt32(status, 0);

        if (logName is not null)
            Logger.WriteLine(logName + " = " + BitConverter.ToString(Params) + " : " + (result == 1 ? "OK" : result));

        return BitConverter.ToInt32(status, 0);
    }


    public int DeviceGet(uint DeviceID)
    {
        byte[] args = new byte[8];
        BitConverter.GetBytes((uint)DeviceID).CopyTo(args, 0);
        byte[] status = CallMethod(DSTS, args);

        return BitConverter.ToInt32(status, 0) - 65536;

    }

    public byte[] DeviceGetBuffer(uint DeviceID, uint Status = 0)
    {
        byte[] args = new byte[8];
        BitConverter.GetBytes((uint)DeviceID).CopyTo(args, 0);
        BitConverter.GetBytes((uint)Status).CopyTo(args, 4);

        return CallMethod(DSTS, args);
    }


    public decimal? GetBatteryDischarge()
    {
        var buffer = DeviceGetBuffer(BatteryDischarge);

        if (buffer[2] > 0)
        {
            buffer[2] = 0;
            return (decimal)BitConverter.ToInt16(buffer, 0) / 100;
        }
        else
        {
            return null;
        }
    }


    public int SetVivoMode(int mode)
    {
        if (mode == 1) mode = 2;
        else if (mode == 2) mode = 1;
        return Program.acpi.DeviceSet(VivoBookMode, mode, "VivoMode");
    }

    public int SetGPUEco(int eco)
    {
        uint ecoEndpoint = GPUEco;

        int ecoFlag = DeviceGet(ecoEndpoint);
        if (ecoFlag < 0) return -1;

        if (ecoFlag == 1 && eco == 0)
            return DeviceSet(ecoEndpoint, eco, "GPUEco");

        if (ecoFlag == 0 && eco == 1)
            return DeviceSet(ecoEndpoint, eco, "GPUEco");

        return -1;
    }

    public int GetFan(AsusFan device)
    {
        int fan = -1;

        switch (device)
        {
            case AsusFan.GPU:
                fan = Program.acpi.DeviceGet(GPU_Fan);
                break;
            case AsusFan.Mid:
                fan = Program.acpi.DeviceGet(Mid_Fan);
                break;
            default:
                fan = Program.acpi.DeviceGet(CPU_Fan);
                break;
        }

        if (fan < 0)
        {
            fan += 65536;
            if (fan <= 0 || fan > 100) fan = -1;
        }

        return fan;
    }


    public int SetFanRange(AsusFan device, byte[] curve)
    {

        if (curve.Length != 16) return -1;
        if (curve.All(singleByte => singleByte == 0)) return -1;

        byte min = (byte)(curve[8] * 255 / 100);
        byte max = (byte)(curve[15] * 255 / 100);
        byte[] range = { min, max };

        int result;
        switch (device)
        {
            case AsusFan.GPU:
                result = DeviceSet(DevsGPUFan, range, "FanRangeGPU");
                break;
            default:
                result = DeviceSet(DevsCPUFan, range, "FanRangeCPU");
                break;
        }

        return result;
    }


    public int SetFanCurve(AsusFan device, byte[] curve)
    {

        if (curve.Length != 16) return -1;
        if (curve.All(singleByte => singleByte == 0)) return -1;

        int result;

        int fanScale = AppConfig.Get("fan_scale", 100);

        if (fanScale != 100 && device == AsusFan.CPU) Logger.WriteLine("Custom fan scale: " + fanScale);

        for (int i = 8; i < curve.Length; i++) curve[i] = (byte)(Math.Max((byte)0, Math.Min((byte)100, curve[i])) * fanScale / 100);

        switch (device)
        {
            case AsusFan.GPU:
                result = DeviceSet(DevsGPUFanCurve, curve, "FanGPU");
                break;
            case AsusFan.Mid:
                result = DeviceSet(DevsMidFanCurve, curve, "FanMid");
                break;
            default:
                result = DeviceSet(DevsCPUFanCurve, curve, "FanCPU");
                break;
        }

        return result;
    }

    public byte[] GetFanCurve(AsusFan device, int mode = 0)
    {
        uint fan_mode;

        // because it's asus, and modes are swapped here
        switch (mode)
        {
            case 1: fan_mode = 2; break;
            case 2: fan_mode = 1; break;
            default: fan_mode = 0; break;
        }

        byte[] result;

        switch (device)
        {
            case AsusFan.GPU:
                result = DeviceGetBuffer(DevsGPUFanCurve, fan_mode);
                break;
            case AsusFan.Mid:
                result = DeviceGetBuffer(DevsMidFanCurve, fan_mode);
                break;
            default:
                result = DeviceGetBuffer(DevsCPUFanCurve, fan_mode);
                break;
        }

        //Logger.WriteLine($"GetFan {device} :" + BitConverter.ToString(result));

        return result;

    }

    public static bool IsInvalidCurve(byte[] curve)
    {
        return curve.Length != 16 || IsEmptyCurve(curve);
    }

    public static bool IsEmptyCurve(byte[] curve)
    {
        return curve.All(singleByte => singleByte == 0);
    }

    public static byte[] FixFanCurve(byte[] curve)
    {
        if (curve.Length != 16) throw new Exception("Incorrect curve");

        var points = new Dictionary<byte, byte>();
        byte old = 0;

        for (int i = 0; i < 8; i++)
        {
            if (curve[i] <= old) curve[i] = (byte)Math.Min(100, old + 6); // preventing 2 points in same spot from default asus profiles
            points[curve[i]] = curve[i + 8];
            old = curve[i];
        }

        var pointsFixed = new Dictionary<byte, byte>();
        bool fix = false;

        int count = 0;
        foreach (var pair in points.OrderBy(x => x.Key))
        {
            if (count == 0 && pair.Key >= 40)
            {
                fix = true;
                pointsFixed.Add(30, 0);
            }

            if (count != 3 || !fix)
                pointsFixed.Add(pair.Key, pair.Value);
            count++;
        }

        count = 0;
        foreach (var pair in pointsFixed.OrderBy(x => x.Key))
        {
            int x = pair.Key;

            if (AppConfig.IsClampFanDots())
            {
                int minX = 30 + (count * 10);
                int maxX = minX + 10;
                x = Math.Max(minX, Math.Min(maxX, x));
            }

            curve[count] = (byte)x;
            curve[count + 8] = pair.Value;
            count++;
        }

        return curve;

    }

    public bool IsXGConnected()
    {
        return DeviceGet(GPUXGConnected) == 1;
    }

    public bool IsAllAmdPPT()
    {
        if (_allAMD is null) _allAMD = DeviceGet(PPT_CPUB0) >= 0 && DeviceGet(PPT_GPUC0) < 0 && !AppConfig.IsAMDiGPU();
        return (bool)_allAMD;
    }

    public bool IsOverdriveSupported()
    {
        if (_overdrive is null) _overdrive = DeviceGet(ScreenOverdrive) >= 0;
        return (bool)_overdrive;
    }

    public bool IsNVidiaGPU()
    {
        return (!IsAllAmdPPT() && Program.acpi.DeviceGet(GPUEco) >= 0 && !AppConfig.IsAlly());
    }

    public void SetAPUMem(int memory = 4)
    {
        if (memory < 0 || memory > 8) return;

        int mem = 0;

        switch (memory)
        {
            case 0:
                mem = 0;
                break;
            case 1:
                mem = 258;
                break;
            case 2:
                mem = 259;
                break;
            case 3:
                mem = 260;
                break;
            case 4:
                mem = 261;
                break;
            case 5:
                mem = 263;
                break;
            case 6:
                mem = 264;
                break;
            case 7:
                mem = 265;
                break;
            case 8:
                mem = 262;
                break;
        }

        Program.acpi.DeviceSet(APU_MEM, mem, "APU Mem");
    }

    public int GetAPUMem()
    {
        int memory = Program.acpi.DeviceGet(APU_MEM);
        if (memory < 0) return -1;

        switch (memory)
        {
            case 256:
                return 0;
            case 258:
                return 1;
            case 259:
                return 2;
            case 260:
                return 3;
            case 261:
                return 4;
            case 262:
                return 8;
            case 263:
                return 5;
            case 264:
                return 6;
            case 265:
                return 7;
            default:
                return 4;
        }
    }

    public (int, int) GetCores(bool max = false)
    {
        int value = Program.acpi.DeviceGet(max ? CORES_MAX : CORES_CPU);
        //value = max ? 0x406 : 0x605;

        if (value < 0) return (-1, -1);
        Logger.WriteLine("Cores" + (max ? "Max" : "") + ": 0x" + value.ToString("X4"));

        return ((value >> 8) & 0xFF, (value) & 0xFF);
    }

    public void SetCores(int eCores, int pCores)
    {
        if (eCores < ECoreMin || eCores > ECoreMax || pCores < PCoreMin || pCores > PCoreMax)
        {
            Logger.WriteLine($"Incorrect Core config ({eCores}, {pCores})");
            return;
        };

        int value = (eCores << 8) | pCores;
        Program.acpi.DeviceSet(CORES_CPU, value, "Cores (0x" + value.ToString("X4") + ")");
    }

    public string ScanRange()
    {
        int value;
        string appPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\GHelper";
        string logFile = appPath + "\\scan.txt";
        using (StreamWriter w = File.AppendText(logFile))
        {
            w.WriteLine($"Scan started {DateTime.Now}");
            for (uint i = 0x00000000; i <= 0x00160000; i += 0x10000)
            {
                for (uint j = 0x00; j <= 0xFF; j++)
                {
                    uint id = i + j;
                    value = DeviceGet(id);
                    if (value >= 0)
                    {
                        w.WriteLine(id.ToString("X8") + ": " + value.ToString("X4") + " (" + value + ")");
                    }
                }
            }
            w.WriteLine($"---------------------");
            w.Close();
        }

        return logFile;

    }

    public void TUFKeyboardBrightness(int brightness, string log = "TUF Backlight")
    {
        int param = 0x80 | (brightness & 0x7F);
        DeviceSet(TUF_KB_BRIGHTNESS, param, log);

    }

    public void TUFKeyboardRGB(AuraMode mode, Color color, int speed, string? log = "TUF RGB")
    {

        byte[] setting = new byte[6];

        setting[0] = (byte)0xb4;
        setting[1] = (byte)mode;
        setting[2] = color.R;
        setting[3] = color.G;
        setting[4] = color.B;
        setting[5] = (byte)speed;

        int result = DeviceSet(TUF_KB, setting, log);
        if (result != 1)
        {
            setting[0] = (byte)0xb3;
            DeviceSet(TUF_KB2, setting, log);
            setting[0] = (byte)0xb4;
            DeviceSet(TUF_KB2, setting, log);
        }

    }

    const int ASUS_WMI_KEYBOARD_POWER_BOOT = 0x03 << 16;
    const int ASUS_WMI_KEYBOARD_POWER_AWAKE = 0x0C << 16;
    const int ASUS_WMI_KEYBOARD_POWER_SLEEP = 0x30 << 16;
    const int ASUS_WMI_KEYBOARD_POWER_SHUTDOWN = 0xC0 << 16;
    public void TUFKeyboardPower(bool awake = true, bool boot = false, bool sleep = false, bool shutdown = false)
    {
        int state = 0xbd;

        if (boot) state = state | ASUS_WMI_KEYBOARD_POWER_BOOT;
        if (awake) state = state | ASUS_WMI_KEYBOARD_POWER_AWAKE;
        if (sleep) state = state | ASUS_WMI_KEYBOARD_POWER_SLEEP;
        if (shutdown) state = state | ASUS_WMI_KEYBOARD_POWER_SHUTDOWN;

        state = state | 0x01 << 8;

        DeviceSet(TUF_KB_STATE, state, "TUF_KB");
        if (AppConfig.IsVivoZenPro() && DeviceGet(KBD_BACKLIGHT_OOBE) >= 0) DeviceSet(KBD_BACKLIGHT_OOBE, 1, "VIVO OOBE");
    }

    public void SubscribeToEvents(Action<object, EventArrivedEventArgs> EventHandler)
    {
        try
        {
            ManagementEventWatcher watcher = new ManagementEventWatcher();
            watcher.EventArrived += new EventArrivedEventHandler(EventHandler);
            watcher.Scope = new ManagementScope("root\\wmi");
            watcher.Query = new WqlEventQuery("SELECT * FROM AsusAtkWmiEvent");
            watcher.Start();
        }
        catch
        {
            Logger.WriteLine("Can't connect to ASUS WMI events");
        }
    }


}


================================================
FILE: app/AsusMouseSettings.Designer.cs
================================================
namespace GHelper
{
    partial class AsusMouseSettings
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            panelProfiles = new Panel();
            comboProfile = new GHelper.UI.RComboBox();
            labelProfile = new Label();
            panelPerformance = new Panel();
            panelPerformanceOther = new Panel();
            panelDeceleration = new Panel();
            labelDeceleration = new Label();
            sliderDeceleration = new GHelper.UI.Slider();
            labelDecelerationValue = new Label();
            panelAcceleration = new Panel();
            labelAcceleration = new Label();
            sliderAcceleration = new GHelper.UI.Slider();
            labelAccelerationValue = new Label();
            panelLiftOffDistance = new Panel();
            labelLiftOffDistance = new Label();
            comboBoxLiftOffDistance = new GHelper.UI.RComboBox();
            panelDebounce = new Panel();
            labelButtonDebounce = new Label();
            sliderButtonDebounce = new GHelper.UI.Slider();
            labelButtonDebounceValue = new Label();
            panelAngleSnapping = new Panel();
            panelMotionSync = new Panel();
            checkBoxMotionSync = new CheckBox();
            panelZoneMode = new Panel();
            checkBoxZoneMode = new CheckBox();
            comboBoxZoneModePollingRate = new GHelper.UI.RComboBox();
            sliderZoneModeDPI = new GHelper.UI.Slider();
            numericUpDownZoneModeDPI = new NumericUpDown();
            sliderAngleAdjustment = new GHelper.UI.Slider();
            checkBoxAngleSnapping = new CheckBox();
            labelAngleAdjustmentValue = new Label();
            panelPollingRate = new Panel();
            labelPollingRate = new Label();
            comboBoxPollingRate = new GHelper.UI.RComboBox();
            panelDPISettings = new Panel();
            sliderDPI = new GHelper.UI.Slider();
            tableLayoutPanel1 = new TableLayoutPanel();
            labelMinDPI = new Label();
            labelMaxDPI = new Label();
            numericUpDownCurrentDPI = new NumericUpDown();
            panelDPITile = new Panel();
            pictureDPIColor = new PictureBox();
            buttonDPIColor = new GHelper.UI.RButton();
            labelDPI = new Label();
            tableDPI = new TableLayoutPanel();
            buttonDPI2 = new GHelper.UI.RButton();
            buttonDPI1 = new GHelper.UI.RButton();
            buttonDPI3 = new GHelper.UI.RButton();
            buttonDPI4 = new GHelper.UI.RButton();
            panelPerformanceHeader = new Panel();
            pictureKeyboard = new PictureBox();
            labelPerformance = new Label();
            panelLighting = new Panel();
            panelLightingContent = new Panel();
            tableLayoutLightingZones = new TableLayoutPanel();
            buttonLightingZoneScroll = new GHelper.UI.RButton();
            buttonLightingZoneLogo = new GHelper.UI.RButton();
            buttonLightingZoneAll = new GHelper.UI.RButton();
            buttonLightingZoneUnderglow = new GHelper.UI.RButton();
            buttonLightingZoneDock = new GHelper.UI.RButton();
            comboBoxAnimationDirection = new GHelper.UI.RComboBox();
            labelAnimationDirection = new Label();
            checkBoxRandomColor = new CheckBox();
            comboBoxAnimationSpeed = new GHelper.UI.RComboBox();
            labelAnimationSpeed = new Label();
            pictureBoxLightingColor = new PictureBox();
            buttonLightingColor = new GHelper.UI.RButton();
            comboBoxLightingMode = new GHelper.UI.RComboBox();
            labelLightingMode = new Label();
            panelLightingHeader = new Panel();
            sliderBrightness = new GHelper.UI.Slider();
            pictureBoxLighting = new PictureBox();
            labelLighting = new Label();
            panelEnergy = new Panel();
            labelLowBatteryWarningValue = new Label();
            comboBoxAutoPowerOff = new GHelper.UI.RComboBox();
            sliderLowBatteryWarning = new GHelper.UI.Slider();
            labelLowBatteryWarning = new Label();
            labelAutoPowerOff = new Label();
            panelEnergyHeader = new Panel();
            pictureBoxEnergy = new PictureBox();
            labelEnergy = new Label();
            tableLayoutProfiles = new TableLayoutPanel();
            panelBatteryState = new Panel();
            labelChargingState = new Label();
            labelBatteryState = new Label();
            pictureBoxBatteryState = new PictureBox();
            buttonSync = new GHelper.UI.RButton();
            panelBottomButtons = new Panel();
            buttonImport = new GHelper.UI.RButton();
            buttonExport = new GHelper.UI.RButton();
            tableLayoutPanel2 = new TableLayoutPanel();
            rButton1 = new GHelper.UI.RButton();
            rButton2 = new GHelper.UI.RButton();
            panelProfiles.SuspendLayout();
            panelPerformance.SuspendLayout();
            panelPerformanceOther.SuspendLayout();
            panelDeceleration.SuspendLayout();
            panelAcceleration.SuspendLayout();
            panelLiftOffDistance.SuspendLayout();
            panelDebounce.SuspendLayout();
            panelAngleSnapping.SuspendLayout();
            panelMotionSync.SuspendLayout();
            panelZoneMode.SuspendLayout();
            panelPollingRate.SuspendLayout();
            panelDPISettings.SuspendLayout();
            tableLayoutPanel1.SuspendLayout();
            ((System.ComponentModel.ISupportInitialize)numericUpDownCurrentDPI).BeginInit();
            panelDPITile.SuspendLayout();
            ((System.ComponentModel.ISupportInitialize)pictureDPIColor).BeginInit();
            tableDPI.SuspendLayout();
            panelPerformanceHeader.SuspendLayout();
            ((System.ComponentModel.ISupportInitialize)pictureKeyboard).BeginInit();
            panelLighting.SuspendLayout();
            panelLightingContent.SuspendLayout();
            tableLayoutLightingZones.SuspendLayout();
            ((System.ComponentModel.ISupportInitialize)pictureBoxLightingColor).BeginInit();
            panelLightingHeader.SuspendLayout();
            ((System.ComponentModel.ISupportInitialize)pictureBoxLighting).BeginInit();
            panelEnergy.SuspendLayout();
            panelEnergyHeader.SuspendLayout();
            ((System.ComponentModel.ISupportInitialize)pictureBoxEnergy).BeginInit();
            tableLayoutProfiles.SuspendLayout();
            panelBatteryState.SuspendLayout();
            ((System.ComponentModel.ISupportInitialize)pictureBoxBatteryState).BeginInit();
            panelBottomButtons.SuspendLayout();
            tableLayoutPanel2.SuspendLayout();
            SuspendLayout();
            // 
            // panelProfiles
            // 
            panelProfiles.Controls.Add(comboProfile);
            panelProfiles.Controls.Add(labelProfile);
            panelProfiles.Location = new Point(444, 4);
            panelProfiles.Margin = new Padding(4);
            panelProfiles.MinimumSize = new Size(454, 0);
            panelProfiles.Name = "panelProfiles";
            panelProfiles.Size = new Size(454, 68);
            panelProfiles.TabIndex = 0;
            // 
            // comboProfile
            // 
            comboProfile.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right;
            comboProfile.BorderColor = Color.White;
            comboProfile.ButtonColor = Color.FromArgb(255, 255, 255);
            comboProfile.DropDownStyle = ComboBoxStyle.DropDownList;
            comboProfile.FlatStyle = FlatStyle.Flat;
            comboProfile.FormattingEnabled = true;
            comboProfile.Location = new Point(130, 14);
            comboProfile.Margin = new Padding(0);
            comboProfile.Name = "comboProfile";
            comboProfile.Size = new Size(302, 40);
            comboProfile.TabIndex = 43;
            // 
            // labelProfile
            // 
            labelProfile.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left;
            labelProfile.AutoSize = true;
            labelProfile.Font = new Font("Segoe UI", 9F, FontStyle.Bold);
            labelProfile.Location = new Point(4, 18);
            labelProfile.Margin = new Padding(4, 0, 4, 0);
            labelProfile.Name = "labelProfile";
            labelProfile.Size = new Size(90, 32);
            labelProfile.TabIndex = 41;
            labelProfile.Text = "Profile";
            // 
            // panelPerformance
            // 
            panelPerformance.AutoSize = true;
            panelPerformance.Controls.Add(panelPerformanceOther);
           
Download .txt
gitextract_q6r1djhm/

├── .gitattributes
├── .github/
│   ├── CODE_OF_CONDUCT.md
│   ├── CONTRIBUTING.md
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   ├── feature_request.yml
│   │   └── peripherals_request.yml
│   ├── SECURITY.md
│   └── workflows/
│       ├── build.yml
│       ├── codeql.yml
│       └── release.yml
├── .gitignore
├── LICENSE
├── app/
│   ├── .editorconfig
│   ├── Ally/
│   │   └── AllyControl.cs
│   ├── AnimeMatrix/
│   │   ├── AniMatrixControl.cs
│   │   ├── AnimeMatrixDevice.cs
│   │   ├── Communication/
│   │   │   ├── Device.cs
│   │   │   ├── Packet.cs
│   │   │   └── Platform/
│   │   │       ├── UsbProvider.cs
│   │   │       └── WindowsUsbProvider.cs
│   │   └── SlashDevice.cs
│   ├── App.config
│   ├── AppConfig.cs
│   ├── AsusACPI.cs
│   ├── AsusMouseSettings.Designer.cs
│   ├── AsusMouseSettings.cs
│   ├── AsusMouseSettings.resx
│   ├── AutoUpdate/
│   │   └── AutoUpdateControl.cs
│   ├── Battery/
│   │   └── BatteryControl.cs
│   ├── Display/
│   │   ├── AmdDisplay.cs
│   │   ├── ColorProfileHelper.cs
│   │   ├── DisplayGammaRamp.cs
│   │   ├── GammaRamp.cs
│   │   ├── ScreenBrightness.cs
│   │   ├── ScreenCCD.cs
│   │   ├── ScreenControl.cs
│   │   ├── ScreenInterrogatory.cs
│   │   ├── ScreenNative.cs
│   │   └── VisualControl.cs
│   ├── Extra.Designer.cs
│   ├── Extra.cs
│   ├── Extra.resx
│   ├── Fan/
│   │   └── FanSensorControl.cs
│   ├── Fans.Designer.cs
│   ├── Fans.cs
│   ├── Fans.resx
│   ├── GHelper.csproj
│   ├── GHelper.sln
│   ├── Gpu/
│   │   ├── AMD/
│   │   │   ├── AmdAdl2.cs
│   │   │   └── AmdGpuControl.cs
│   │   ├── GPUModeControl.cs
│   │   ├── IGpuControl.cs
│   │   └── NVidia/
│   │       ├── NvidiaGpuControl.cs
│   │       └── NvidiaSmi.cs
│   ├── Handheld.Designer.cs
│   ├── Handheld.cs
│   ├── Handheld.resx
│   ├── HardwareControl.cs
│   ├── Helpers/
│   │   ├── AsusService.cs
│   │   ├── Audio.cs
│   │   ├── ClamshellModeControl.cs
│   │   ├── ColorUtilities.cs
│   │   ├── DynamicLightingHelper.cs
│   │   ├── Logger.cs
│   │   ├── OSDBase.cs
│   │   ├── OnScreenKeyboard.cs
│   │   ├── ProcessHelper.cs
│   │   ├── RestrictedProcessHelper.cs
│   │   ├── Startup.cs
│   │   ├── ToastForm.cs
│   │   └── TouchscreenHelper.cs
│   ├── Input/
│   │   ├── InputDispatcher.cs
│   │   ├── KeyboardHook.cs
│   │   └── KeyboardListener.cs
│   ├── Matrix.Designer.cs
│   ├── Matrix.cs
│   ├── Matrix.resx
│   ├── Mode/
│   │   ├── ModeControl.cs
│   │   ├── Modes.cs
│   │   └── PowerNative.cs
│   ├── NativeMethods.cs
│   ├── Peripherals/
│   │   ├── IPeripheral.cs
│   │   ├── Mouse/
│   │   │   ├── AsusMouse.cs
│   │   │   └── Models/
│   │   │       ├── Chakram.cs
│   │   │       ├── ChakramCore.cs
│   │   │       ├── ChakramX.cs
│   │   │       ├── GladiusII.cs
│   │   │       ├── GladiusIIIAimpoint.cs
│   │   │       ├── GladiusIIIWireless.cs
│   │   │       ├── GladiusIIWireless.cs
│   │   │       ├── HarpeAceAimLab.cs
│   │   │       ├── HarpeAceMini.cs
│   │   │       ├── HarpeIIAce.cs
│   │   │       ├── KerisIIAce.cs
│   │   │       ├── KerisIIOrigin.cs
│   │   │       ├── KerisWireless.cs
│   │   │       ├── KerisWirelssAimpoint.cs
│   │   │       ├── Pugio.cs
│   │   │       ├── PugioII.cs
│   │   │       ├── SpathaX.cs
│   │   │       ├── StrixCarry.cs
│   │   │       ├── StrixEvolve.cs
│   │   │       ├── StrixImpact.cs
│   │   │       ├── StrixImpactII.cs
│   │   │       ├── StrixImpactIII.cs
│   │   │       ├── StrixImpactIIIWireless.cs
│   │   │       ├── StrixImpactIIWireless.cs
│   │   │       ├── TUFM3.cs
│   │   │       ├── TUFM4Air.cs
│   │   │       ├── TUFM4Wireless.cs
│   │   │       └── TUFM5.cs
│   │   └── PeripheralsProvider.cs
│   ├── Program.cs
│   ├── Properties/
│   │   ├── Resources.Designer.cs
│   │   ├── Resources.resx
│   │   ├── Settings.Designer.cs
│   │   ├── Settings.settings
│   │   ├── Strings.Designer.cs
│   │   ├── Strings.ar.resx
│   │   ├── Strings.da.resx
│   │   ├── Strings.de.resx
│   │   ├── Strings.es.resx
│   │   ├── Strings.fr.resx
│   │   ├── Strings.hu.resx
│   │   ├── Strings.id.resx
│   │   ├── Strings.it.resx
│   │   ├── Strings.ja.resx
│   │   ├── Strings.ko.resx
│   │   ├── Strings.lt.resx
│   │   ├── Strings.pl.resx
│   │   ├── Strings.pt-BR.resx
│   │   ├── Strings.pt-PT.resx
│   │   ├── Strings.resx
│   │   ├── Strings.ro.resx
│   │   ├── Strings.tr.resx
│   │   ├── Strings.uk.resx
│   │   ├── Strings.vi.resx
│   │   ├── Strings.zh-CN.resx
│   │   ├── Strings.zh-TW.resx
│   │   └── launchSettings.json
│   ├── Resources/
│   │   └── Font.otf
│   ├── Ryzen/
│   │   ├── OpenLibSys.cs
│   │   ├── RyzenControl.cs
│   │   ├── RyzenSmu.cs
│   │   └── SendCommand.cs
│   ├── Settings.Designer.cs
│   ├── Settings.cs
│   ├── Settings.resx
│   ├── UI/
│   │   ├── ControlHelper.cs
│   │   ├── CustomContextMenu.cs
│   │   ├── IconHelper.cs
│   │   ├── NumericUpDownWithUnit.cs
│   │   ├── RBadgeButton.cs
│   │   ├── RButton.cs
│   │   ├── RCheckBox.cs
│   │   ├── RComboBox.cs
│   │   ├── RForm.cs
│   │   ├── RForm.resx
│   │   └── Slider.cs
│   ├── USB/
│   │   ├── AsusHid.cs
│   │   ├── Aura.cs
│   │   └── XGM.cs
│   ├── Updates.Designer.cs
│   ├── Updates.cs
│   ├── Updates.resx
│   ├── WinRing0x64.sys
│   ├── app.manifest
│   └── global.json
├── crowdin.yml
└── docs/
    ├── README.ja-JP.md
    ├── README.md
    ├── README.zh-CN.md
    ├── _config.yml
    ├── _layouts/
    │   └── default.html
    ├── bloat.bat
    └── debloat.bat
Download .txt
Showing preview only (216K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2488 symbols across 116 files)

FILE: app/Ally/AllyControl.cs
  type ControllerMode (line 14) | public enum ControllerMode : int
  type BindingZone (line 23) | public enum BindingZone : byte
  class AllyControl (line 36) | public class AllyControl
    method AllyControl (line 300) | public AllyControl(SettingsForm settingsForm)
    method GetMaxTDP (line 313) | private int GetMaxTDP()
    method GetTDP (line 328) | private int GetTDP()
    method SetTDP (line 334) | private void SetTDP(int tdp, string log)
    method Timer_Elapsed (line 351) | private void Timer_Elapsed(object? sender, System.Timers.ElapsedEventA...
    method ToggleAutoTDP (line 403) | public void ToggleAutoTDP()
    method Init (line 417) | public void Init()
    method ToggleFPSLimit (line 430) | public void ToggleFPSLimit(bool toast = false)
    method ToggleBacklight (line 472) | public void ToggleBacklight()
    method DecodeBinding (line 478) | static private byte[] DecodeBinding(string binding = "")
    method BindZone (line 518) | static private void BindZone(BindingZone zone)
    method WakeUp (line 601) | static void WakeUp()
    method SetDeadzones (line 606) | static public void SetDeadzones()
    method DisableXBoxController (line 629) | public static void DisableXBoxController(bool disabled)
    method ApplyMode (line 634) | public static void ApplyMode(ControllerMode applyMode = ControllerMode...
    method SetMode (line 691) | private void SetMode(ControllerMode mode, bool init = false)
    method ToggleModeHotkey (line 707) | public void ToggleModeHotkey()
    method ToggleMode (line 721) | public void ToggleMode()

FILE: app/AnimeMatrix/AniMatrixControl.cs
  class AniMatrixControl (line 11) | public class AniMatrixControl : NAudio.CoreAudioApi.Interfaces.IMMNotifi...
    method AniMatrixControl (line 43) | public AniMatrixControl(SettingsForm settingsForm)
    method SetDevice (line 73) | public void SetDevice(bool wakeUp = false)
    method SetSlash (line 79) | public void SetSlash(bool wakeUp = false)
    method SetLidMode (line 166) | public void SetLidMode(bool force = false)
    method SetBatteryAuto (line 182) | public void SetBatteryAuto()
    method SetMatrix (line 194) | public void SetMatrix(bool wakeUp = false)
    method SetBuiltIn (line 255) | private void SetBuiltIn(int running)
    method StartMatrixTimer (line 267) | private void StartMatrixTimer(int interval = 100)
    method StopMatrixTimer (line 273) | private void StopMatrixTimer()
    method MatrixTimer_Elapsed (line 278) | private void MatrixTimer_Elapsed(object? sender, ElapsedEventArgs e)
    method SetMatrixClock (line 295) | public void SetMatrixClock()
    method SlashTimer_start (line 303) | private void SlashTimer_start(int interval = 180000)
    method SlashTimer_elapsed (line 327) | private void SlashTimer_elapsed(object? sender, ElapsedEventArgs e)
    method SlashTimer_tick (line 332) | private void SlashTimer_tick()
    method Dispose (line 348) | public void Dispose()
    method StopAudio (line 353) | void StopAudio()
    method SetAudio (line 400) | void SetAudio()
    method WaveIn_DataAvailable (line 441) | private void WaveIn_DataAvailable(object? sender, WaveInEventArgs e)
    method PresentAudio (line 475) | void PresentAudio(double[] audio)
    method OpenMatrixPicture (line 521) | public void OpenMatrixPicture()
    method SetMatrixPicture (line 552) | public void SetMatrixPicture(string fileName, bool visualise = true)
    method ProcessPicture (line 587) | protected void ProcessPicture(Image image)
    method OnDeviceStateChanged (line 645) | public void OnDeviceStateChanged(string deviceId, DeviceState newState)
    method OnDeviceAdded (line 650) | public void OnDeviceAdded(string pwstrDeviceId)
    method OnDeviceRemoved (line 655) | public void OnDeviceRemoved(string deviceId)
    method OnDefaultDeviceChanged (line 660) | public void OnDefaultDeviceChanged(DataFlow flow, Role role, string de...
    method OnPropertyValueChanged (line 684) | public void OnPropertyValueChanged(string pwstrDeviceId, PropertyKey key)

FILE: app/AnimeMatrix/AnimeMatrixDevice.cs
  class BuiltInAnimation (line 10) | public class BuiltInAnimation
    type Startup (line 12) | public enum Startup
    type Shutdown (line 18) | public enum Shutdown
    type Sleeping (line 24) | public enum Sleeping
    type Running (line 30) | public enum Running
    method BuiltInAnimation (line 38) | public BuiltInAnimation(
  type MatrixRotation (line 52) | public enum MatrixRotation
  class AnimeMatrixPacket (line 58) | internal class AnimeMatrixPacket : Packet
    method AnimeMatrixPacket (line 60) | public AnimeMatrixPacket(byte[] command)
  type AnimeType (line 66) | public enum AnimeType
  type BrightnessMode (line 75) | public enum BrightnessMode : byte
  class AnimeMatrixDevice (line 84) | public class AnimeMatrixDevice : Device
    method AddFontMemResourceEx (line 101) | [System.Runtime.InteropServices.DllImport("gdi32.dll")]
    method AnimeMatrixDevice (line 105) | public AnimeMatrixDevice() : base(0x0B05, 0x193B, 640)
    method WakeUp (line 144) | public void WakeUp()
    method SetBrightness (line 149) | public void SetBrightness(BrightnessMode mode)
    method SetDisplayState (line 154) | public void SetDisplayState(bool enable)
    method SetBuiltInAnimation (line 159) | public void SetBuiltInAnimation(bool enable)
    method SetBuiltInAnimation (line 164) | public void SetBuiltInAnimation(bool enable, BuiltInAnimation animation)
    method Present (line 170) | public void Present()
    method LoadMFont (line 194) | private void LoadMFont()
    method PresentNextFrame (line 207) | public void PresentNextFrame()
    method ClearFrames (line 215) | public void ClearFrames()
    method AddFrame (line 221) | public void AddFrame()
    method Width (line 226) | public int Width(int y)
    method FirstX (line 241) | public int FirstX(int y)
    method Pitch (line 263) | public int Pitch(int y)
    method RowToLinearAddress (line 304) | public int RowToLinearAddress(int y)
    method SetLedPlanar (line 313) | public void SetLedPlanar(int x, int y, byte value)
    method SetLedDiagonal (line 321) | public void SetLedDiagonal(int x, int y, byte color, int deltaX = 0, i...
    method SetLedLinear (line 335) | public void SetLedLinear(int address, byte value)
    method Clear (line 342) | public void Clear(bool present = false)
    method SetBitmapDiagonal (line 348) | private void SetBitmapDiagonal(Bitmap bmp, int deltaX = 0, int deltaY ...
    method SetBitmapLinear (line 362) | private void SetBitmapLinear(Bitmap bmp, int contrast = 100, int gamma...
    method Text (line 377) | public void Text(string text, float fontSize = 10, int x = 0, int y = 0)
    method PresentClock (line 406) | public void PresentClock()
    method DrawBar (line 429) | public void DrawBar(int pos, double h)
    method DrawBarPlanar (line 443) | public void DrawBarPlanar(int pos, double h)
    method DrawBarDiagonal (line 459) | public void DrawBarDiagonal(int pos, double h)
    method GenerateFrame (line 474) | public void GenerateFrame(Image image, float zoom = 100, int panX = 0,...
    method GenerateFrameDiagonal (line 505) | public void GenerateFrameDiagonal(Image image, float zoom = 100, int p...
    method IsRowInRange (line 537) | private bool IsRowInRange(int row)
    method IsAddressableLed (line 542) | private bool IsAddressableLed(int address)

FILE: app/AnimeMatrix/Communication/Device.cs
  class Device (line 7) | public abstract class Device : IDisposable
    method Device (line 15) | protected Device(ushort vendorId, ushort productId)
    method Device (line 21) | protected Device(ushort vendorId, ushort productId, int maxFeatureRepo...
    method VendorID (line 29) | public ushort VendorID()
    method ProductID (line 34) | public ushort ProductID()
    method SetProvider (line 39) | public virtual void SetProvider()
    method Packet (line 44) | protected T Packet<T>(params byte[] command) where T : Packet
    method Set (line 49) | public void Set(Packet packet)
    method Get (line 52) | public byte[] Get(Packet packet)
    method Read (line 55) | public void Read(byte[] data)
    method Write (line 57) | public void Write(byte[] data)
    method Dispose (line 60) | public virtual void Dispose()

FILE: app/AnimeMatrix/Communication/Packet.cs
  class Packet (line 5) | public abstract class Packet
    method Packet (line 11) | internal Packet(byte reportId, int packetLength, params byte[] data)
    method AppendData (line 38) | public Packet AppendData(params byte[] data)
    method AppendData (line 41) | public Packet AppendData(out int bytesWritten, params byte[] data)

FILE: app/AnimeMatrix/Communication/Platform/UsbProvider.cs
  class UsbProvider (line 3) | public abstract class UsbProvider : IDisposable
    method UsbProvider (line 8) | protected UsbProvider(ushort vendorId, ushort productId)
    method Set (line 14) | public abstract void Set(byte[] data);
    method Get (line 15) | public abstract byte[] Get(byte[] data);
    method Read (line 16) | public abstract void Read(byte[] data);
    method Write (line 17) | public abstract void Write(byte[] data);
    method Dispose (line 19) | public abstract void Dispose();

FILE: app/AnimeMatrix/Communication/Platform/WindowsUsbProvider.cs
  class WindowsUsbProvider (line 6) | internal class WindowsUsbProvider : UsbProvider
    method WindowsUsbProvider (line 11) | public WindowsUsbProvider(ushort vendorId, ushort productId, string pa...
    method WindowsUsbProvider (line 32) | public WindowsUsbProvider(ushort vendorId, ushort productId, int maxFe...
    method Set (line 55) | public override void Set(byte[] data)
    method Get (line 64) | public override byte[] Get(byte[] data)
    method Read (line 78) | public override void Read(byte[] data)
    method Write (line 86) | public override void Write(byte[] data)
    method Dispose (line 95) | public override void Dispose()
    method WrapException (line 100) | private void WrapException(Action action)

FILE: app/AnimeMatrix/SlashDevice.cs
  type SlashMode (line 7) | public enum SlashMode
  class SlashPacket (line 33) | public class SlashPacket : Packet
    method SlashPacket (line 35) | public SlashPacket(byte[] command, byte reportID = 0x5E) : base(report...
  class SlashDevice (line 41) | public class SlashDevice : Device
    method CreatePacket (line 46) | protected virtual SlashPacket CreatePacket(byte[] command)
    method SlashDevice (line 112) | public SlashDevice(ushort productId = 0x193B) : base(0x0B05, productId...
    method WakeUp (line 116) | public void WakeUp()
    method Init (line 123) | public void Init()
    method SetEnabled (line 129) | public void SetEnabled(bool status = true)
    method Save (line 134) | public void Save()
    method SetMode (line 139) | public void SetMode(SlashMode mode)
    method GetPercentagePattern (line 157) | private byte[] GetPercentagePattern(int brightness, double percentage)
    method SetBatteryPattern (line 177) | public void SetBatteryPattern(int brightness)
    method SetEmpty (line 182) | public void SetEmpty()
    method SetAudioPattern (line 187) | public void SetAudioPattern(int brightness, double bass, double treble)
    method SetCustom (line 201) | public void SetCustom(byte[] data, string? log = "Static Data")
    method ContinueCustom (line 209) | public void ContinueCustom(byte[] data, string? log)
    method SetOptions (line 215) | public void SetOptions(bool status, int brightness = 0, int interval = 0)
    method SetBatterySaver (line 222) | public void SetBatterySaver(bool status)
    method SetLidCloseAnimation (line 227) | public void SetLidCloseAnimation(bool status)
    method SetSleepActive (line 232) | public void SetSleepActive(bool status)
    method Set (line 238) | public void Set(Packet packet, string? log = null)
  class SlashDeviceAura (line 245) | public class SlashDeviceAura : SlashDevice
    method SlashDeviceAura (line 249) | public SlashDeviceAura() : base(0x19B6)
    method CreatePacket (line 253) | protected override SlashPacket CreatePacket(byte[] command)

FILE: app/AppConfig.cs
  class AppConfig (line 6) | public static class AppConfig
    method AppConfig (line 19) | static AppConfig()
    method Timer_Elapsed (line 72) | private static void Timer_Elapsed(object? sender, System.Timers.Elapse...
    method GetModel (line 124) | public static string GetModel()
    method GetBiosAndModel (line 151) | public static (string, string) GetBiosAndModel()
    method GetModelShort (line 179) | public static string GetModelShort()
    method ContainsModel (line 187) | public static bool ContainsModel(string contains)
    method Init (line 194) | private static void Init()
    method Exists (line 202) | public static bool Exists(string name)
    method Get (line 207) | public static int Get(string name, int empty = -1)
    method Is (line 221) | public static bool Is(string name)
    method IsNotFalse (line 226) | public static bool IsNotFalse(string name)
    method IsOnBattery (line 231) | public static bool IsOnBattery(string zone)
    method GetString (line 236) | public static string GetString(string name, string empty = null)
    method Write (line 243) | private static void Write()
    method Set (line 249) | public static void Set(string name, int value)
    method Set (line 255) | public static void Set(string name, string value)
    method Remove (line 260) | public static void Remove(string name)
    method RemoveMode (line 266) | public static void RemoveMode(string name)
    method GgetParamName (line 271) | public static string GgetParamName(AsusFan device, string paramName = ...
    method GetFanConfig (line 296) | public static byte[] GetFanConfig(AsusFan device)
    method SetFanConfig (line 307) | public static void SetFanConfig(AsusFan device, byte[] curve)
    method StringToBytes (line 314) | public static byte[] StringToBytes(string str)
    method GetDefaultCurve (line 322) | public static byte[] GetDefaultCurve(AsusFan device)
    method GetModeString (line 357) | public static string GetModeString(string name)
    method GetMode (line 362) | public static int GetMode(string name, int empty = -1)
    method IsMode (line 367) | public static bool IsMode(string name)
    method SetMode (line 372) | public static void SetMode(string name, int value)
    method SetMode (line 377) | public static void SetMode(string name, string value)
    method IsAlly (line 382) | public static bool IsAlly()
    method NoMKeys (line 387) | public static bool NoMKeys()
    method IsARCNM (line 398) | public static bool IsARCNM()
    method IsTUF (line 403) | public static bool IsTUF()
    method IsProArt (line 408) | public static bool IsProArt()
    method IsVivoZenbook (line 413) | public static bool IsVivoZenbook()
    method IsVivoZenPro (line 418) | public static bool IsVivoZenPro()
    method IsHardwareFnLock (line 423) | public static bool IsHardwareFnLock()
    method SwappedBrightness (line 429) | public static bool SwappedBrightness()
    method IsDUO (line 435) | public static bool IsDUO()
    method IsM4Button (line 440) | public static bool IsM4Button()
    method NoAura (line 446) | public static bool NoAura()
    method MediaKeys (line 451) | public static bool MediaKeys()
    method IsSingleColor (line 456) | public static bool IsSingleColor()
    method IsSleepBacklight (line 461) | public static bool IsSleepBacklight()
    method IsAnimeMatrix (line 466) | public static bool IsAnimeMatrix()
    method IsSlash (line 471) | public static bool IsSlash()
    method IsSlashAura (line 476) | public static bool IsSlashAura()
    method IsInputBacklight (line 481) | public static bool IsInputBacklight()
    method IsInvertedFNLock (line 486) | public static bool IsInvertedFNLock()
    method IsOLED (line 491) | public static bool IsOLED()
    method IsNoOverdrive (line 496) | public static bool IsNoOverdrive()
    method IsNoSleepEvent (line 501) | public static bool IsNoSleepEvent()
    method IsStrix (line 506) | public static bool IsStrix()
    method IsAdvancedRGB (line 511) | public static bool IsAdvancedRGB()
    method IsBacklightZones (line 516) | public static bool IsBacklightZones()
    method IsStrixLimitedRGB (line 521) | public static bool IsStrixLimitedRGB()
    method IsPossible4ZoneRGB (line 526) | public static bool IsPossible4ZoneRGB()
    method Is4ZoneRGB (line 531) | public static bool Is4ZoneRGB()
    method IsHardwareHotkeys (line 536) | public static bool IsHardwareHotkeys()
    method NoWMI (line 541) | public static bool NoWMI()
    method IsNoDirectRGB (line 546) | public static bool IsNoDirectRGB()
    method IsStrixNumpad (line 551) | public static bool IsStrixNumpad()
    method IsZ1325 (line 556) | public static bool IsZ1325()
    method IsZ13 (line 561) | public static bool IsZ13()
    method IsPZ13 (line 566) | public static bool IsPZ13()
    method IsS17 (line 571) | public static bool IsS17()
    method HasTabletMode (line 576) | public static bool HasTabletMode()
    method IsX13 (line 581) | public static bool IsX13()
    method IsG14AMD (line 586) | public static bool IsG14AMD()
    method DynamicBoost5 (line 591) | public static bool DynamicBoost5()
    method DynamicBoost15 (line 596) | public static bool DynamicBoost15()
    method DynamicBoost20 (line 602) | public static bool DynamicBoost20()
    method IsAdvantageEdition (line 607) | public static bool IsAdvantageEdition()
    method NoAutoUltimate (line 612) | public static bool NoAutoUltimate()
    method IsAlwaysUltimate (line 617) | public static bool IsAlwaysUltimate()
    method IsManualModeRequired (line 622) | public static bool IsManualModeRequired()
    method IsResetRequired (line 628) | public static bool IsResetRequired()
    method IsFanRequired (line 633) | public static bool IsFanRequired()
    method IsAMDLight (line 638) | public static bool IsAMDLight()
    method IsPowerRequired (line 643) | public static bool IsPowerRequired()
    method IsModeReapplyRequired (line 648) | public static bool IsModeReapplyRequired()
    method IsGPUFix (line 653) | public static bool IsGPUFix()
    method IsShutdownReset (line 658) | public static bool IsShutdownReset()
    method IsNVPlatform (line 663) | public static bool IsNVPlatform()
    method IsForceSetGPUMode (line 668) | public static bool IsForceSetGPUMode()
    method IsAMDiGPU (line 673) | public static bool IsAMDiGPU()
    method NoGpu (line 678) | public static bool NoGpu()
    method IsFA401EA (line 683) | public static bool IsFA401EA()
    method IsHardwareTouchpadToggle (line 688) | public static bool IsHardwareTouchpadToggle()
    method IsIntelHX (line 693) | public static bool IsIntelHX()
    method Is8Ecores (line 698) | public static bool Is8Ecores()
    method IsNoFNV (line 703) | public static bool IsNoFNV()
    method IsROG (line 708) | public static bool IsROG()
    method IsASUS (line 712) | public static bool IsASUS()
    method IsBWIcon (line 717) | public static bool IsBWIcon()
    method IsStopAC (line 722) | public static bool IsStopAC()
    method IsChargeLimit6080 (line 727) | public static bool IsChargeLimit6080()
    method IsDynamicLighting (line 734) | public static bool IsDynamicLighting()
    method IsDynamicLightingOnly (line 739) | public static bool IsDynamicLightingOnly()
    method IsDynamicLightingInit (line 744) | public static bool IsDynamicLightingInit()
    method IsForceMiniled (line 749) | public static bool IsForceMiniled()
    method SaveDimming (line 753) | public static bool SaveDimming()
    method IsAutoStatusLed (line 758) | public static bool IsAutoStatusLed()
    method IsClampFanDots (line 763) | public static bool IsClampFanDots()

FILE: app/AsusACPI.cs
  type AsusFan (line 6) | public enum AsusFan
  type AsusMode (line 14) | public enum AsusMode
  type AsusGPU (line 21) | public enum AsusGPU
  class AsusACPI (line 28) | public class AsusACPI
    method CreateFile (line 191) | [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unic...
    method DeviceIoControl (line 202) | [DllImport("kernel32.dll", SetLastError = true)]
    method CloseHandle (line 214) | [DllImport("kernel32.dll", SetLastError = true)]
    method CreateEvent (line 228) | [DllImport("kernel32.dll", SetLastError = true)]
    method WaitForSingleObject (line 231) | [DllImport("kernel32.dll", SetLastError = true)]
    method RunListener (line 238) | public void RunListener()
    method IsConnected (line 262) | public bool IsConnected()
    method AsusACPI (line 267) | public AsusACPI()
    method Control (line 351) | public void Control(uint dwIoControlCode, byte[] lpInBuffer, byte[] lp...
    method Close (line 367) | public void Close()
    method CallMethod (line 373) | protected byte[] CallMethod(uint MethodID, byte[] args)
    method DeviceInit (line 390) | public byte[] DeviceInit()
    method DeviceWatchDog (line 397) | public byte[] DeviceWatchDog()
    method DeviceSet (line 404) | public int DeviceSet(uint DeviceID, int Status, string? logName)
    method DeviceSet (line 420) | public int DeviceSet(uint DeviceID, byte[] Params, string? logName)
    method DeviceGet (line 436) | public int DeviceGet(uint DeviceID)
    method DeviceGetBuffer (line 446) | public byte[] DeviceGetBuffer(uint DeviceID, uint Status = 0)
    method GetBatteryDischarge (line 456) | public decimal? GetBatteryDischarge()
    method SetVivoMode (line 472) | public int SetVivoMode(int mode)
    method SetGPUEco (line 479) | public int SetGPUEco(int eco)
    method GetFan (line 495) | public int GetFan(AsusFan device)
    method SetFanRange (line 522) | public int SetFanRange(AsusFan device, byte[] curve)
    method SetFanCurve (line 547) | public int SetFanCurve(AsusFan device, byte[] curve)
    method GetFanCurve (line 577) | public byte[] GetFanCurve(AsusFan device, int mode = 0)
    method IsInvalidCurve (line 610) | public static bool IsInvalidCurve(byte[] curve)
    method IsEmptyCurve (line 615) | public static bool IsEmptyCurve(byte[] curve)
    method FixFanCurve (line 620) | public static byte[] FixFanCurve(byte[] curve)
    method IsXGConnected (line 672) | public bool IsXGConnected()
    method IsAllAmdPPT (line 677) | public bool IsAllAmdPPT()
    method IsOverdriveSupported (line 683) | public bool IsOverdriveSupported()
    method IsNVidiaGPU (line 689) | public bool IsNVidiaGPU()
    method SetAPUMem (line 694) | public void SetAPUMem(int memory = 4)
    method GetAPUMem (line 734) | public int GetAPUMem()
    method GetCores (line 764) | public (int, int) GetCores(bool max = false)
    method SetCores (line 775) | public void SetCores(int eCores, int pCores)
    method ScanRange (line 787) | public string ScanRange()
    method TUFKeyboardBrightness (line 815) | public void TUFKeyboardBrightness(int brightness, string log = "TUF Ba...
    method TUFKeyboardRGB (line 822) | public void TUFKeyboardRGB(AuraMode mode, Color color, int speed, stri...
    method TUFKeyboardPower (line 849) | public void TUFKeyboardPower(bool awake = true, bool boot = false, boo...
    method SubscribeToEvents (line 864) | public void SubscribeToEvents(Action<object, EventArrivedEventArgs> Ev...

FILE: app/AsusMouseSettings.Designer.cs
  class AsusMouseSettings (line 3) | partial class AsusMouseSettings
    method Dispose (line 14) | protected override void Dispose(bool disposing)
    method InitializeComponent (line 29) | private void InitializeComponent()

FILE: app/AsusMouseSettings.cs
  class AsusMouseSettings (line 6) | public partial class AsusMouseSettings : RForm
    method AsusMouseSettings (line 27) | public AsusMouseSettings(AsusMouse mouse)
    method SliderAcceleration_MouseUp (line 134) | private void SliderAcceleration_MouseUp(object? sender, MouseEventArgs e)
    method SliderAcceleration_ValueChanged (line 139) | private void SliderAcceleration_ValueChanged(object? sender, EventArgs e)
    method SliderDeceleration_MouseUp (line 144) | private void SliderDeceleration_MouseUp(object? sender, MouseEventArgs e)
    method SliderDeceleration_ValueChanged (line 149) | private void SliderDeceleration_ValueChanged(object? sender, EventArgs e)
    method SliderButtonDebounce_MouseUp (line 154) | private void SliderButtonDebounce_MouseUp(object? sender, MouseEventAr...
    method SliderButtonDebounce_ValueChanged (line 160) | private void SliderButtonDebounce_ValueChanged(object? sender, EventAr...
    method SwitchLightingZone (line 168) | private void SwitchLightingZone(LightingZone zone)
    method ButtonLightingZoneScroll_Click (line 179) | private void ButtonLightingZoneScroll_Click(object? sender, EventArgs e)
    method ButtonLightingZoneUnderglow_Click (line 184) | private void ButtonLightingZoneUnderglow_Click(object? sender, EventAr...
    method ButtonLightingZoneLogo_Click (line 189) | private void ButtonLightingZoneLogo_Click(object? sender, EventArgs e)
    method ButtonLightingZoneDock_Click (line 194) | private void ButtonLightingZoneDock_Click(object? sender, EventArgs e)
    method ButtonLightingZoneAll_Click (line 199) | private void ButtonLightingZoneAll_Click(object? sender, EventArgs e)
    method AsusMouseSettings_FormClosing (line 204) | private void AsusMouseSettings_FormClosing(object? sender, FormClosing...
    method Mouse_MouseReadyChanged (line 211) | private void Mouse_MouseReadyChanged(object? sender, EventArgs e)
    method Mouse_BatteryUpdated (line 226) | private void Mouse_BatteryUpdated(object? sender, EventArgs e)
    method ComboProfile_DropDownClosed (line 239) | private void ComboProfile_DropDownClosed(object? sender, EventArgs e)
    method ComboBoxPollingRate_DropDownClosed (line 250) | private void ComboBoxPollingRate_DropDownClosed(object? sender, EventA...
    method ButtonDPIColor_Click (line 256) | private void ButtonDPIColor_Click(object? sender, EventArgs e)
    method IsOverDeleteArea (line 277) | bool IsOverDeleteArea(Control btn, Point p)
    method DpiButton_MouseMove (line 285) | private void DpiButton_MouseMove(object? sender, MouseEventArgs e)
    method DpiButton_Paint (line 294) | private void DpiButton_Paint(object? sender, PaintEventArgs e)
    method ButtonDPI_Click (line 314) | private void ButtonDPI_Click(object? sender, EventArgs e)
    method UpdateLightingSettings (line 363) | private void UpdateLightingSettings(LightingSetting settings, Lighting...
    method CheckBoxRandomColor_CheckedChanged (line 369) | private void CheckBoxRandomColor_CheckedChanged(object? sender, EventA...
    method ComboBoxAnimationDirection_DropDownClosed (line 377) | private void ComboBoxAnimationDirection_DropDownClosed(object? sender,...
    method ComboBoxAnimationSpeed_DropDownClosed (line 385) | private void ComboBoxAnimationSpeed_DropDownClosed(object? sender, Eve...
    method SliderBrightness_MouseUp (line 395) | private void SliderBrightness_MouseUp(object? sender, MouseEventArgs e)
    method ComboBoxLightingMode_DropDownClosed (line 403) | private void ComboBoxLightingMode_DropDownClosed(object? sender, Event...
    method ButtonLightingColor_Click (line 425) | private void ButtonLightingColor_Click(object? sender, EventArgs e)
    method SliderLowBatteryWarning_ValueChanged (line 442) | private void SliderLowBatteryWarning_ValueChanged(object? sender, Even...
    method SliderLowBatteryWarning_MouseUp (line 447) | private void SliderLowBatteryWarning_MouseUp(object? sender, MouseEven...
    method ComboBoxAutoPowerOff_DropDownClosed (line 453) | private void ComboBoxAutoPowerOff_DropDownClosed(object? sender, Event...
    method SliderAngleAdjustment_ValueChanged (line 466) | private void SliderAngleAdjustment_ValueChanged(object? sender, EventA...
    method SliderAngleAdjustment_MouseUp (line 471) | private void SliderAngleAdjustment_MouseUp(object? sender, MouseEventA...
    method ComboBoxLiftOffDistance_DropDownClosed (line 476) | private void ComboBoxLiftOffDistance_DropDownClosed(object? sender, Ev...
    method CheckAngleSnapping_CheckedChanged (line 481) | private void CheckAngleSnapping_CheckedChanged(object? sender, EventAr...
    method CheckBoxMotionSync_CheckedChanged (line 487) | private void CheckBoxMotionSync_CheckedChanged(object? sender, EventAr...
    method CheckBoxZoneMode_CheckedChanged (line 492) | private void CheckBoxZoneMode_CheckedChanged(object? sender, EventArgs e)
    method SliderZoneModeDPI_ValueChanged (line 498) | private void SliderZoneModeDPI_ValueChanged(object? sender, EventArgs e)
    method SliderZoneModeDPI_MouseUp (line 503) | private void SliderZoneModeDPI_MouseUp(object? sender, MouseEventArgs e)
    method NumericUpDownZoneModeDPI_ValueChanged (line 512) | private void NumericUpDownZoneModeDPI_ValueChanged(object? sender, Eve...
    method ComboBoxZoneModePollingRate_DropDownClosed (line 522) | private void ComboBoxZoneModePollingRate_DropDownClosed(object? sender...
    method SliderDPI_ValueChanged (line 535) | private void SliderDPI_ValueChanged(object? sender, EventArgs e)
    method NumericUpDownCurrentDPI_ValueChanged (line 541) | private void NumericUpDownCurrentDPI_ValueChanged(object? sender, Even...
    method SliderDPI_MouseDown (line 546) | private void SliderDPI_MouseDown(object? sender, MouseEventArgs e)
    method SliderDPI_MouseUp (line 551) | private void SliderDPI_MouseUp(object? sender, MouseEventArgs e)
    method UpdateMouseDPISettings (line 557) | private void UpdateMouseDPISettings()
    method Mouse_Disconnect (line 572) | private void Mouse_Disconnect(object? sender, EventArgs e)
    method RefreshMouseData (line 586) | private void RefreshMouseData()
    method InitMouseCapabilities (line 607) | private void InitMouseCapabilities()
    method InitLightingModes (line 810) | private void InitLightingModes()
    method VisualizeMouseSettings (line 825) | private void VisualizeMouseSettings()
    method UpdateMotionSyncState (line 925) | private void UpdateMotionSyncState()
    method UpdateZoneModeUIState (line 937) | private void UpdateZoneModeUIState()
    method VisualizeBatteryState (line 957) | private void VisualizeBatteryState()
    method VisusalizeLightingZones (line 977) | public void VisusalizeLightingZones()
    method VisusalizeLightingSettings (line 1000) | private void VisusalizeLightingSettings()
    method VisualizeDPIButtons (line 1059) | private void VisualizeDPIButtons()
    method VisualizeCurrentDPIProfile (line 1110) | private void VisualizeCurrentDPIProfile()
    method AsusMouseSettings_Shown (line 1138) | private void AsusMouseSettings_Shown(object? sender, EventArgs e)
    method ButtonSync_Click (line 1158) | private void ButtonSync_Click(object sender, EventArgs e)
    method buttonImport_Click (line 1163) | private void buttonImport_Click(object sender, EventArgs e)
    method buttonExport_Click (line 1204) | private void buttonExport_Click(object sender, EventArgs e)

FILE: app/AutoUpdate/AutoUpdateControl.cs
  class AutoUpdateControl (line 10) | public class AutoUpdateControl
    method AutoUpdateControl (line 20) | public AutoUpdateControl(SettingsForm settingsForm)
    method CheckForUpdates (line 27) | public void CheckForUpdates()
    method Update (line 40) | public void Update()
    method LoadReleases (line 54) | public void LoadReleases()
    method CheckForUpdatesAsync (line 66) | async void CheckForUpdatesAsync(bool force = false)
    method EscapeString (line 140) | public static string EscapeString(string input)
    method AutoUpdate (line 145) | async void AutoUpdate(string requestUri)

FILE: app/Battery/BatteryControl.cs
  class BatteryControl (line 5) | public static class BatteryControl
    method ToggleBatteryLimitFull (line 22) | public static void ToggleBatteryLimitFull()
    method SetBatteryLimitFull (line 28) | public static void SetBatteryLimitFull()
    method UnSetBatteryLimitFull (line 35) | public static void UnSetBatteryLimitFull()
    method AutoBattery (line 42) | public static void AutoBattery(bool init = false)
    method SetBatteryChargeLimit (line 48) | public static void SetBatteryChargeLimit(int limit = -1)
    method BatteryReport (line 69) | public static void BatteryReport()

FILE: app/Display/AmdDisplay.cs
  class AmdDisplay (line 5) | public static class AmdDisplay
    method GetAdjustmentPath (line 13) | private static string GetAdjustmentPath()
    method IsOledPowerOptimization (line 43) | public static bool IsOledPowerOptimization()
    method RunAdrenaline (line 66) | public static void RunAdrenaline()

FILE: app/Display/ColorProfileHelper.cs
  class ColorProfileHelper (line 6) | public static class ColorProfileHelper
    method GetProfileUrl (line 8) | public static string? GetProfileUrl(string model)
    method ProfileExists (line 623) | public static bool ProfileExists()
    method InstallProfile (line 630) | public static async Task InstallProfile()
    method DownloadAndExtractZip (line 646) | static async Task DownloadAndExtractZip(string zipUrl, string extractP...

FILE: app/Display/DisplayGammaRamp.cs
  class DisplayGammaRamp (line 4) | public class DisplayGammaRamp
    method DisplayGammaRamp (line 7) | public DisplayGammaRamp(ushort[] red, ushort[] green, ushort[] blue)
    method DisplayGammaRamp (line 29) | public DisplayGammaRamp(double brightness = 1, double contrast = 1, do...
    method DisplayGammaRamp (line 38) | public DisplayGammaRamp(
    method DisplayGammaRamp (line 57) | internal DisplayGammaRamp(GammaRamp ramp) :
    method CalculateLUT (line 64) | private static ushort[] CalculateLUT(double brightness, double contras...
    method IsOriginal (line 75) | public bool IsOriginal()
    method Brightness (line 83) | private static ushort[] Brightness(ushort[] data, double brightness)
    method AsBrightnessRamp (line 96) | internal GammaRamp AsBrightnessRamp(double brightness)
    method AsRamp (line 105) | internal GammaRamp AsRamp()

FILE: app/Display/GammaRamp.cs
  type GammaRamp (line 6) | [StructLayout(LayoutKind.Sequential)]
    method GammaRamp (line 18) | public GammaRamp(ushort[] red, ushort[] green, ushort[] blue)

FILE: app/Display/ScreenBrightness.cs
  class ScreenBrightness (line 7) | public static class ScreenBrightness
    method Get (line 9) | public static int Get()
    method Set (line 23) | public static void Set(int brightness)
    method Adjust (line 37) | public static int Adjust(int delta)

FILE: app/Display/ScreenCCD.cs
  class ScreenCCD (line 6) | public class ScreenCCD
    method GetHDRStatus (line 9) | public static bool GetHDRStatus(bool log = true)
    type DISPLAYCONFIG_DEVICE_INFO_TYPE (line 62) | private enum DISPLAYCONFIG_DEVICE_INFO_TYPE
    type DISPLAYCONFIG_COLOR_ENCODING (line 77) | private enum DISPLAYCONFIG_COLOR_ENCODING
    type DISPLAYCONFIG_SCALING (line 86) | private enum DISPLAYCONFIG_SCALING
    type DISPLAYCONFIG_ROTATION (line 96) | private enum DISPLAYCONFIG_ROTATION
    type DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY (line 103) | private enum DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY
    type DISPLAYCONFIG_TOPOLOGY_ID (line 126) | private enum DISPLAYCONFIG_TOPOLOGY_ID
    type DISPLAYCONFIG_PATH (line 134) | private enum DISPLAYCONFIG_PATH
    type DISPLAYCONFIG_SOURCE_FLAGS (line 141) | private enum DISPLAYCONFIG_SOURCE_FLAGS
    type DISPLAYCONFIG_TARGET_FLAGS (line 146) | private enum DISPLAYCONFIG_TARGET_FLAGS
    type QDC (line 156) | private enum QDC
    type DISPLAYCONFIG_SCANLINE_ORDERING (line 165) | private enum DISPLAYCONFIG_SCANLINE_ORDERING
    type DISPLAYCONFIG_PIXELFORMAT (line 174) | private enum DISPLAYCONFIG_PIXELFORMAT
    type DISPLAYCONFIG_MODE_INFO_TYPE (line 183) | private enum DISPLAYCONFIG_MODE_INFO_TYPE
    type DISPLAYCONFIG_DEVICE_INFO_HEADER (line 190) | [StructLayout(LayoutKind.Sequential)]
    type DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO (line 199) | [StructLayout(LayoutKind.Sequential)]
    type POINTL (line 213) | [StructLayout(LayoutKind.Sequential)]
    type LUID (line 220) | [StructLayout(LayoutKind.Sequential)]
      method ToString (line 227) | public override string ToString() => Value.ToString();
    type DISPLAYCONFIG_SOURCE_MODE (line 230) | [StructLayout(LayoutKind.Sequential)]
    type DISPLAYCONFIG_RATIONAL (line 239) | [StructLayout(LayoutKind.Sequential)]
      method ToString (line 245) | public override string ToString() => Numerator + " / " + Denominator;
    type DISPLAYCONFIG_2DREGION (line 248) | [StructLayout(LayoutKind.Sequential)]
    type DISPLAYCONFIG_DESKTOP_IMAGE_INFO (line 255) | [StructLayout(LayoutKind.Sequential)]
    type DISPLAYCONFIG_VIDEO_SIGNAL_INFO (line 263) | [StructLayout(LayoutKind.Sequential)]
    type DISPLAYCONFIG_TARGET_MODE (line 275) | [StructLayout(LayoutKind.Sequential)]
    type DISPLAYCONFIG_MODE_INFO_union (line 281) | [StructLayout(LayoutKind.Explicit)]
    type DISPLAYCONFIG_PATH_SOURCE_INFO (line 294) | [StructLayout(LayoutKind.Sequential)]
    type DISPLAYCONFIG_PATH_TARGET_INFO (line 303) | [StructLayout(LayoutKind.Sequential)]
    type DISPLAYCONFIG_PATH_INFO (line 318) | [StructLayout(LayoutKind.Sequential)]
    type DISPLAYCONFIG_MODE_INFO (line 326) | [StructLayout(LayoutKind.Sequential)]
    type DISPLAYCONFIG_SOURCE_DEVICE_NAME (line 335) | [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    type DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS (line 343) | [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    type DISPLAYCONFIG_TARGET_DEVICE_NAME (line 349) | [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    type RECT (line 364) | [StructLayout(LayoutKind.Sequential)]
    method GetDisplayConfigBufferSizes (line 373) | [DllImport("user32")]
    method QueryDisplayConfig (line 376) | [DllImport("user32")]
    method QueryDisplayConfig (line 379) | [DllImport("user32")]
    method DisplayConfigGetDeviceInfo (line 382) | [DllImport("user32")]
    method DisplayConfigGetDeviceInfo (line 385) | [DllImport("user32")]
    method DisplayConfigGetDeviceInfo (line 388) | [DllImport("user32")]

FILE: app/Display/ScreenControl.cs
  class ScreenControl (line 5) | public static class ScreenControl
    method GetMaxRate (line 12) | public static int GetMaxRate(string? laptopScreen)
    method AutoScreen (line 18) | public static void AutoScreen(bool force = false)
    method ToggleScreenRate (line 33) | public static void ToggleScreenRate()
    method SetScreen (line 44) | public static void SetScreen(int frequency = -1, int overdrive = -1, i...
    method SetMiniled (line 75) | public static void SetMiniled(int miniled = -1)
    method InitMiniled (line 89) | public static void InitMiniled()
    method InitOptimalBrightness (line 98) | public static void InitOptimalBrightness()
    method SetOptimalBrightness (line 104) | public static void SetOptimalBrightness(int status)
    method GetOptimalBrightness (line 111) | public static int GetOptimalBrightness()
    method ToogleFHD (line 116) | public static void ToogleFHD()
    method SetHDRControl (line 129) | public static void SetHDRControl(int status = -1)
    method ToogleHDRControl (line 138) | public static void ToogleHDRControl()
    method ToogleMiniled (line 147) | public static string ToogleMiniled()
    method InitScreen (line 196) | public static void InitScreen()

FILE: app/Display/ScreenInterrogatory.cs
  class ScreenInterrogatory (line 8) | public static class ScreenInterrogatory
    type QUERY_DEVICE_CONFIG_FLAGS (line 14) | public enum QUERY_DEVICE_CONFIG_FLAGS : uint
    type DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY (line 21) | public enum DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY : uint
    type DISPLAYCONFIG_SCANLINE_ORDERING (line 43) | public enum DISPLAYCONFIG_SCANLINE_ORDERING : uint
    type DISPLAYCONFIG_ROTATION (line 53) | public enum DISPLAYCONFIG_ROTATION : uint
    type DISPLAYCONFIG_SCALING (line 62) | public enum DISPLAYCONFIG_SCALING : uint
    type DISPLAYCONFIG_PIXELFORMAT (line 73) | public enum DISPLAYCONFIG_PIXELFORMAT : uint
    type DISPLAYCONFIG_MODE_INFO_TYPE (line 83) | public enum DISPLAYCONFIG_MODE_INFO_TYPE : uint
    type DISPLAYCONFIG_DEVICE_INFO_TYPE (line 90) | public enum DISPLAYCONFIG_DEVICE_INFO_TYPE : uint
    type LUID (line 105) | [StructLayout(LayoutKind.Sequential)]
    type DISPLAYCONFIG_PATH_SOURCE_INFO (line 112) | [StructLayout(LayoutKind.Sequential)]
    type DISPLAYCONFIG_PATH_TARGET_INFO (line 121) | [StructLayout(LayoutKind.Sequential)]
    type DISPLAYCONFIG_RATIONAL (line 136) | [StructLayout(LayoutKind.Sequential)]
    type DISPLAYCONFIG_PATH_INFO (line 143) | [StructLayout(LayoutKind.Sequential)]
    type DISPLAYCONFIG_2DREGION (line 151) | [StructLayout(LayoutKind.Sequential)]
    type DISPLAYCONFIG_VIDEO_SIGNAL_INFO (line 158) | [StructLayout(LayoutKind.Sequential)]
    type DISPLAYCONFIG_TARGET_MODE (line 170) | [StructLayout(LayoutKind.Sequential)]
    type POINTL (line 176) | [StructLayout(LayoutKind.Sequential)]
    type DISPLAYCONFIG_SOURCE_MODE (line 183) | [StructLayout(LayoutKind.Sequential)]
    type DISPLAYCONFIG_MODE_INFO_UNION (line 192) | [StructLayout(LayoutKind.Explicit)]
    type DISPLAYCONFIG_MODE_INFO (line 202) | [StructLayout(LayoutKind.Sequential)]
    type DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS (line 211) | [StructLayout(LayoutKind.Sequential)]
    type DISPLAYCONFIG_DEVICE_INFO_HEADER (line 217) | [StructLayout(LayoutKind.Sequential)]
    type DISPLAYCONFIG_TARGET_DEVICE_NAME (line 226) | [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    method GetDisplayConfigBufferSizes (line 247) | [DllImport("user32.dll")]
    method QueryDisplayConfig (line 251) | [DllImport("user32.dll")]
    method DisplayConfigGetDeviceInfo (line 259) | [DllImport("user32.dll")]
    type DisplayDeviceStates (line 265) | [Flags]
    type DISPLAY_DEVICE (line 278) | [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    method EnumDisplayDevices (line 299) | [DllImport(nameof(User32), CharSet = CharSet.Unicode, SetLastError = t...
    method DeviceName (line 307) | private static DISPLAYCONFIG_TARGET_DEVICE_NAME DeviceName(LUID adapte...
    method GetAllDevices (line 326) | public static IEnumerable<DISPLAYCONFIG_TARGET_DEVICE_NAME> GetAllDevi...
    method GetDisplayDevices (line 359) | public static IEnumerable<DISPLAY_DEVICE> GetDisplayDevices()

FILE: app/Display/ScreenNative.cs
  class DeviceComparer (line 8) | class DeviceComparer : IComparer
    method Compare (line 10) | public int Compare(object x, object y)
  class ScreenComparer (line 24) | class ScreenComparer : IComparer
    method Compare (line 26) | public int Compare(object x, object y)
  class ScreenNative (line 33) | internal class ScreenNative
    method CreateDC (line 36) | [DllImport("gdi32", CharSet = CharSet.Unicode)]
    method SetDeviceGammaRamp (line 39) | [DllImport("gdi32")]
    method GetDeviceGammaRamp (line 42) | [DllImport("gdi32")]
    method SetICMProfileW (line 45) | [DllImport("gdi32", CharSet = CharSet.Unicode)]
    method SetICMMode (line 48) | [DllImport("gdi32", CharSet = CharSet.Unicode)]
    type DEVMODE (line 51) | [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    type DisplaySettingsFlags (line 91) | [Flags()]
    method EnumDisplaySettingsEx (line 104) | [DllImport("user32.dll")]
    method ChangeDisplaySettingsEx (line 111) | [DllImport("user32.dll")]
    method CreateDevmode (line 116) | public static DEVMODE CreateDevmode()
    type COLORPROFILETYPE (line 125) | public enum COLORPROFILETYPE
    type COLORPROFILESUBTYPE (line 132) | public enum COLORPROFILESUBTYPE
    type WCS_PROFILE_MANAGEMENT_SCOPE (line 144) | public enum WCS_PROFILE_MANAGEMENT_SCOPE
    method WcsSetDefaultColorProfile (line 150) | [DllImport("mscms.dll", CharSet = CharSet.Unicode)]
    method FindInternalName (line 165) | public static string? FindInternalName(bool log = false)
    method ExtractDisplay (line 197) | static string ExtractDisplay(string input)
    method FindLaptopScreen (line 210) | public static string? FindLaptopScreen(bool log = false)
    method GetMaxRefreshRate (line 249) | public static int GetMaxRefreshRate(string? laptopScreen)
    method GetRefreshRate (line 271) | public static int GetRefreshRate(string? laptopScreen)
    method SetRefreshRate (line 287) | public static int SetRefreshRate(string laptopScreen, int frequency = ...

FILE: app/Display/VisualControl.cs
  type SplendidGamut (line 8) | public enum SplendidGamut : int
  type SplendidCommand (line 20) | public enum SplendidCommand : int
  class VisualControl (line 47) | public static class VisualControl
    method VisualControl (line 63) | static VisualControl()
    method GetGameVisualPath (line 68) | public static string GetGameVisualPath()
    method GetVivobookPath (line 73) | public static string GetVivobookPath()
    method GetDefaultGamut (line 78) | public static SplendidGamut GetDefaultGamut()
    method IsEReading (line 83) | public static bool IsEReading()
    method GetGamutModes (line 88) | public static Dictionary<SplendidGamut, string> GetGamutModes()
    method GetDefaultVisualMode (line 161) | public static SplendidCommand GetDefaultVisualMode()
    method GetVisualModes (line 166) | public static Dictionary<SplendidCommand, string> GetVisualModes()
    method GetTemperatures (line 196) | public static Dictionary<int, string> GetTemperatures()
    method GetEyeCares (line 210) | public static Dictionary<int, string> GetEyeCares()
    method IsEnabled (line 225) | public static bool IsEnabled()
    method SetRegStatus (line 231) | public static void SetRegStatus(int status = 1)
    method InitGamut (line 236) | public static void InitGamut()
    method SetGamut (line 246) | public static void SetGamut(int mode = -1)
    method SetVisual (line 273) | public static void SetVisual(SplendidCommand mode = SplendidCommand.De...
    method GetSplendidPath (line 343) | private static string GetSplendidPath()
    method RunSplendid (line 368) | private static int RunSplendid(SplendidCommand command, int? param1 = ...
    method BrightnessTimerTimer_Elapsed (line 397) | private static void BrightnessTimerTimer_Elapsed(object? sender, Syste...
    method InitBrightness (line 419) | public static void InitBrightness()
    method IsOnBattery (line 428) | private static bool IsOnBattery()
    method GetBrightness (line 433) | public static int GetBrightness()
    method SetBrightness (line 438) | public static int SetBrightness(int brightness = -1, int delta = 0)
    method ResetGamut (line 454) | public static void ResetGamut()
    method SetGamma (line 468) | public static void SetGamma(int brightness = 100)

FILE: app/Extra.Designer.cs
  class Extra (line 6) | partial class Extra
    method Dispose (line 17) | protected override void Dispose(bool disposing)
    method InitializeComponent (line 32) | private void InitializeComponent()

FILE: app/Extra.cs
  class Extra (line 12) | public partial class Extra : RForm
    method SetKeyCombo (line 20) | private void SetKeyCombo(ComboBox combo, TextBox txbox, string name)
    method Extra (line 121) | public Extra()
    method CheckNVPlatform_CheckedChanged (line 491) | private void CheckNVPlatform_CheckedChanged(object? sender, EventArgs e)
    method OptimalBrightness_Changed (line 496) | private void OptimalBrightness_Changed(object? sender, EventArgs e)
    method CheckPerKeyRGB_CheckedChanged (line 501) | private void CheckPerKeyRGB_CheckedChanged(object? sender, EventArgs e)
    method CheckLEDStatus_CheckedChanged (line 506) | private void CheckLEDStatus_CheckedChanged(object? sender, EventArgs e)
    method CheckBWIcon_CheckedChanged (line 511) | private void CheckBWIcon_CheckedChanged(object? sender, EventArgs e)
    method InitACPITesting (line 517) | private void InitACPITesting()
    method ButtonACPISend_Click (line 531) | private void ButtonACPISend_Click(object? sender, EventArgs e)
    method InitCores (line 546) | private void InitCores()
    method ButtonCores_Click (line 580) | private void ButtonCores_Click(object? sender, EventArgs e)
    method PictureScan_Click (line 592) | private void PictureScan_Click(object? sender, EventArgs e)
    method ComboAPU_SelectedIndexChanged (line 604) | private void ComboAPU_SelectedIndexChanged(object? sender, EventArgs e)
    method CheckBootSound_CheckedChanged (line 617) | private void CheckBootSound_CheckedChanged(object? sender, EventArgs e)
    method CheckGPUFix_CheckedChanged (line 624) | private void CheckGPUFix_CheckedChanged(object? sender, EventArgs e)
    method InitHibernate (line 629) | private void InitHibernate()
    method NumericHibernateAfter_ValueChanged (line 647) | private void NumericHibernateAfter_ValueChanged(object? sender, EventA...
    method PictureLog_Click (line 652) | private void PictureLog_Click(object? sender, EventArgs e)
    method SliderBrightness_ValueChanged (line 663) | private void SliderBrightness_ValueChanged(object? sender, EventArgs e)
    method InitServices (line 675) | private void InitServices()
    method ServiesToggle (line 696) | public void ServiesToggle()
    method ButtonServices_Click (line 727) | private void ButtonServices_Click(object? sender, EventArgs e)
    method CheckGpuApps_CheckedChanged (line 735) | private void CheckGpuApps_CheckedChanged(object? sender, EventArgs e)
    method NumericBacklightTime_ValueChanged (line 740) | private void NumericBacklightTime_ValueChanged(object? sender, EventAr...
    method CheckXGM_CheckedChanged (line 747) | private void CheckXGM_CheckedChanged(object? sender, EventArgs e)
    method CheckUSBC_CheckedChanged (line 753) | private void CheckUSBC_CheckedChanged(object? sender, EventArgs e)
    method PictureHelp_Click (line 758) | private void PictureHelp_Click(object? sender, EventArgs e)
    method CheckNoOverdrive_CheckedChanged (line 763) | private void CheckNoOverdrive_CheckedChanged(object? sender, EventArgs e)
    method CheckTopmost_CheckedChanged (line 770) | private void CheckTopmost_CheckedChanged(object? sender, EventArgs e)
    method CheckPower_CheckedChanged (line 776) | private void CheckPower_CheckedChanged(object? sender, EventArgs e)
    method ComboKeyboardSpeed_SelectedValueChanged (line 810) | private void ComboKeyboardSpeed_SelectedValueChanged(object? sender, E...
    method Keyboard_Shown (line 817) | private void Keyboard_Shown(object? sender, EventArgs e)
    method checkAutoToggleClamshellMode_CheckedChanged (line 843) | private void checkAutoToggleClamshellMode_CheckedChanged(object? sende...
    method panelAPU_Paint (line 858) | private void panelAPU_Paint(object sender, PaintEventArgs e)

FILE: app/Fan/FanSensorControl.cs
  class FanSensorControl (line 5) | public class FanSensorControl
    method FanSensorControl (line 28) | public FanSensorControl(Fans fansForm)
    method InitFanMax (line 35) | static int[] InitFanMax()
    method GetDefaultMax (line 47) | static int[] GetDefaultMax()
    method GetDefaultMin (line 79) | static int[] GetDefaultMin()
    method GetFanMax (line 86) | public static int GetFanMax(AsusFan device)
    method GetFanMin (line 96) | public static int GetFanMin(AsusFan device)
    method SetFanMax (line 102) | public static void SetFanMax(AsusFan device, int value)
    method FormatFan (line 121) | public static string FormatFan(AsusFan device, int value)
    method StartCalibration (line 133) | public void StartCalibration()
    method Timer_Elapsed (line 149) | private void Timer_Elapsed(object? sender, System.Timers.ElapsedEventA...
    method FinishCalibration (line 186) | private void FinishCalibration()

FILE: app/Fans.Designer.cs
  class Fans (line 6) | partial class Fans
    method Dispose (line 17) | protected override void Dispose(bool disposing)
    method InitializeComponent (line 32) | private void InitializeComponent()

FILE: app/Fans.cs
  class Fans (line 13) | public partial class Fans : RForm
    method Fans (line 41) | public Fans()
    method CheckFanClamp_Click (line 246) | private void CheckFanClamp_Click(object? sender, EventArgs e)
    method ButtonDownload_Click (line 252) | private void ButtonDownload_Click(object? sender, EventArgs e)
    method ButtonCalibrate_Click (line 268) | private void ButtonCalibrate_Click(object? sender, EventArgs e)
    method ChartCPU_MouseClick (line 274) | private void ChartCPU_MouseClick(object? sender, MouseEventArgs e)
    method Fans_FormClosed (line 292) | private void Fans_FormClosed(object? sender, FormClosedEventArgs e)
    method CheckApplyUV_Click (line 298) | private void CheckApplyUV_Click(object? sender, EventArgs e)
    method InitAll (line 304) | public void InitAll()
    method InitCPU (line 314) | public void InitCPU()
    method ToggleNavigation (line 331) | public void ToggleNavigation(int index = 0)
    method ButtonAdvanced_Click (line 364) | private void ButtonAdvanced_Click(object? sender, EventArgs e)
    method ButtonGPU_Click (line 369) | private void ButtonGPU_Click(object? sender, EventArgs e)
    method ButtonCPU_Click (line 374) | private void ButtonCPU_Click(object? sender, EventArgs e)
    method ButtonApplyAdvanced_Click (line 379) | private void ButtonApplyAdvanced_Click(object? sender, EventArgs e)
    method InitUV (line 385) | public void InitUV()
    method VisualiseAdvanced (line 408) | private void VisualiseAdvanced()
    method AdvancedScroll (line 448) | private void AdvancedScroll()
    method TrackUV_Scroll (line 461) | private void TrackUV_Scroll(object? sender, EventArgs e)
    method ComboModes_KeyPress (line 466) | private void ComboModes_KeyPress(object? sender, KeyPressEventArgs e)
    method ComboModes_TextChanged (line 471) | private void ComboModes_TextChanged(object? sender, EventArgs e)
    method RenameToggle (line 478) | private void RenameToggle()
    method ButtonRename_Click (line 490) | private void ButtonRename_Click(object? sender, EventArgs e)
    method ButtonRemove_Click (line 495) | private void ButtonRemove_Click(object? sender, EventArgs e)
    method FillModes (line 506) | private void FillModes(bool contextMenu = true)
    method ButtonAdd_Click (line 515) | private void ButtonAdd_Click(object? sender, EventArgs e)
    method InitMode (line 522) | public void InitMode()
    method ComboModes_SelectedValueChanged (line 529) | private void ComboModes_SelectedValueChanged(object? sender, EventArgs e)
    method TrackGPU_MouseUp (line 541) | private void TrackGPU_MouseUp(object? sender, MouseEventArgs e)
    method TrackGPUClocks_MouseUp (line 546) | private void TrackGPUClocks_MouseUp(object? sender, MouseEventArgs e)
    method InitGPUPower (line 551) | private void InitGPUPower()
    method InitGPU (line 584) | public void InitGPU()
    method VisualiseGPUSettings (line 671) | private void VisualiseGPUSettings()
    method trackGPUClockLimit_Scroll (line 688) | private void trackGPUClockLimit_Scroll(object? sender, EventArgs e)
    method trackGPU_Scroll (line 698) | private void trackGPU_Scroll(object? sender, EventArgs e)
    method trackGPUPower_Scroll (line 712) | private void trackGPUPower_Scroll(object? sender, EventArgs e)
    method ChartYLabel (line 722) | static string ChartYLabel(int percentage, AsusFan device, string unit ...
    method SetAxis (line 735) | void SetAxis(Chart chart, AsusFan device)
    method SetChart (line 749) | void SetChart(Chart chart, AsusFan device)
    method FormPosition (line 794) | public void FormPosition()
    method Fans_Shown (line 811) | private void Fans_Shown(object? sender, EventArgs e)
    method TrackPower_MouseUp (line 817) | private void TrackPower_MouseUp(object? sender, MouseEventArgs e)
    method TrackPower_KeyUp (line 826) | private void TrackPower_KeyUp(object? sender, KeyEventArgs e)
    method InitPowerPlan (line 834) | public void InitPowerPlan()
    method ComboPowerMode_Changed (line 852) | private void ComboPowerMode_Changed(object? sender, EventArgs e)
    method ComboBoost_Changed (line 863) | private void ComboBoost_Changed(object? sender, EventArgs e)
    method CheckApplyPower_Click (line 872) | private void CheckApplyPower_Click(object? sender, EventArgs e)
    method CheckApplyFans_Click (line 882) | private void CheckApplyFans_Click(object? sender, EventArgs e)
    method InitAxis (line 892) | public void InitAxis()
    method LabelFansResult (line 905) | public void LabelFansResult(string text)
    method InitPower (line 919) | public void InitPower()
    method SavePower (line 989) | private void SavePower()
    method TrackTotal_Scroll (line 1002) | private void TrackTotal_Scroll(object? sender, EventArgs e)
    method TrackSlow_Scroll (line 1010) | private void TrackSlow_Scroll(object? sender, EventArgs e)
    method TrackFast_Scroll (line 1017) | private void TrackFast_Scroll(object? sender, EventArgs e)
    method TrackCPU_Scroll (line 1024) | private void TrackCPU_Scroll(object? sender, EventArgs e)
    method InitFans (line 1030) | public void InitFans()
    method LoadProfile (line 1104) | void LoadProfile(Series series, AsusFan device, bool reset = false)
    method SaveProfile (line 1140) | void SaveProfile(Series series, AsusFan device)
    method ButtonReset_Click (line 1156) | private void ButtonReset_Click(object? sender, EventArgs e)
    method Chart_Save (line 1221) | private void Chart_Save()
    method ChartCPU_MouseUp (line 1239) | private void ChartCPU_MouseUp(object? sender, MouseEventArgs e)
    method ChartCPU_MouseLeave (line 1245) | private void ChartCPU_MouseLeave(object? sender, EventArgs e)
    method ChartCPU_MouseMove (line 1252) | private void ChartCPU_MouseMove(object? sender, MouseEventArgs e, Asus...
    method AdjustAll (line 1338) | private void AdjustAll(double deltaX, double deltaY, Series series)
    method AdjustAllLevels (line 1347) | private void AdjustAllLevels(int index, double curXVal, double curYVal...

FILE: app/Gpu/AMD/AmdAdl2.cs
  type ADLSGApplicationInfo (line 9) | [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
  type ADLBdf (line 27) | [StructLayout(LayoutKind.Sequential)]
  type ADLSingleSensorData (line 35) | [StructLayout(LayoutKind.Sequential)]
  type ADLPMLogDataOutput (line 42) | [StructLayout(LayoutKind.Sequential)]
  type ADLGcnInfo (line 51) | [StructLayout(LayoutKind.Sequential)]
  type ADLAsicFamilyType (line 61) | [Flags]
  type ADLSensorType (line 75) | public enum ADLSensorType
  type ADL_THROTTLE_NOTIFICATION (line 155) | [Flags]
  type ADL_PMLOG_SENSORS (line 163) | public enum ADL_PMLOG_SENSORS
  type ADLAdapterInfo (line 245) | [StructLayout(LayoutKind.Sequential)]
  type ADLAdapterInfoArray (line 301) | [StructLayout(LayoutKind.Sequential)]
  type ADLDisplayID (line 314) | [StructLayout(LayoutKind.Sequential)]
  type ADLDisplayInfo (line 331) | [StructLayout(LayoutKind.Sequential)]
  class Adl2 (line 368) | public class Adl2
    method ADL2_Main_Control_Create (line 412) | public static int ADL2_Main_Control_Create(int enumConnectedAdapters, ...
    method FreeMemory (line 417) | public static void FreeMemory(nint buffer)
    method Load (line 424) | public static bool Load()
    method Memory_Alloc_Impl (line 448) | private static nint Memory_Alloc_Impl(int size)
    method Memory_Free_Impl (line 455) | private static void Memory_Free_Impl(nint buffer)
    class NativeMethods (line 463) | public static class NativeMethods
      method ADL2_Main_Control_Create (line 474) | [DllImport(Atiadlxx_FileName)]
      method ADL2_Main_Control_Destroy (line 479) | [DllImport(Atiadlxx_FileName)]
      method ADL2_Adapter_NumberOfAdapters_Get (line 485) | [DllImport(Atiadlxx_FileName)]
      method ADL2_Adapter_AdapterInfo_Get (line 492) | [DllImport(Atiadlxx_FileName)]
      method ADL2_Adapter_Active_Get (line 500) | [DllImport(Atiadlxx_FileName)]
      method ADL2_Display_DisplayInfo_Get (line 509) | [DllImport(Atiadlxx_FileName)]
      method ADL2_Overdrive_Caps (line 518) | [DllImport(Atiadlxx_FileName)]
      method ADL2_New_QueryPMLogData_Get (line 527) | [DllImport(Atiadlxx_FileName)]
      method ADL2_Adapter_ASICFamilyType_Get (line 530) | [DllImport(Atiadlxx_FileName)]
      method ADL2_SwitchableGraphics_Applications_Get (line 533) | [DllImport(Atiadlxx_FileName)]
      method ADL2_Adapter_VariBright_Caps (line 540) | [DllImport(Atiadlxx_FileName)]
      method ADL2_Adapter_VariBrightEnable_Set (line 548) | [DllImport(Atiadlxx_FileName)]
      method ADL2_Adapter_FrameMetrics_Start (line 556) | [DllImport(Atiadlxx_FileName)]
      method ADL2_Adapter_FrameMetrics_Stop (line 563) | [DllImport(Atiadlxx_FileName)]
      method ADL2_Adapter_FrameMetrics_Get (line 570) | [DllImport(Atiadlxx_FileName)]
      method ADL2_FPS_Settings_Get (line 578) | [DllImport(Atiadlxx_FileName)]
      method ADL2_FPS_Settings_Set (line 581) | [DllImport(Atiadlxx_FileName)]
      method ADL2_FPS_Settings_Reset (line 584) | [DllImport(Atiadlxx_FileName)]
      type ADLFPSSettingsOutput (line 587) | [StructLayout(LayoutKind.Sequential)]
      type ADLFPSSettingsInput (line 601) | [StructLayout(LayoutKind.Sequential)]
      type ADLODNPerformanceLevel (line 615) | [StructLayout(LayoutKind.Sequential)]
      type ADLODNPerformanceLevels (line 623) | [StructLayout(LayoutKind.Sequential)]
      method ADL2_OverdriveN_SystemClocks_Get (line 634) | [DllImport(Atiadlxx_FileName)]
      method ADL2_OverdriveN_SystemClocks_Set (line 640) | [DllImport(Atiadlxx_FileName)]
      method ADL2_OverdriveN_MemoryClocks_Get (line 646) | [DllImport(Atiadlxx_FileName)]
      method ADL2_OverdriveN_MemoryClocks_Set (line 652) | [DllImport(Atiadlxx_FileName)]

FILE: app/Gpu/AMD/AmdGpuControl.cs
  class AmdGpuControl (line 8) | public class AmdGpuControl : IGpuControl
    method FindByType (line 20) | private ADLAdapterInfo? FindByType(ADLAsicFamilyType type = ADLAsicFam...
    method AmdGpuControl (line 63) | public AmdGpuControl()
    method GetCurrentTemperature (line 90) | public int? GetCurrentTemperature()
    method GetGpuUse (line 106) | public int? GetGpuUse()
    method GetiGpuUse (line 121) | public int? GetiGpuUse()
    method GetGpuPower (line 133) | public int? GetGpuPower()
    method SetVariBright (line 146) | public bool SetVariBright(int enabled)
    method GetVariBright (line 157) | public bool GetVariBright(out int supported, out int enabled)
    method StartFPS (line 175) | public void StartFPS()
    method StopFPS (line 181) | public void StopFPS()
    method GetFPS (line 187) | public float GetFPS()
    method GetFPSLimit (line 195) | public int GetFPSLimit()
    method SetFPSLimit (line 206) | public int SetFPSLimit(int limit)
    method GetGPUClocks (line 221) | public ADLODNPerformanceLevels? GetGPUClocks()
    method KillGPUApps (line 231) | public void KillGPUApps()
    method ReleaseUnmanagedResources (line 293) | private void ReleaseUnmanagedResources()
    method Dispose (line 303) | public void Dispose()

FILE: app/Gpu/GPUModeControl.cs
  class GPUModeControl (line 10) | public class GPUModeControl
    method GPUModeControl (line 18) | public GPUModeControl(SettingsForm settingsForm)
    method InitGPUMode (line 23) | public void InitGPUMode()
    method SetGPUMode (line 67) | public void SetGPUMode(int GPUMode, int auto = 0)
    method SetGPUEco (line 146) | public void SetGPUEco(int eco)
    method IsPlugged (line 207) | public static bool IsPlugged()
    method AutoGPUMode (line 222) | public bool AutoGPUMode(bool optimized = false, int delay = 0)
    method ToggleXGM (line 272) | public void ToggleXGM(bool silent = false)
    method KillGPUApps (line 330) | public void KillGPUApps()
    method IsHibernationEnabled (line 338) | public static bool IsHibernationEnabled()
    method StandardModeFix (line 364) | public void StandardModeFix(bool hibernate = false)

FILE: app/Gpu/IGpuControl.cs
  type IGpuControl (line 3) | public  interface IGpuControl : IDisposable {
    method GetCurrentTemperature (line 7) | int? GetCurrentTemperature();
    method GetGpuUse (line 8) | int? GetGpuUse();
    method KillGPUApps (line 9) | void KillGPUApps();

FILE: app/Gpu/NVidia/NvidiaGpuControl.cs
  class NvidiaGpuControl (line 12) | public class NvidiaGpuControl : IGpuControl
    method NvidiaGpuControl (line 26) | public NvidiaGpuControl()
    method GetCurrentTemperature (line 51) | public int? GetCurrentTemperature()
    method Dispose (line 63) | public void Dispose()
    method KillGPUApps (line 67) | public void KillGPUApps()
    method GetClocks (line 96) | public bool GetClocks(out int core, out int memory)
    method RunPowershellCommand (line 128) | private static bool RunPowershellCommand(string script)
    method GetMaxGPUCLock (line 143) | public int GetMaxGPUCLock()
    method SetMaxGPUClock (line 162) | public int SetMaxGPUClock(int clock)
    method RestartNVService (line 185) | public static void RestartNVService()
    method StopNVService (line 192) | public static void StopNVService()
    method SetClocks (line 199) | public int SetClocks(int core, int memory)
    method GetInternalDiscreteGpu (line 237) | private static PhysicalGPU? GetInternalDiscreteGpu()
    method GetGpuUse (line 253) | public int? GetGpuUse()

FILE: app/Gpu/NVidia/NvidiaSmi.cs
  class NvidiaSmi (line 5) | public static class NvidiaSmi
    method GetDisplayActiveStatus (line 7) | public static bool GetDisplayActiveStatus()
    method GetDefaultMaxGPUPower (line 33) | public static int GetDefaultMaxGPUPower()
    method GetMaxGPUPower (line 41) | public static int GetMaxGPUPower()
    method RunNvidiaSmiCommand (line 55) | private static string RunNvidiaSmiCommand(string arguments = "-i 0 -q")

FILE: app/Handheld.Designer.cs
  class Handheld (line 3) | partial class Handheld
    method Dispose (line 14) | protected override void Dispose(bool disposing)
    method InitializeComponent (line 29) | private void InitializeComponent()

FILE: app/Handheld.cs
  class Handheld (line 6) | public partial class Handheld : RForm
    method Handheld (line 12) | public Handheld()
    method CheckController_CheckedChanged (line 94) | private void CheckController_CheckedChanged(object? sender, EventArgs e)
    method ComboBinding (line 100) | private void ComboBinding(RComboBox combo)
    method Binding_SelectedValueChanged (line 113) | private void Binding_SelectedValueChanged(object? sender, EventArgs e)
    method SetComboValue (line 129) | private void SetComboValue(RComboBox combo, string value)
    method VisualiseButton (line 141) | private void VisualiseButton(RButton button, string binding)
    method ButtonBinding (line 159) | private void ButtonBinding(string binding, string label, RButton button)
    method buttonBinding_Click (line 165) | void buttonBinding_Click(object sender, EventArgs e, string binding, s...
    method Controller_Complete (line 185) | private void Controller_Complete(object? sender, EventArgs e)
    method ButtonReset_Click (line 190) | private void ButtonReset_Click(object? sender, EventArgs e)
    method Init (line 219) | private void Init()
    method VisualiseController (line 236) | private void VisualiseController()
    method Controller_Scroll (line 247) | private void Controller_Scroll(object? sender, EventArgs e)
    method Handheld_Shown (line 265) | private void Handheld_Shown(object? sender, EventArgs e)

FILE: app/HardwareControl.cs
  class HardwareControl (line 11) | public static class HardwareControl
    method GetGpuUse (line 52) | private static int GetGpuUse()
    method GetBatteryStatus (line 69) | public static void GetBatteryStatus()
    method ReadFullChargeCapacity (line 110) | public static void ReadFullChargeCapacity()
    method ReadDesignCapacity (line 133) | public static void ReadDesignCapacity()
    method RefreshBatteryHealth (line 155) | public static void RefreshBatteryHealth()
    method GetBatteryHealth (line 161) | public static decimal GetBatteryHealth()
    method GetCPUTemp (line 180) | public static float? GetCPUTemp()
    method GetCPUTempWMI (line 205) | static double GetCPUTempWMI()
    method GetGPUTemp (line 227) | public static float? GetGPUTemp()
    method ReadSensors (line 249) | public static void ReadSensors(bool log = false)
    method GetBatteryChargePercentage (line 283) | public static double GetBatteryChargePercentage()
    method IsUsedGPU (line 302) | public static bool IsUsedGPU(int threshold = 10)
    method GetNvidiaGpuControl (line 313) | public static NvidiaGpuControl? GetNvidiaGpuControl()
    method RecreateGpuControlWithDelay (line 321) | public static void RecreateGpuControlWithDelay(int delay = 5)
    method RecreateGpuControl (line 332) | public static void RecreateGpuControl()
    method KillGPUApps (line 372) | public static void KillGPUApps()

FILE: app/Helpers/AsusService.cs
  class AsusService (line 5) | public static class AsusService
    method IsAsusOptimizationRunning (line 38) | public static bool IsAsusOptimizationRunning()
    method IsArmouryRunning (line 43) | public static bool IsArmouryRunning()
    method RunArmouryUninstaller (line 51) | public static void RunArmouryUninstaller()
    method IsOSDRunning (line 56) | public static bool IsOSDRunning()
    method GetRunningCount (line 62) | public static int GetRunningCount()
    method StopAsusServices (line 84) | public static void StopAsusServices()
    method StartAsusServices (line 102) | public static void StartAsusServices()

FILE: app/Helpers/Audio.cs
  class Audio (line 5) | internal class Audio
    method ToggleMicMute (line 7) | public static bool ToggleMicMute()
    method IsMicMuted (line 29) | public static bool IsMicMuted()
    method IsMuted (line 46) | public static bool IsMuted()

FILE: app/Helpers/ClamshellModeControl.cs
  class ClamshellModeControl (line 7) | internal class ClamshellModeControl
    method ClamshellModeControl (line 10) | public ClamshellModeControl()
    method IsExternalDisplayConnected (line 16) | public bool IsExternalDisplayConnected()
    method IsClamshellEnabled (line 46) | public bool IsClamshellEnabled()
    method IsChargerConnected (line 51) | public bool IsChargerConnected()
    method IsClamshellReady (line 56) | public bool IsClamshellReady()
    method ToggleLidAction (line 61) | public void ToggleLidAction()
    method DisableClamshellMode (line 77) | public static void DisableClamshellMode()
    method EnableClamshellMode (line 84) | public static void EnableClamshellMode()
    method UnregisterDisplayEvents (line 91) | public void UnregisterDisplayEvents()
    method RegisterDisplayEvents (line 96) | public void RegisterDisplayEvents()
    method SystemEvents_DisplaySettingsChanged (line 101) | private void SystemEvents_DisplaySettingsChanged(object? sender, Event...
    method CheckAndSaveLidAction (line 116) | private static int CheckAndSaveLidAction()
    method GetDefaultLidAction (line 148) | private static int GetDefaultLidAction()

FILE: app/Helpers/ColorUtilities.cs
  class ColorUtils (line 5) | public class ColorUtils
    method GetWeightedAverage (line 8) | public static Color GetWeightedAverage(Color color1, Color color2, flo...
    method GetMidColor (line 22) | public static Color GetMidColor(Color color1, Color color2)
    method GetDominantColor (line 29) | public static Color GetDominantColor(Bitmap bmp)
    class HSV (line 61) | public class HSV
      method ToRGB (line 67) | public Color ToRGB()
      method ToHSV (line 98) | public static HSV ToHSV(Color rgb)
      method UpSaturation (line 130) | public static Color UpSaturation(Color rgb, float increse = 0.2f) //...
    class SmoothColor (line 141) | public class SmoothColor
      method Interpolate (line 149) | Color Interpolate()
      class ColorInterpolator (line 159) | static class ColorInterpolator
        method InterpolateBetween (line 166) | public static Color InterpolateBetween(Color endPoint1, Color endP...
        method InterpolateComponent (line 183) | [MethodImpl(MethodImplOptions.AggressiveInlining)]

FILE: app/Helpers/DynamicLightingHelper.cs
  class DynamicLightingHelper (line 5) | public static class DynamicLightingHelper
    type DynamicLightingEffect (line 11) | public enum DynamicLightingEffect
    method IsEnabled (line 21) | public static bool IsEnabled()
    method SetRegStatus (line 29) | public static void SetRegStatus(int status = 1)
    method WriteLightingValue (line 43) | static void WriteLightingValue(string name, object value, RegistryValu...
    method ToDlColorDword (line 58) | static int ToDlColorDword(System.Drawing.Color c)
    method SetEffect (line 67) | public static void SetEffect(
    method SetDynamicLightingOnAllDevices (line 114) | static void SetDynamicLightingOnAllDevices(int status = 1)
    method Init (line 131) | public static void Init()
    method OpenSettings (line 142) | public static void OpenSettings()

FILE: app/Helpers/Logger.cs
  class Logger (line 3) | public static class Logger
    method WriteLine (line 8) | public static void WriteLine(string logMessage)
    method Cleanup (line 28) | public static void Cleanup()

FILE: app/Helpers/OSDBase.cs
  class OSDNativeForm (line 7) | public class OSDNativeForm : NativeWindow, IDisposable
    method PerformPaint (line 16) | protected virtual void PerformPaint(PaintEventArgs e)
    method Invalidate (line 20) | protected internal void Invalidate()
    method UpdateLayeredWindow (line 24) | private void UpdateLayeredWindow()
    method Show (line 60) | public virtual void Show()
    method Hide (line 68) | public virtual void Hide()
    method Close (line 77) | public virtual void Close()
    method CreateWindowOnly (line 83) | private void CreateWindowOnly()
    method SetBoundsCore (line 116) | protected virtual void SetBoundsCore(int x, int y, int width, int height)
    method Dispose (line 259) | public void Dispose()
    method Dispose (line 264) | private void Dispose(bool disposing)
  type POINT (line 277) | [StructLayout(LayoutKind.Sequential)]
  type RECT (line 283) | [StructLayout(LayoutKind.Sequential)]
  type SIZE (line 291) | [StructLayout(LayoutKind.Sequential)]
  type TRACKMOUSEEVENTS (line 297) | [StructLayout(LayoutKind.Sequential)]
  type MSG (line 305) | [StructLayout(LayoutKind.Sequential)]
  type BLENDFUNCTION (line 316) | [StructLayout(LayoutKind.Sequential, Pack = 1)]
  class User32 (line 324) | internal class User32
    method User32 (line 344) | private User32()
    method AnimateWindow (line 347) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method ClientToScreen (line 349) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method DispatchMessage (line 351) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method DrawFocusRect (line 353) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method GetDC (line 355) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method GetFocus (line 357) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method GetKeyState (line 359) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method GetMessage (line 361) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method GetParent (line 363) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method GetClientRect (line 365) | [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
    method GetWindowLong (line 367) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method GetWindow (line 369) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method GetWindowRect (line 371) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method HideCaret (line 373) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method InvalidateRect (line 375) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method LoadCursor (line 377) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method MapWindowPoints (line 379) | [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
    method MoveWindow (line 381) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method PeekMessage (line 383) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method PostMessage (line 385) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method ReleaseCapture (line 387) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method ReleaseDC (line 389) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method ScreenToClient (line 391) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method SendMessage (line 393) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method SetCursor (line 395) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method SetFocus (line 397) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method SetWindowLong (line 399) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method SetWindowPos (line 401) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method SetWindowRgn (line 403) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method ShowCaret (line 405) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method SetCapture (line 407) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method ShowWindow (line 409) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method SystemParametersInfo (line 411) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method TrackMouseEvent (line 413) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method TranslateMessage (line 415) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method UpdateLayeredWindow (line 417) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method UpdateWindow (line 419) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method WaitMessage (line 421) | [DllImport("User32.dll", CharSet = CharSet.Auto)]
    method AdjustWindowRectEx (line 423) | [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
  class Gdi32 (line 427) | internal class Gdi32
    method Gdi32 (line 430) | private Gdi32()
    method CombineRgn (line 433) | [DllImport("gdi32.dll", CharSet = CharSet.Auto)]
    method CreateBrushIndirect (line 435) | [DllImport("gdi32.dll", CharSet = CharSet.Auto)]
    method CreateCompatibleDC (line 437) | [DllImport("gdi32.dll", CharSet = CharSet.Auto)]
    method CreateRectRgnIndirect (line 439) | [DllImport("gdi32.dll", CharSet = CharSet.Auto)]
    method DeleteDC (line 441) | [DllImport("gdi32.dll", CharSet = CharSet.Auto)]
    method DeleteObject (line 443) | [DllImport("gdi32.dll", CharSet = CharSet.Auto)]
    method GetClipBox (line 445) | [DllImport("gdi32.dll", CharSet = CharSet.Auto)]
    method PatBlt (line 447) | [DllImport("gdi32.dll", CharSet = CharSet.Auto)]
    method SelectClipRgn (line 449) | [DllImport("gdi32.dll", CharSet = CharSet.Auto)]
    method SelectObject (line 451) | [DllImport("gdi32.dll", CharSet = CharSet.Auto)]
  type LOGBRUSH (line 454) | [StructLayout(LayoutKind.Sequential)]

FILE: app/Helpers/OnScreenKeyboard.cs
  class OnScreenKeyboard (line 6) | public static class OnScreenKeyboard
    method OnScreenKeyboard (line 8) | static OnScreenKeyboard()
    method StartTabTip (line 26) | private static void StartTabTip()
    method ToggleVisibility (line 36) | public static void ToggleVisibility()
    method Show (line 44) | public static void Show()
    method Hide (line 59) | public static void Hide()
    method Close (line 68) | public static bool Close()
    method IsOpen (line 81) | public static bool IsOpen()
    method FindWindowEx (line 87) | [DllImport("user32.dll", SetLastError = false)]
    method GetWindowLong (line 90) | [DllImport("user32.dll", SetLastError = false)]
    method GetIsOpen1709 (line 93) | private static bool? GetIsOpen1709()
    method GetIsOpenLegacy (line 114) | private static bool GetIsOpenLegacy()
    type WindowStyle (line 130) | private enum WindowStyle : uint
    method GetWindowStyle (line 136) | private static WindowStyle GetWindowStyle(IntPtr wnd)
  type ITipInvocation (line 144) | [ComImport]
    method Toggle (line 149) | void Toggle(IntPtr hwnd);
  class NativeMethods (line 152) | internal static class NativeMethods
    method FindWindow (line 154) | [DllImport("user32.dll", EntryPoint = "FindWindow")]
    method SendMessage (line 157) | [DllImport("user32.dll", EntryPoint = "SendMessage")]
    method GetDesktopWindow (line 160) | [DllImport("user32.dll", EntryPoint = "GetDesktopWindow", SetLastError...
    method GetWindowLong (line 163) | [DllImport("user32.dll", EntryPoint = "GetWindowLong")]

FILE: app/Helpers/ProcessHelper.cs
  class ProcessHelper (line 6) | public static class ProcessHelper
    method IsRunningAsSystem (line 11) | public static bool IsRunningAsSystem()
    method CheckAlreadyRunning (line 27) | public static void CheckAlreadyRunning()
    method IsUserAdministrator (line 50) | public static bool IsUserAdministrator()
    method RunAsAdmin (line 57) | public static void RunAsAdmin(string? param = null, bool force = false)
    method KillByName (line 85) | public static void KillByName(string name)
    method KillByProcess (line 101) | public static void KillByProcess(Process process)
    method StopDisableService (line 114) | public static void StopDisableService(string serviceName, string disab...
    method StartEnableService (line 128) | public static void StartEnableService(string serviceName, bool automat...
    method RunCMD (line 142) | public static string RunCMD(string name, string args, string? director...
    method SetPriority (line 165) | public static void SetPriority(ProcessPriorityClass priorityClass = Pr...

FILE: app/Helpers/RestrictedProcessHelper.cs
  class RestrictedProcessHelper (line 5) | public static class RestrictedProcessHelper
    method RunAsRestrictedUser (line 8) | public static Process? RunAsRestrictedUser(string fileName, string? ar...
    method GetRestrictedSessionUserToken (line 59) | private static bool GetRestrictedSessionUserToken(out IntPtr token)
    type PROCESS_INFORMATION (line 116) | [StructLayout(LayoutKind.Sequential)]
    type STARTUPINFO (line 125) | [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    type SID_AND_ATTRIBUTES (line 148) | [StructLayout(LayoutKind.Sequential)]
    type TOKEN_MANDATORY_LABEL (line 155) | [StructLayout(LayoutKind.Sequential)]
    type SaferLevel (line 161) | public enum SaferLevel : uint
    type SaferScope (line 170) | public enum SaferScope : uint
    type SaferOpenFlags (line 176) | [Flags]
    method SaferCreateLevel (line 182) | [DllImport("advapi32", SetLastError = true, CallingConvention = Callin...
    method SaferComputeTokenFromLevel (line 185) | [DllImport("advapi32", SetLastError = true, CallingConvention = Callin...
    method SaferCloseLevel (line 188) | [DllImport("advapi32", SetLastError = true)]
    method ConvertStringSidToSid (line 191) | [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unic...
    method CloseHandle (line 194) | [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    method SafeCloseHandle (line 198) | private static bool SafeCloseHandle(IntPtr hObject)
    method LocalFree (line 203) | [DllImport("kernel32.dll", SetLastError = true)]
    type TOKEN_INFORMATION_CLASS (line 206) | enum TOKEN_INFORMATION_CLASS
    method SetTokenInformation (line 354) | [DllImport("advapi32.dll", SetLastError = true)]
    method CreateProcessAsUser (line 363) | [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unic...

FILE: app/Helpers/Startup.cs
  class Startup (line 7) | public class Startup
    method IsScheduled (line 14) | public static bool IsScheduled()
    method ReScheduleAdmin (line 28) | public static void ReScheduleAdmin()
    method StartupCheck (line 37) | public static void StartupCheck()
    method UnscheduleCharge (line 104) | public static void UnscheduleCharge()
    method ScheduleCharge (line 119) | public static void ScheduleCharge()
    method Schedule (line 155) | public static void Schedule()
    method UnSchedule (line 192) | public static void UnSchedule()

FILE: app/Helpers/ToastForm.cs
  class Drawing (line 7) | static class Drawing
    method RoundedRect (line 10) | public static GraphicsPath RoundedRect(Rectangle bounds, int radius)
    method FillRoundedRectangle (line 34) | public static void FillRoundedRectangle(this Graphics graphics, Brush ...
  type ToastIcon (line 43) | public enum ToastIcon
  class ToastForm (line 58) | public class ToastForm : OSDNativeForm
    method ToastForm (line 66) | public ToastForm()
    method PerformPaint (line 73) | protected override void PerformPaint(PaintEventArgs e)
    method ReadText (line 140) | public static void ReadText(string text)
    method RunToast (line 150) | public void RunToast(string text, ToastIcon? icon = null)
    method timer_Tick (line 184) | private void timer_Tick(object? sender, EventArgs e)

FILE: app/Helpers/TouchscreenHelper.cs
  class TouchscreenHelper (line 3) | public static class TouchscreenHelper
    method GetStatus (line 6) | public static bool? GetStatus()
    method ToggleTouchscreen (line 20) | public static void ToggleTouchscreen(bool status)

FILE: app/Input/InputDispatcher.cs
  class InputDispatcher (line 13) | public class InputDispatcher
    method InputDispatcher (line 44) | public InputDispatcher()
    method Timer_Elapsed (line 61) | private void Timer_Elapsed(object? sender, System.Timers.ElapsedEventA...
    method Init (line 90) | public void Init()
    method InitFNLock (line 111) | public static void InitFNLock()
    method InitBacklightTimer (line 116) | public void InitBacklightTimer()
    method GetModifierKeys (line 122) | private static ModifierKeys GetModifierKeys(string configKey, Modifier...
    method RegisterKeys (line 140) | public void RegisterKeys()
    method ParseHexValues (line 215) | public static int[] ParseHexValues(string input)
    method CustomKey (line 239) | static void CustomKey(string configKey = "m3")
    method SetBrightness (line 274) | static void SetBrightness(bool up, bool hotkey = false)
    method SetBrightnessDimming (line 303) | static void SetBrightnessDimming(int delta)
    method KeyPressed (line 310) | public void KeyPressed(object sender, KeyPressedEventArgs e)
    method KeyProcess (line 549) | public static void KeyProcess(string name = "m3")
    method MuteLED (line 653) | static void MuteLED()
    method ToggleTouchScreen (line 659) | static void ToggleTouchScreen()
    method ToggleMic (line 670) | static void ToggleMic()
    method MuteLEDInit (line 677) | static void MuteLEDInit()
    method GetTouchpadState (line 684) | static bool GetTouchpadState()
    method ToggleTouchpadEvent (line 693) | static void ToggleTouchpadEvent(bool hotkey = false)
    method ToggleTouchpad (line 700) | static void ToggleTouchpad()
    method SleepEvent (line 712) | static void SleepEvent()
    method ToggleArrowLock (line 719) | public static void ToggleArrowLock()
    method IsHardwareFnLock (line 728) | public static bool IsHardwareFnLock()
    method HardwareFnLock (line 740) | public static void HardwareFnLock(bool fnLock)
    method ToggleFnLock (line 746) | public static void ToggleFnLock()
    method SetSlateMode (line 761) | public static void SetSlateMode(int status)
    method TabletMode (line 773) | public static void TabletMode()
    method GetTentState (line 788) | static int GetTentState()
    method TentMode (line 795) | public static void TentMode()
    method HandleEvent (line 803) | static void HandleEvent(int EventID)
    method HandleOptimizationEvent (line 909) | static void HandleOptimizationEvent(int EventID)
    method GetBacklight (line 990) | public static int GetBacklight()
    method AutoKeyboard (line 1004) | public static void AutoKeyboard()
    method SetBacklightAuto (line 1034) | public static void SetBacklightAuto(bool init = false)
    method StartupBacklight (line 1041) | public static void StartupBacklight()
    method SetBacklight (line 1046) | public static void SetBacklight(int delta, bool force = false)
    method ToggleScreenpad (line 1078) | public static void ToggleScreenpad()
    method ToggleScreenRate (line 1092) | public static void ToggleScreenRate()
    method GetAsusPath (line 1099) | private static string GetAsusPath()
    method ToggleCamera (line 1124) | public static void ToggleCamera()
    method SetCamera (line 1163) | private static void SetCamera(int status, bool toast = true)
    method InitCamera (line 1186) | private static void InitCamera()
    method ApplyScreenpadAction (line 1194) | public static void ApplyScreenpadAction(int brightness, bool instant =...
    method SetScreenpad (line 1224) | public static void SetScreenpad(int delta)
    method InitScreenpad (line 1251) | public static void InitScreenpad()
    method SetStatusLED (line 1258) | public static void SetStatusLED(bool status)
    method InitStatusLed (line 1263) | public static void InitStatusLed()
    method ShutdownStatusLed (line 1268) | public static void ShutdownStatusLed()
    method LaunchProcess (line 1273) | static void LaunchProcess(string command = "")
    method WatcherEventArrived (line 1289) | static void WatcherEventArrived(object sender, EventArrivedEventArgs e)

FILE: app/Input/KeyboardHook.cs
  class KeyboardHook (line 3) | public sealed class KeyboardHook : IDisposable
    method RegisterHotKey (line 6) | [DllImport("user32.dll")]
    method UnregisterHotKey (line 9) | [DllImport("user32.dll")]
    method CallNextHookEx (line 12) | [DllImport("user32.dll")]
    method keybd_event (line 15) | [DllImport("user32.dll", SetLastError = true)]
    method mouse_event (line 24) | [DllImport("user32.dll")]
    method KeyPress (line 36) | public static void KeyPress(Keys key)
    method KeyKeyPress (line 56) | public static void KeyKeyPress(Keys key, Keys key2)
    method KeyKeyKeyPress (line 67) | public static void KeyKeyKeyPress(Keys key, Keys key2, Keys key3, int ...
    method KeyKeyKeyKeyPress (line 80) | public static void KeyKeyKeyKeyPress(Keys key, Keys key2, Keys key3, K...
    class Window (line 98) | private class Window : NativeWindow, IDisposable
      method Window (line 103) | public Window()
      method WndProc (line 113) | protected override void WndProc(ref Message m)
      method Dispose (line 134) | public void Dispose()
    method KeyboardHook (line 145) | public KeyboardHook()
    method RegisterHotKey (line 160) | public void RegisterHotKey(ModifierKeys modifier, Keys key)
    method UnregisterAll (line 177) | public void UnregisterAll()
    method Dispose (line 186) | public void Dispose()
  class KeyPressedEventArgs (line 199) | public class KeyPressedEventArgs : EventArgs
    method KeyPressedEventArgs (line 204) | internal KeyPressedEventArgs(ModifierKeys modifier, Keys key)
  type ModifierKeys (line 224) | [Flags]

FILE: app/Input/KeyboardListener.cs
  class KeyboardListener (line 7) | public class KeyboardListener
    method KeyboardListener (line 15) | public KeyboardListener(Action<int> KeyHandler)
    method Listen (line 21) | private void Listen()
    method Dispose (line 83) | public void Dispose()

FILE: app/Matrix.Designer.cs
  class Matrix (line 3) | partial class Matrix
    method Dispose (line 14) | protected override void Dispose(bool disposing)
    method InitializeComponent (line 29) | private void InitializeComponent()

FILE: app/Matrix.cs
  class Matrix (line 6) | public partial class Matrix : RForm
    method Matrix (line 23) | public Matrix()
    method TrackMatrix_ValueChanged (line 75) | private void TrackMatrix_ValueChanged(object? sender, EventArgs e)
    method TrackMatrix_MouseUp (line 80) | private void TrackMatrix_MouseUp(object? sender, MouseEventArgs e)
    method ComboRotation_SelectedValueChanged (line 88) | private void ComboRotation_SelectedValueChanged(object? sender, EventA...
    method ComboScaling_SelectedValueChanged (line 94) | private void ComboScaling_SelectedValueChanged(object? sender, EventAr...
    method Matrix_FormClosed (line 100) | private void Matrix_FormClosed(object? sender, FormClosingEventArgs e)
    method VisualiseMatrix (line 110) | private void VisualiseMatrix()
    method ButtonReset_Click (line 117) | private void ButtonReset_Click(object? sender, EventArgs e)
    method TrackZoom_MouseUp (line 133) | private void TrackZoom_MouseUp(object? sender, EventArgs e)
    method TrackZoom_Changed (line 139) | private void TrackZoom_Changed(object? sender, EventArgs e)
    method PictureMatrix_MouseDown (line 145) | private void PictureMatrix_MouseDown(object? sender, MouseEventArgs e)
    method PictureMatrix_MouseMove (line 155) | private void PictureMatrix_MouseMove(object? sender, MouseEventArgs e)
    method PictureMatrix_MouseUp (line 165) | private void PictureMatrix_MouseUp(object? sender, MouseEventArgs e)
    method Matrix_Shown (line 181) | private void Matrix_Shown(object? sender, EventArgs e)
    method SetMatrixPicture (line 187) | private void SetMatrixPicture(bool visualise = true)
    method ButtonPicture_Click (line 192) | private void ButtonPicture_Click(object? sender, EventArgs e)
    method FormPosition (line 197) | public void FormPosition()
    method VisualiseMatrix (line 212) | public void VisualiseMatrix(string fileName)

FILE: app/Mode/ModeControl.cs
  class ModeControl (line 8) | public class ModeControl
    method ModeControl (line 24) | public ModeControl()
    method ReapplyTimer_Elapsed (line 32) | private void ReapplyTimer_Elapsed(object? sender, System.Timers.Elapse...
    method AutoPerformance (line 38) | public void AutoPerformance(bool powerChanged = false)
    method ResetPerformanceMode (line 51) | public void ResetPerformanceMode()
    method Toast (line 62) | public void Toast()
    method SetPerformanceMode (line 67) | public void SetPerformanceMode(int mode = -1, bool notify = false)
    method ModeToggleTimer_Elapsed (line 140) | private void ModeToggleTimer_Elapsed(object? sender, System.Timers.Ela...
    method CyclePerformanceMode (line 148) | public void CyclePerformanceMode(bool back = false)
    method AutoFans (line 171) | public void AutoFans(bool force = false)
    method AutoPower (line 228) | public void AutoPower(bool launchAsAdmin = false)
    method SetModeLabel (line 250) | public void SetModeLabel()
    method SetRyzenPower (line 255) | public void SetRyzenPower(bool init = false)
    method SetPower (line 280) | public void SetPower(bool launchAsAdmin = false)
    method SetGPUClocks (line 341) | public void SetGPUClocks(bool launchAsAdmin = true, bool reset = false)
    method SetGPUPower (line 375) | public void SetGPUPower()
    method SetCPUTemp (line 399) | public void SetCPUTemp(int? cpuTemp, bool init = false)
    method SetUV (line 415) | public void SetUV(int cpuUV)
    method SetUViGPU (line 427) | public void SetUViGPU(int igpuUV)
    method SetRyzen (line 440) | public void SetRyzen(bool launchAsAdmin = false)
    method ResetRyzen (line 464) | public void ResetRyzen()
    method AutoRyzen (line 471) | public void AutoRyzen()
    method ShutdownReset (line 479) | public void ShutdownReset()

FILE: app/Mode/Modes.cs
  class Modes (line 3) | internal class Modes
    method GetDictonary (line 34) | public static Dictionary<int, string> GetDictonary()
    method GetList (line 51) | public static List<int> GetList()
    method Remove (line 62) | public static void Remove(int mode)
    method Add (line 70) | public static int Add()
    method GetCurrent (line 105) | public static int GetCurrent()
    method IsCurrentCustom (line 110) | public static bool IsCurrentCustom()
    method SetCurrent (line 115) | public static void SetCurrent(int mode)
    method GetCurrentBase (line 121) | public static int GetCurrentBase()
    method GetCurrentName (line 126) | public static string GetCurrentName()
    method Exists (line 131) | public static bool Exists(int mode)
    method GetBase (line 136) | public static int GetBase(int mode)
    method GetName (line 144) | public static string GetName(int mode)
    method GetNext (line 160) | public static int GetNext(bool back = false)

FILE: app/Mode/PowerNative.cs
  class PowerNative (line 6) | internal class PowerNative
    method PowerWriteDCValueIndex (line 8) | [DllImport("PowrProf.dll", CharSet = CharSet.Unicode)]
    method PowerWriteACValueIndex (line 15) | [DllImport("PowrProf.dll", CharSet = CharSet.Unicode)]
    method PowerReadACValueIndex (line 22) | [DllImport("PowrProf.dll", CharSet = CharSet.Unicode)]
    method PowerReadDCValueIndex (line 30) | [DllImport("PowrProf.dll", CharSet = CharSet.Unicode)]
    method PowerReadACValue (line 39) | [DllImport("powrprof.dll")]
    method PowerSetActiveScheme (line 51) | [DllImport("PowrProf.dll", CharSet = CharSet.Unicode)]
    method PowerGetActiveScheme (line 55) | [DllImport("PowrProf.dll", CharSet = CharSet.Unicode)]
    method PowerGetActualOverlayScheme (line 70) | [DllImportAttribute("powrprof.dll", EntryPoint = "PowerGetActualOverla...
    method PowerGetEffectiveOverlayScheme (line 73) | [DllImportAttribute("powrprof.dll", EntryPoint = "PowerGetEffectiveOve...
    method PowerSetActiveOverlayScheme (line 76) | [DllImportAttribute("powrprof.dll", EntryPoint = "PowerSetActiveOverla...
    method GetActiveScheme (line 99) | static Guid GetActiveScheme()
    method GetCPUBoost (line 107) | public static int GetCPUBoost()
    method SetCPUBoost (line 121) | public static void SetCPUBoost(int boost = 0)
    method GetPowerMode (line 148) | public static string GetPowerMode()
    method SetPowerMode (line 155) | public static void SetPowerMode(string scheme)
    method SetPowerPlan (line 189) | public static void SetPowerPlan(string scheme)
    method GetDefaultPowerMode (line 202) | public static string GetDefaultPowerMode(int mode)
    method SetPowerMode (line 215) | public static void SetPowerMode(int mode)
    method GetASPM (line 220) | public static int GetASPM()
    method SetASPM (line 233) | public static void SetASPM(int status = 0)
    method GetLidAction (line 248) | public static int GetLidAction(bool ac)
    method SetLidAction (line 270) | public static void SetLidAction(int action, bool acOnly = false)
    method GetHibernateAfter (line 305) | public static int GetHibernateAfter()
    method SetHibernateAfter (line 319) | public static void SetHibernateAfter(int minutes)
    method GetSystemPowerStatus (line 336) | [DllImport("Kernel32")]
    type ACLineStatus (line 338) | public enum ACLineStatus : byte
    type BatteryFlag (line 343) | public enum BatteryFlag : byte
    class SystemPowerStatus (line 354) | [StructLayout(LayoutKind.Sequential)]
    method GetBatterySaverStatus (line 365) | public static bool GetBatterySaverStatus()

FILE: app/NativeMethods.cs
  class NativeMethods (line 4) | public static class NativeMethods
    type LASTINPUTINFO (line 7) | internal struct LASTINPUTINFO
    method GetLastInputInfo (line 13) | [DllImport("User32.dll")]
    method GetIdleTime (line 16) | public static TimeSpan GetIdleTime()
    method RegisterWindowMessage (line 29) | [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    method SendMessage (line 32) | [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    method FormatMessage (line 35) | [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    method LockWorkStation (line 38) | [DllImport("user32.dll", SetLastError = true)]
    method LockScreen (line 42) | public static void LockScreen()
    method TurnOffScreen (line 47) | public static void TurnOffScreen()
    method RegisterPowerSettingNotification (line 73) | [DllImport("User32.dll", SetLastError = true)]
    method UnregisterPowerSettingNotification (line 76) | [DllImport("User32.dll", SetLastError = true)]
    type POWERBROADCAST_SETTING (line 79) | [StructLayout(LayoutKind.Sequential, Pack = 4)]
    class PowerSettingGuid (line 87) | public class PowerSettingGuid

FILE: app/Peripherals/IPeripheral.cs
  type PeripheralType (line 4) | public enum PeripheralType
  type IPeripheral (line 10) | public interface IPeripheral
    method CanExport (line 17) | public bool CanExport();
    method Export (line 18) | public byte[] Export();
    method Import (line 19) | public bool Import(byte[] blob);
    method DeviceType (line 21) | public PeripheralType DeviceType();
    method GetDisplayName (line 23) | public string GetDisplayName();
    method HasBattery (line 25) | public bool HasBattery();
    method SynchronizeDevice (line 27) | public void SynchronizeDevice();
    method ReadBattery (line 29) | public void ReadBattery();

FILE: app/Peripherals/Mouse/AsusMouse.cs
  type PowerOffSetting (line 8) | public enum PowerOffSetting
  type DebounceTime (line 18) | public enum DebounceTime
  type PollingRate (line 30) | public enum PollingRate
  type LiftOffDistance (line 42) | public enum LiftOffDistance
  type AnimationDirection (line 47) | public enum AnimationDirection
  type AnimationSpeed (line 53) | public enum AnimationSpeed
  type LightingMode (line 59) | public enum LightingMode
  type LightingZone (line 71) | public enum LightingZone
  class LightingSetting (line 80) | public class LightingSetting
    method LightingSetting (line 82) | public LightingSetting()
    method Export (line 101) | public byte[] Export()
    method Import (line 118) | public bool Import(byte[] blob)
    method Equals (line 138) | public override bool Equals(object? obj)
    method GetHashCode (line 149) | public override int GetHashCode()
    method ToString (line 154) | public override string? ToString()
  class AsusMouseDPI (line 163) | public class AsusMouseDPI
    method AsusMouseDPI (line 165) | public AsusMouseDPI()
    method ToString (line 172) | public override string? ToString()
    method Export (line 177) | public byte[] Export()
    method Import (line 190) | public bool Import(byte[] blob)
  class AsusMouse (line 205) | public abstract class AsusMouse : Device, IPeripheral
    method SetDeviceReady (line 220) | private void SetDeviceReady(bool ready)
    method AsusMouse (line 258) | public AsusMouse(ushort vendorId, ushort productId, string path, bool ...
    method AsusMouse (line 275) | public AsusMouse(ushort vendorId, ushort productId, string path, bool ...
    method CanExport (line 281) | public bool CanExport()
    method Export (line 289) | public byte[] Export()
    method Import (line 330) | public bool Import(byte[] blob)
    method Equals (line 443) | public override bool Equals(object? obj)
    method GetHashCode (line 455) | public override int GetHashCode()
    method Connect (line 464) | public void Connect()
    method Dispose (line 470) | public override void Dispose()
    method Device_Changed (line 477) | private void Device_Changed(object? sender, HidSharp.DeviceListChanged...
    method CheckConnection (line 486) | public virtual void CheckConnection()
    method IsDeviceConnected (line 491) | public bool IsDeviceConnected()
    method USBTimeout (line 504) | public virtual int USBTimeout()
    method USBPacketSize (line 509) | public virtual int USBPacketSize()
    method SetProvider (line 514) | public override void SetProvider()
    method OnDisconnect (line 519) | protected virtual void OnDisconnect()
    method IsPacketLoggerEnabled (line 528) | protected static bool IsPacketLoggerEnabled()
    method IsMouseError (line 538) | protected virtual bool IsMouseError(byte[] packet)
    method MeasuredIO (line 543) | protected virtual long MeasuredIO(Action<byte[]> ioFunc, byte[] param)
    method WriteForResponse (line 553) | [MethodImpl(MethodImplOptions.Synchronized)]
    method GetDisplayName (line 638) | public abstract string GetDisplayName();
    method DeviceType (line 640) | public PeripheralType DeviceType()
    method SynchronizeDevice (line 645) | public virtual void SynchronizeDevice()
    method HasBattery (line 673) | public virtual bool HasBattery()
    method HasAutoPowerOff (line 678) | public virtual bool HasAutoPowerOff()
    method LowBatteryWarningStep (line 683) | public virtual int LowBatteryWarningStep()
    method LowBatteryWarningMax (line 688) | public virtual int LowBatteryWarningMax()
    method HasLowBatteryWarning (line 693) | public virtual bool HasLowBatteryWarning()
    method GetBatteryReportPacket (line 698) | protected virtual byte[] GetBatteryReportPacket()
    method ParseBattery (line 703) | protected virtual int ParseBattery(byte[] packet)
    method ParseChargingState (line 712) | protected virtual bool ParseChargingState(byte[] packet)
    method ParsePowerOffSetting (line 722) | protected virtual PowerOffSetting ParsePowerOffSetting(byte[] packet)
    method ParseLowBatteryWarning (line 731) | protected virtual int ParseLowBatteryWarning(byte[] packet)
    method GetUpdateEnergySettingsPacket (line 740) | protected virtual byte[] GetUpdateEnergySettingsPacket(int lowBatteryW...
    method SetEnergySettings (line 745) | public void SetEnergySettings(int lowBatteryWarning, PowerOffSetting p...
    method ReadBattery (line 760) | public void ReadBattery()
    method ProfileCount (line 814) | public abstract int ProfileCount();
    method HasProfiles (line 816) | public virtual bool HasProfiles()
    method ParseProfile (line 821) | protected virtual int ParseProfile(byte[] packet)
    method ParseDPIProfile (line 831) | protected virtual int ParseDPIProfile(byte[] packet)
    method GetReadProfilePacket (line 841) | protected virtual byte[] GetReadProfilePacket()
    method GetUpdateProfilePacket (line 846) | protected virtual byte[] GetUpdateProfilePacket(int profile)
    method ReadProfile (line 851) | public void ReadProfile()
    method SetProfile (line 879) | public void SetProfile(int profile)
    method HasAngleSnapping (line 904) | public virtual bool HasAngleSnapping()
    method HasAngleTuning (line 908) | public virtual bool HasAngleTuning()
    method AngleTuningStep (line 913) | public virtual int AngleTuningStep()
    method AngleTuningMin (line 918) | public virtual int AngleTuningMin()
    method AngleTuningMax (line 923) | public virtual int AngleTuningMax()
    method PollingRateDisplayString (line 928) | public virtual string PollingRateDisplayString(PollingRate pollingRate)
    method PollingRateCount (line 933) | public virtual int PollingRateCount()
    method PollingRateIndex (line 938) | public virtual int PollingRateIndex(PollingRate pollingRate)
    method IsPollingRateSupported (line 951) | public virtual bool IsPollingRateSupported(PollingRate pollingRate)
    method SupportedPollingrates (line 956) | public abstract PollingRate[] SupportedPollingrates();
    method CanSetPollingRate (line 958) | public virtual bool CanSetPollingRate()
    method GetReadPollingRatePacket (line 963) | protected virtual byte[] GetReadPollingRatePacket()
    method GetUpdatePollingRatePacket (line 968) | protected virtual byte[] GetUpdatePollingRatePacket(PollingRate pollin...
    method GetUpdateAngleSnappingPacket (line 972) | protected virtual byte[] GetUpdateAngleSnappingPacket(bool angleSnapping)
    method GetUpdateAngleAdjustmentPacket (line 976) | protected virtual byte[] GetUpdateAngleAdjustmentPacket(short angleAdj...
    method ParsePollingRate (line 981) | protected virtual PollingRate ParsePollingRate(byte[] packet)
    method ParseAngleSnapping (line 997) | protected virtual bool ParseAngleSnapping(byte[] packet)
    method ParseAngleAdjustment (line 1007) | protected virtual short ParseAngleAdjustment(byte[] packet)
    method ReadPollingRate (line 1017) | public void ReadPollingRate()
    method SetPollingRate (line 1040) | public void SetPollingRate(PollingRate pollingRate)
    method SetAngleSnapping (line 1060) | public void SetAngleSnapping(bool angleSnapping)
    method SetAngleAdjustment (line 1074) | public void SetAngleAdjustment(short angleAdjustment)
    method HasAcceleration (line 1098) | public virtual bool HasAcceleration()
    method HasDeceleration (line 1103) | public virtual bool HasDeceleration()
    method MaxAcceleration (line 1108) | public virtual int MaxAcceleration()
    method MaxDeceleration (line 1112) | public virtual int MaxDeceleration()
    method GetChangeAccelerationPacket (line 1117) | protected virtual byte[] GetChangeAccelerationPacket(int acceleration)
    method GetChangeDecelerationPacket (line 1122) | protected virtual byte[] GetChangeDecelerationPacket(int deceleration)
    method SetAcceleration (line 1127) | public virtual void SetAcceleration(int acceleration)
    method SetDeceleration (line 1147) | public virtual void SetDeceleration(int deceleration)
    method GetReadAccelerationPacket (line 1167) | protected virtual byte[] GetReadAccelerationPacket()
    method ParseAcceleration (line 1172) | protected virtual int ParseAcceleration(byte[] packet)
    method ParseDeceleration (line 1182) | protected virtual int ParseDeceleration(byte[] packet)
    method ReadAcceleration (line 1192) | public virtual void ReadAcceleration()
    method DPIProfileCount (line 1218) | public abstract int DPIProfileCount();
    method HasDPIColors (line 1219) | public virtual bool HasDPIColors()
    method DPIIncrements (line 1224) | public virtual int DPIIncrements()
    method CanChangeDPIProfile (line 1229) | public virtual bool CanChangeDPIProfile()
    method CanChangeDPICount (line 1234) | public virtual bool CanChangeDPICount()
    method MaxDPI (line 1239) | public virtual int MaxDPI()
    method MinDPI (line 1243) | public virtual int MinDPI()
    method HasXYDPI (line 1248) | public virtual bool HasXYDPI()
    method GetChangeDPIProfilePacket (line 1253) | protected virtual byte[] GetChangeDPIProfilePacket(int profile)
    method GetSetDPIProfileCountPacket (line 1259) | protected virtual byte[] GetSetDPIProfileCountPacket(int count)
    method GetChangeDPIProfilePacket2 (line 1264) | protected virtual byte[] GetChangeDPIProfilePacket2(int profile)
    method SetDPIProfile (line 1270) | public virtual void SetDPIProfile(int profile)
    method GetReadDPIPacket (line 1292) | protected virtual byte[] GetReadDPIPacket()
    method GetUpdateDPIPacket (line 1302) | protected virtual byte[]? GetUpdateDPIPacket(AsusMouseDPI dpi, int pro...
    method ParseDPI (line 1325) | protected virtual void ParseDPI(byte[] packet)
    method GetReadDPIColorsPacket (line 1349) | protected virtual byte[] GetReadDPIColorsPacket()
    method ParseDPIColors (line 1354) | protected virtual void ParseDPIColors(byte[] packet)
    method ReadDPI (line 1374) | public void ReadDPI()
    method SetDPIForProfile (line 1394) | public void SetDPIForProfile(AsusMouseDPI dpi, int profile)
    method SetDPIProfileCount (line 1416) | public void SetDPIProfileCount(int count)
    method AddDPIProfile (line 1437) | public void AddDPIProfile()
    method DeleteDPIProfile (line 1460) | public void DeleteDPIProfile(int index)
    method HasLiftOffSetting (line 1494) | public virtual bool HasLiftOffSetting()
    method GetReadLiftOffDistancePacket (line 1499) | protected virtual byte[] GetReadLiftOffDistancePacket()
    method GetUpdateLiftOffDistancePacket (line 1505) | protected virtual byte[] GetUpdateLiftOffDistancePacket(LiftOffDistanc...
    method ParseLiftOffDistance (line 1510) | protected virtual LiftOffDistance ParseLiftOffDistance(byte[] packet)
    method ReadLiftOffDistance (line 1520) | public void ReadLiftOffDistance()
    method SetLiftOffDistance (line 1535) | public void SetLiftOffDistance(LiftOffDistance liftOffDistance)
    method HasDebounceSetting (line 1553) | public virtual bool HasDebounceSetting()
    method DebounceTimeInMS (line 1558) | public virtual int DebounceTimeInMS(DebounceTime dbt)
    method MinDebounce (line 1575) | public virtual DebounceTime MinDebounce()
    method MaxDebounce (line 1579) | public virtual DebounceTime MaxDebounce()
    method GetReadDebouncePacket (line 1584) | protected virtual byte[] GetReadDebouncePacket()
    method GetUpdateDebouncePacket (line 1590) | protected virtual byte[] GetUpdateDebouncePacket(DebounceTime debounce)
    method ParseDebounce (line 1595) | protected virtual DebounceTime ParseDebounce(byte[] packet)
    method ReadDebounce (line 1615) | public void ReadDebounce()
    method SetDebounce (line 1630) | public void SetDebounce(DebounceTime debounce)
    method HasMotionSync (line 1648) | public virtual bool HasMotionSync()
    method GetUpdateMotionSyncPacket (line 1653) | protected virtual byte[] GetUpdateMotionSyncPacket(bool enabled)
    method SetMotionSync (line 1658) | public void SetMotionSync(bool enabled)
    method GetReadMotionSyncPacket (line 1679) | protected virtual byte[] GetReadMotionSyncPacket()
    method ParseMotionSync (line 1684) | protected virtual bool ParseMotionSync(byte[] packet)
    method ReadMotionSync (line 1694) | public void ReadMotionSync()
    method HasZoneMode (line 1712) | public virtual bool HasZoneMode()
    method GetUpdateZoneModePacket (line 1717) | protected virtual byte[] GetUpdateZoneModePacket(bool enabled)
    method SetZoneMode (line 1730) | public void SetZoneMode(bool enabled)
    method UpdateZoneModeDPI (line 1744) | public void UpdateZoneModeDPI(int dpi)
    method UpdateZoneModePollingRate (line 1758) | public void UpdateZoneModePollingRate(PollingRate pollingRate)
    method GetReadZoneModePacket (line 1772) | protected virtual byte[] GetReadZoneModePacket()
    method ParseZoneMode (line 1777) | protected virtual void ParseZoneMode(byte[] packet)
    method ReadZoneMode (line 1796) | public void ReadZoneMode()
    method HasRGB (line 1814) | public virtual bool HasRGB()
    method MaxBrightness (line 1819) | public virtual int MaxBrightness()
    method IndexForLightingMode (line 1826) | protected virtual byte IndexForLightingMode(LightingMode lightingMode)
    method LightingModeForIndex (line 1832) | protected virtual LightingMode LightingModeForIndex(byte lightingMode)
    method IsLightingModeSupported (line 1843) | public virtual bool IsLightingModeSupported(LightingMode lightingMode)
    method SupportsRandomColor (line 1848) | public virtual bool SupportsRandomColor(LightingMode lightingMode)
    method SupportsAnimationDirection (line 1853) | public virtual bool SupportsAnimationDirection(LightingMode lightingMode)
    method SupportsAnimationSpeed (line 1858) | public virtual bool SupportsAnimationSpeed(LightingMode lightingMode)
    method SupportsColorSetting (line 1863) | public virtual bool SupportsColorSetting(LightingMode lightingMode)
    method SupportedLightingZones (line 1871) | public virtual LightingZone[] SupportedLightingZones()
    method IndexForZone (line 1876) | public virtual int IndexForZone(LightingZone zone)
    method IsLightingZoned (line 1889) | public virtual bool IsLightingZoned()
    method IsLightingModeSupportedForZone (line 1909) | public virtual bool IsLightingModeSupportedForZone(LightingMode lm, Li...
    method LightingSettingForZone (line 1922) | public virtual LightingSetting LightingSettingForZone(LightingZone zone)
    method GetReadLightingModePacket (line 1933) | protected virtual byte[] GetReadLightingModePacket(LightingZone zone)
    method GetUpdateLightingModePacket (line 1945) | protected virtual byte[] GetUpdateLightingModePacket(LightingSetting l...
    method ParseLightingSetting (line 1970) | protected virtual LightingSetting? ParseLightingSetting(byte[] packet)
    method ReadLightingSetting (line 2005) | public virtual void ReadLightingSetting()
    method SetLightingSetting (line 2030) | public void SetLightingSetting(LightingSetting lightingSetting, Lighti...
    method GetSaveProfilePacket (line 2054) | protected virtual byte[] GetSaveProfilePacket()
    method FlushSettings (line 2059) | public void FlushSettings()
    method ToString (line 2066) | public override string? ToString()
    method ByteArrayToString (line 2073) | public static string ByteArrayToString(byte[] packet)

FILE: app/Peripherals/Mouse/Models/Chakram.cs
  class Chakram (line 5) | public class Chakram : AsusMouse
    method Chakram (line 7) | public Chakram() : base(0x0B05, 0x18E5, "mi_00", true) {
    method Chakram (line 11) | protected Chakram(ushort vendorId, bool wireless) : base(0x0B05, vendo...
    method DPIProfileCount (line 14) | public override int DPIProfileCount()
    method GetDisplayName (line 19) | public override string GetDisplayName()
    method SupportedPollingrates (line 24) | public override PollingRate[] SupportedPollingrates()
    method ProfileCount (line 35) | public override int ProfileCount()
    method MaxDPI (line 39) | public override int MaxDPI()
    method HasDebounceSetting (line 44) | public override bool HasDebounceSetting()
    method HasLiftOffSetting (line 48) | public override bool HasLiftOffSetting()
    method DPIIncrements (line 52) | public override int DPIIncrements()
    method HasRGB (line 57) | public override bool HasRGB()
    method MaxBrightness (line 61) | public override int MaxBrightness()
    method SupportedLightingZones (line 66) | public override LightingZone[] SupportedLightingZones()
    method HasAutoPowerOff (line 71) | public override bool HasAutoPowerOff()
    method HasAngleSnapping (line 76) | public override bool HasAngleSnapping()
    method HasAngleTuning (line 81) | public override bool HasAngleTuning()
    method HasLowBatteryWarning (line 86) | public override bool HasLowBatteryWarning()
    method LowBatteryWarningStep (line 91) | public override int LowBatteryWarningStep()
    method LowBatteryWarningMax (line 96) | public override int LowBatteryWarningMax()
    method ParseBattery (line 101) | protected override int ParseBattery(byte[] packet)
    method ParseLowBatteryWarning (line 105) | protected override int ParseLowBatteryWarning(byte[] packet)
    method GetUpdateEnergySettingsPacket (line 109) | protected override byte[] GetUpdateEnergySettingsPacket(int lowBattery...
    method GetReadLightingModePacket (line 113) | protected override byte[] GetReadLightingModePacket(LightingZone zone)
    method ParseLightingSetting (line 118) | protected LightingSetting? ParseLightingSetting(byte[] packet, Lightin...
    method ReadLightingSetting (line 159) | public override void ReadLightingSetting()
    method CanChangeDPIProfile (line 191) | public override bool CanChangeDPIProfile()
  class ChakramWired (line 198) | public class ChakramWired : Chakram
    method ChakramWired (line 200) | public ChakramWired() : base(0x18E3, false)
    method GetDisplayName (line 204) | public override string GetDisplayName()

FILE: app/Peripherals/Mouse/Models/ChakramCore.cs
  class ChakramCore (line 5) | public class ChakramCore : AsusMouse
    method ChakramCore (line 7) | public ChakramCore() : base(0x0B05, 0x1958, "mi_00", false) {
    method DPIProfileCount (line 11) | public override int DPIProfileCount()
    method GetDisplayName (line 16) | public override string GetDisplayName()
    method SupportedPollingrates (line 21) | public override PollingRate[] SupportedPollingrates()
    method ProfileCount (line 32) | public override int ProfileCount()
    method MaxDPI (line 36) | public override int MaxDPI()
    method HasDebounceSetting (line 41) | public override bool HasDebounceSetting()
    method HasLiftOffSetting (line 46) | public override bool HasLiftOffSetting()
    method DPIIncrements (line 50) | public override int DPIIncrements()
    method HasRGB (line 55) | public override bool HasRGB()
    method MaxBrightness (line 59) | public override int MaxBrightness()
    method SupportedLightingZones (line 64) | public override LightingZone[] SupportedLightingZones()
    method IsLightingModeSupported (line 69) | public override bool IsLightingModeSupported(LightingMode lightingMode)
    method IndexForLightingMode (line 78) | protected override byte IndexForLightingMode(LightingMode lightingMode)
    method LightingModeForIndex (line 88) | protected override LightingMode LightingModeForIndex(byte lightingMode)
    method HasBattery (line 98) | public override bool HasBattery()
    method HasAngleSnapping (line 103) | public override bool HasAngleSnapping()
    method HasAngleTuning (line 108) | public override bool HasAngleTuning()
    method GetReadLightingModePacket (line 113) | protected override byte[] GetReadLightingModePacket(LightingZone zone)
    method ParseLightingSetting (line 118) | protected LightingSetting? ParseLightingSetting(byte[] packet, Lightin...
    method ReadLightingSetting (line 159) | public override void ReadLightingSetting()
    method CanChangeDPIProfile (line 191) | public override bool CanChangeDPIProfile()
    method ParseLiftOffDistance (line 196) | protected override LiftOffDistance ParseLiftOffDistance(byte[] packet)
    method GetUpdateLiftOffDistancePacket (line 206) | protected override byte[] GetUpdateLiftOffDistancePacket(LiftOffDistan...

FILE: app/Peripherals/Mouse/Models/ChakramX.cs
  class ChakramX (line 4) | public class ChakramX : AsusMouse
    method ChakramX (line 6) | public ChakramX() : base(0x0B05, 0x1A1A, "mi_00", true)
    method ChakramX (line 10) | protected ChakramX(ushort vendorId, bool wireless) : base(0x0B05, vend...
    method GetDisplayName (line 14) | public override string GetDisplayName()
    method SupportedPollingrates (line 19) | public override PollingRate[] SupportedPollingrates()
    method HasAngleSnapping (line 28) | public override bool HasAngleSnapping()
    method ProfileCount (line 33) | public override int ProfileCount()
    method DPIProfileCount (line 38) | public override int DPIProfileCount()
    method MaxDPI (line 43) | public override int MaxDPI()
    method HasXYDPI (line 48) | public override bool HasXYDPI()
    method HasDebounceSetting (line 53) | public override bool HasDebounceSetting()
    method HasLiftOffSetting (line 58) | public override bool HasLiftOffSetting()
    method HasRGB (line 63) | public override bool HasRGB()
    method SupportedLightingZones (line 68) | public override LightingZone[] SupportedLightingZones()
    method HasAutoPowerOff (line 73) | public override bool HasAutoPowerOff()
    method HasAngleTuning (line 78) | public override bool HasAngleTuning()
    method HasLowBatteryWarning (line 83) | public override bool HasLowBatteryWarning()
    method HasDPIColors (line 88) | public override bool HasDPIColors()
  class ChakramXWired (line 94) | public class ChakramXWired : ChakramX
    method ChakramXWired (line 96) | public ChakramXWired() : base(0x1A18, false)
    method GetDisplayName (line 100) | public override string GetDisplayName()
    method SupportedPollingrates (line 105) | public override PollingRate[] SupportedPollingrates()

FILE: app/Peripherals/Mouse/Models/GladiusII.cs
  class GladiusIIOrigin (line 4) | public class GladiusIIOrigin : AsusMouse
    method GladiusIIOrigin (line 6) | public GladiusIIOrigin() : base(0x0B05, 0x1877, "mi_02", false)
    method GladiusIIOrigin (line 10) | public GladiusIIOrigin(ushort productId, string path) : base(0x0B05, p...
    method DPIProfileCount (line 14) | public override int DPIProfileCount()
    method GetDisplayName (line 19) | public override string GetDisplayName()
    method SupportedPollingrates (line 25) | public override PollingRate[] SupportedPollingrates()
    method ProfileCount (line 35) | public override int ProfileCount()
    method MaxDPI (line 39) | public override int MaxDPI()
    method HasRGB (line 44) | public override bool HasRGB()
    method HasAutoPowerOff (line 49) | public override bool HasAutoPowerOff()
    method HasAngleSnapping (line 54) | public override bool HasAngleSnapping()
    method HasAngleTuning (line 59) | public override bool HasAngleTuning()
    method HasDebounceSetting (line 64) | public override bool HasDebounceSetting()
    method HasLiftOffSetting (line 68) | public override bool HasLiftOffSetting()
    method HasLowBatteryWarning (line 73) | public override bool HasLowBatteryWarning()
    method HasBattery (line 78) | public override bool HasBattery()
    method HasDPIColors (line 83) | public override bool HasDPIColors()
    method IsLightingModeSupported (line 88) | public override bool IsLightingModeSupported(LightingMode lightingMode)
    method SupportedLightingZones (line 98) | public override LightingZone[] SupportedLightingZones()
    method DPIIncrements (line 103) | public override int DPIIncrements()
    method CanChangeDPIProfile (line 108) | public override bool CanChangeDPIProfile()
    method MaxBrightness (line 113) | public override int MaxBrightness()
    method GetUpdateLightingModePacket (line 118) | protected override byte[] GetUpdateLightingModePacket(LightingSetting ...
    method GetReadLightingModePacket (line 157) | protected override byte[] GetReadLightingModePacket(LightingZone zone)
    method ParseLightingSetting (line 162) | protected LightingSetting? ParseLightingSetting(byte[] packet, Lightin...
    method ReadLightingSetting (line 182) | public override void ReadLightingSetting()
    method ParsePollingRate (line 227) | protected override PollingRate ParsePollingRate(byte[] packet)
    method GetUpdatePollingRatePacket (line 237) | protected override byte[] GetUpdatePollingRatePacket(PollingRate polli...
    method ParseAngleSnapping (line 242) | protected override bool ParseAngleSnapping(byte[] packet)
    method GetUpdateAngleSnappingPacket (line 252) | protected override byte[] GetUpdateAngleSnappingPacket(bool angleSnapp...
    method ParseDebounce (line 257) | protected override DebounceTime ParseDebounce(byte[] packet)
    method GetUpdateDebouncePacket (line 277) | protected override byte[] GetUpdateDebouncePacket(DebounceTime debounce)
  class GladiusII (line 284) | public class GladiusII : GladiusIIOrigin
    method GladiusII (line 286) | public GladiusII() : base(0x1845, "mi_02")
    method GetDisplayName (line 290) | public override string GetDisplayName()
    method ProfileCount (line 295) | public override int ProfileCount()
  class GladiusIIOriginPink (line 302) | public class GladiusIIOriginPink : GladiusIIOrigin
    method GladiusIIOriginPink (line 304) | public GladiusIIOriginPink() : base(0x18CD, "mi_02")
    method GetDisplayName (line 308) | public override string GetDisplayName()
    method ProfileCount (line 312) | public override int ProfileCount()
    method SupportedLightingZones (line 317) | public override LightingZone[] SupportedLightingZones()
    method GetUpdateLightingModePacket (line 322) | protected override byte[] GetUpdateLightingModePacket(LightingSetting ...
    method ParseLightingSetting (line 365) | protected LightingSetting? ParseLightingSetting(byte[] packet, Lightin...
    method ReadLightingSetting (line 389) | public override void ReadLightingSetting()

FILE: app/Peripherals/Mouse/Models/GladiusIIIAimpoint.cs
  class GladiusIIIAimpoint (line 4) | public class GladiusIIIAimpoint : AsusMouse
    method GladiusIIIAimpoint (line 6) | public GladiusIIIAimpoint() : base(0x0B05, 0x1A72, "mi_00", true)
    method GladiusIIIAimpoint (line 10) | protected GladiusIIIAimpoint(ushort productId, bool wireless) : base(0...
    method GladiusIIIAimpoint (line 14) | protected GladiusIIIAimpoint(ushort productId, bool wireless, string e...
    method DPIProfileCount (line 18) | public override int DPIProfileCount()
    method GetDisplayName (line 23) | public override string GetDisplayName()
    method SupportedPollingrates (line 29) | public override PollingRate[] SupportedPollingrates()
    method ProfileCount (line 39) | public override int ProfileCount()
    method MaxDPI (line 43) | public override int MaxDPI()
    method HasXYDPI (line 48) | public override bool HasXYDPI()
    method HasDebounceSetting (line 53) | public override bool HasDebounceSetting()
    method HasLiftOffSetting (line 58) | public override bool HasLiftOffSetting()
    method HasRGB (line 63) | public override bool HasRGB()
    method SupportedLightingZones (line 68) | public override LightingZone[] SupportedLightingZones()
    method HasAutoPowerOff (line 73) | public override bool HasAutoPowerOff()
    method HasAngleSnapping (line 78) | public override bool HasAngleSnapping()
    method HasAngleTuning (line 83) | public override bool HasAngleTuning()
    method HasLowBatteryWarning (line 88) | public override bool HasLowBatteryWarning()
    method HasDPIColors (line 93) | public override bool HasDPIColors()
  class GladiusIIIAimpointWired (line 99) | public class GladiusIIIAimpointWired : GladiusIIIAimpoint
    method GladiusIIIAimpointWired (line 101) | public GladiusIIIAimpointWired() : base(0x1A70, false)
    method GetDisplayName (line 105) | public override string GetDisplayName()
  class GladiusIIIAimpointEva2 (line 111) | public class GladiusIIIAimpointEva2 : GladiusIIIAimpoint
    method GladiusIIIAimpointEva2 (line 113) | public GladiusIIIAimpointEva2() : base(0x1B0C, true)
    method GladiusIIIAimpointEva2 (line 117) | public GladiusIIIAimpointEva2(ushort productId) : base(productId, false)
    method GetDisplayName (line 121) | public override string GetDisplayName()
    method SupportedLightingZones (line 126) | public override LightingZone[] SupportedLightingZones()
    method IsLightingModeSupported (line 131) | public override bool IsLightingModeSupported(LightingMode lightingMode)
  class GladiusIIIAimpointEva2Wired (line 142) | public class GladiusIIIAimpointEva2Wired : GladiusIIIAimpointEva2
    method GladiusIIIAimpointEva2Wired (line 144) | public GladiusIIIAimpointEva2Wired() : base(0x1B0A)
    method GetDisplayName (line 148) | public override string GetDisplayName()
  class GladiusIIIAimpointOmni (line 154) | public class GladiusIIIAimpointOmni : GladiusIIIAimpoint
    method GladiusIIIAimpointOmni (line 156) | public GladiusIIIAimpointOmni() : base(0x1ACE, true, "mi_02&col03", 0x03)
    method GetDisplayName (line 160) | public override string GetDisplayName()
    method USBPacketSize (line 165) | public override int USBPacketSize()

FILE: app/Peripherals/Mouse/Models/GladiusIIIWireless.cs
  class GladiusIIIWireless (line 4) | public class GladiusIIIWireless : AsusMouse
    method GladiusIIIWireless (line 6) | public GladiusIIIWireless() : base(0x0B05, 0x197F, "mi_00", true)
    method GladiusIIIWireless (line 10) | protected GladiusIIIWireless(ushort vendorId, bool wireless) : base(0x...
    method DPIProfileCount (line 14) | public override int DPIProfileCount()
    method GetDisplayName (line 19) | public override string GetDisplayName()
    method SupportedPollingrates (line 25) | public override PollingRate[] SupportedPollingrates()
    method ProfileCount (line 35) | public override int ProfileCount()
    method MaxDPI (line 39) | public override int MaxDPI()
    method HasDebounceSetting (line 44) | public override bool HasDebounceSetting()
    method HasLiftOffSetting (line 49) | public override bool HasLiftOffSetting()
    method HasRGB (line 54) | public override bool HasRGB()
    method SupportedLightingZones (line 59) | public override LightingZone[] SupportedLightingZones()
    method HasAutoPowerOff (line 64) | public override bool HasAutoPowerOff()
    method HasAngleSnapping (line 69) | public override bool HasAngleSnapping()
    method HasLowBatteryWarning (line 74) | public override bool HasLowBatteryWarning()
  class GladiusIIIWired (line 80) | public class GladiusIIIWired : GladiusIIIWireless
    method GladiusIIIWired (line 82) | public GladiusIIIWired() : base(0x197d, false)
    method GetDisplayName (line 86) | public override string GetDisplayName()
  class GladiusIII (line 94) | public class GladiusIII : GladiusIIIWireless
    method GladiusIII (line 96) | public GladiusIII() : base(0x197B, false)
    method GetDisplayName (line 100) | public override string GetDisplayName()
    method HasAutoPowerOff (line 105) | public override bool HasAutoPowerOff()
    method HasLowBatteryWarning (line 110) | public override bool HasLowBatteryWarning()
    method HasBattery (line 115) | public override bool HasBattery()
    method IsLightingModeSupported (line 120) | public override bool IsLightingModeSupported(LightingMode lightingMode)

FILE: app/Peripherals/Mouse/Models/GladiusIIWireless.cs
  class GladiusIIWireless (line 3) | public class GladiusIIWireless : AsusMouse
    method GladiusIIWireless (line 5) | public GladiusIIWireless() : base(0x0B05, 0x18A0, "mi_02", true)
    method DPIProfileCount (line 9) | public override int DPIProfileCount()
    method GetDisplayName (line 14) | public override string GetDisplayName()
    method SupportedPollingrates (line 20) | public override PollingRate[] SupportedPollingrates()
    method ProfileCount (line 30) | public override int ProfileCount()
    method MaxDPI (line 34) | public override int MaxDPI()
    method HasRGB (line 39) | public override bool HasRGB()
    method HasAutoPowerOff (line 44) | public override bool HasAutoPowerOff()
    method HasAngleSnapping (line 49) | public override bool HasAngleSnapping()
    method HasAngleTuning (line 54) | public override bool HasAngleTuning()
    method HasDebounceSetting (line 59) | public override bool HasDebounceSetting()
    method HasLiftOffSetting (line 63) | public override bool HasLiftOffSetting()
    method HasLowBatteryWarning (line 68) | public override bool HasLowBatteryWarning()
    method LowBatteryWarningStep (line 73) | public override int LowBatteryWarningStep()
    method HasBattery (line 78) | public override bool HasBattery()
    method HasDPIColors (line 83) | public override bool HasDPIColors()
    method IsLightingModeSupported (line 88) | public override bool IsLightingModeSupported(LightingMode lightingMode)
    method SupportedLightingZones (line 97) | public override LightingZone[] SupportedLightingZones()
    method DPIIncrements (line 102) | public override int DPIIncrements()
    method CanChangeDPIProfile (line 107) | public override bool CanChangeDPIProfile()
    method MaxBrightness (line 112) | public override int MaxBrightness()
    method ParseBattery (line 118) | protected override int ParseBattery(byte[] packet)
    method GetUpdateLightingModePacket (line 128) | protected override byte[] GetUpdateLightingModePacket(LightingSetting ...
    method GetReadLightingModePacket (line 168) | protected override byte[] GetReadLightingModePacket(LightingZone zone)
    method ParseLightingSetting (line 173) | protected LightingSetting? ParseLightingSetting(byte[] packet, Lightin...
    method ReadLightingSetting (line 193) | public override void ReadLightingSetting()
    method ParsePollingRate (line 238) | protected override PollingRate ParsePollingRate(byte[] packet)
    method GetUpdatePollingRatePacket (line 248) | protected override byte[] GetUpdatePollingRatePacket(PollingRate polli...
    method ParseAngleSnapping (line 253) | protected override bool ParseAngleSnapping(byte[] packet)
    method GetUpdateAngleSnappingPacket (line 263) | protected override byte[] GetUpdateAngleSnappingPacket(bool angleSnapp...
    method ParseDebounce (line 268) | protected override DebounceTime ParseDebounce(byte[] packet)
    method GetUpdateDebouncePacket (line 288) | protected override byte[] GetUpdateDebouncePacket(DebounceTime debounce)

FILE: app/Peripherals/Mouse/Models/HarpeAceAimLab.cs
  class HarpeAceAimLabEdition (line 4) | public class HarpeAceAimLabEdition : AsusMouse
    method HarpeAceAimLabEdition (line 6) | public HarpeAceAimLabEdition() : base(0x0B05, 0x1A94, "mi_00", true)
    method HarpeAceAimLabEdition (line 10) | protected HarpeAceAimLabEdition(ushort productId, bool wireless, strin...
    method DPIProfileCount (line 14) | public override int DPIProfileCount()
    method GetDisplayName (line 19) | public override string GetDisplayName()
    method SupportedPollingrates (line 25) | public override PollingRate[] SupportedPollingrates()
    method ProfileCount (line 38) | public override int ProfileCount()
    method MaxDPI (line 42) | public override int MaxDPI()
    method MinDPI (line 47) | public override int MinDPI()
    method HasXYDPI (line 52) | public override bool HasXYDPI()
    method HasDebounceSetting (line 57) | public override bool HasDebounceSetting()
    method HasLiftOffSetting (line 62) | public override bool HasLiftOffSetting()
    method HasRGB (line 67) | public override bool HasRGB()
    method SupportedLightingZones (line 72) | public override LightingZone[] SupportedLightingZones()
    method IsLightingModeSupported (line 77) | public override bool IsLightingModeSupported(LightingMode lightingMode)
    method HasAutoPowerOff (line 87) | public override bool HasAutoPowerOff()
    method HasAngleSnapping (line 92) | public override bool HasAngleSnapping()
    method HasAngleTuning (line 97) | public override bool HasAngleTuning()
    method HasLowBatteryWarning (line 102) | public override bool HasLowBatteryWarning()
    method HasDPIColors (line 107) | public override bool HasDPIColors()
    method AngleTuningStep (line 112) | public override int AngleTuningStep()
    method AngleTuningMin (line 117) | public override int AngleTuningMin()
    method AngleTuningMax (line 122) | public override int AngleTuningMax()
    method HasAcceleration (line 127) | public override bool HasAcceleration()
    method HasDeceleration (line 132) | public override bool HasDeceleration()
    method MaxAcceleration (line 137) | public override int MaxAcceleration()
    method MaxDeceleration (line 141) | public override int MaxDeceleration()
  class HarpeAceAimLabEditionWired (line 147) | public class HarpeAceAimLabEditionWired : HarpeAceAimLabEdition
    method HarpeAceAimLabEditionWired (line 149) | public HarpeAceAimLabEditionWired() : base(0x1A92, false, "mi_00", 0x00)
    method GetDisplayName (line 153) | public override string GetDisplayName()
  class HarpeAceAimLabEditionOmni (line 159) | public class HarpeAceAimLabEditionOmni : HarpeAceAimLabEdition
    method HarpeAceAimLabEditionOmni (line 161) | public HarpeAceAimLabEditionOmni() : base(0x1ACE, true, "mi_02&col03",...
    method GetDisplayName (line 165) | public override string GetDisplayName()
    method USBPacketSize (line 170) | public override int USBPacketSize()
  class HarpeAceExtremeWeird (line 177) | public class HarpeAceExtremeWeird : HarpeAceAimLabEdition
    method HarpeAceExtremeWeird (line 179) | public HarpeAceExtremeWeird() : base(0x1B67, false, "mi_00", 0x00)
    method MaxDPI (line 182) | public override int MaxDPI()
    method GetDisplayName (line 187) | public override string GetDisplayName()
  class HarpeAceExtremeOmni (line 193) | public class HarpeAceExtremeOmni : HarpeAceAimLabEdition
    method HarpeAceExtremeOmni (line 195) | public HarpeAceExtremeOmni() : base(0x1ACE, true, "mi_02&col03", 0x03)
    method GetDisplayName (line 199) | public override string GetDisplayName()
    method USBPacketSize (line 204) | public override int USBPacketSize()
    method MaxDPI (line 208) | public override int MaxDPI()

FILE: app/Peripherals/Mouse/Models/HarpeAceMini.cs
  class HarpeAceMiniWired (line 4) | public class HarpeAceMiniWired : AsusMouse
    method HarpeAceMiniWired (line 7) | public HarpeAceMiniWired() : base(0x0B05, 0x1B63, "mi_00", false)
    method HarpeAceMiniWired (line 11) | protected HarpeAceMiniWired(ushort productId, bool wireless, string en...
    method DPIProfileCount (line 15) | public override int DPIProfileCount()
    method GetDisplayName (line 20) | public override string GetDisplayName()
    method CanChangeDPICount (line 25) | public override bool CanChangeDPICount()
    method SupportedPollingrates (line 30) | public override PollingRate[] SupportedPollingrates()
    method ProfileCount (line 40) | public override int ProfileCount()
    method MaxDPI (line 44) | public override int MaxDPI()
    method HasXYDPI (line 49) | public override bool HasXYDPI()
    method HasLiftOffSetting (line 54) | public override bool HasLiftOffSetting()
    method HasRGB (line 59) | public override bool HasRGB()
    method SupportedLightingZones (line 64) | public override LightingZone[] SupportedLightingZones()
    method IsLightingModeSupported (line 69) | public override bool IsLightingModeSupported(LightingMode lightingMode)
    method HasAutoPowerOff (line 79) | public override bool HasAutoPowerOff()
    method HasAngleSnapping (line 84) | public override bool HasAngleSnapping()
    method HasAngleTuning (line 89) | public override bool HasAngleTuning()
    method HasLowBatteryWarning (line 94) | public override bool HasLowBatteryWarning()
    method HasDPIColors (line 99) | public override bool HasDPIColors()
    method AngleTuningStep (line 104) | public override int AngleTuningStep()
    method USBPacketSize (line 109) | public override int USBPacketSize()
  class HarpeAceMiniOmni (line 115) | public class HarpeAceMiniOmni : HarpeAceMiniWired
    method HarpeAceMiniOmni (line 117) | public HarpeAceMiniOmni() : base(0x1ACE, true, "mi_02&col03", 0x03)
    method GetDisplayName (line 121) | public override string GetDisplayName()

FILE: app/Peripherals/Mouse/Models/HarpeIIAce.cs
  class HarpeIIAceWired (line 4) | public class HarpeIIAceWired : AsusMouse
    method HarpeIIAceWired (line 6) | public HarpeIIAceWired() : base(0x0B05, 0x1C69, "mi_00", false)
    method HarpeIIAceWired (line 10) | protected HarpeIIAceWired(ushort productId, bool wireless, string endp...
    method GetDisplayName (line 14) | public override string GetDisplayName()
    method DPIProfileCount (line 19) | public override int DPIProfileCount()
    method MaxDPI (line 24) | public override int MaxDPI()
    method MinDPI (line 29) | public override int MinDPI()
    method HasXYDPI (line 33) | public override bool HasXYDPI()
    method HasDPIColors (line 37) | public override bool HasDPIColors()
    method HasBattery (line 41) | public override bool HasBattery()
    method HasAutoPowerOff (line 46) | public override bool HasAutoPowerOff()
    method HasLowBatteryWarning (line 51) | public override bool HasLowBatteryWarning()
    method ProfileCount (line 56) | public override int ProfileCount()
    method SupportedPollingrates (line 61) | public override PollingRate[] SupportedPollingrates()
    method HasLiftOffSetting (line 74) | public override bool HasLiftOffSetting()
    method HasAngleSnapping (line 79) | public override bool HasAngleSnapping()
    method HasAngleTuning (line 84) | public override bool HasAngleTuning()
    method HasMotionSync (line 89) | public override bool HasMotionSync()
    method HasRGB (line 96) | public override bool HasRGB()
    method SupportedLightingZones (line 101) | public override LightingZone[] SupportedLightingZones()
    method IsLightingModeSupported (line 107) | public override bool IsLightingModeSupported(LightingMode lightingMode)
    method CanChangeDPICount (line 117) | public override bool CanChangeDPICount()
    method USBPacketSize (line 122) | public override int USBPacketSize()
  class HarpeIIAceWireless (line 129) | public class HarpeIIAceWireless : HarpeIIAceWired
    method HarpeIIAceWireless (line 131) | public HarpeIIAceWireless() : base(0x1AD0, true, "mi_02&col03", 0x03)
    method GetDisplayName (line 135) | public override string GetDisplayName()
    method HasZoneMode (line 140) | public override bool HasZoneMode()

FILE: app/Peripherals/Mouse/Models/KerisIIAce.cs
  class KerisIIAceWired (line 4) | public class KerisIIAceWired : AsusMouse
    method KerisIIAceWired (line 6) | public KerisIIAceWired() : base(0x0B05, 0x1B16, "mi_00", true)
    method KerisIIAceWired (line 10) | protected KerisIIAceWired(ushort productId, bool wireless, string endp...
    method DPIProfileCount (line 14) | public override int DPIProfileCount()
    method GetDisplayName (line 19) | public override string GetDisplayName()
    method SupportedPollingrates (line 25) | public override PollingRate[] SupportedPollingrates()
    method ProfileCount (line 35) | public override int ProfileCount()
    method MaxDPI (line 41) | public override int MaxDPI()
    method HasLiftOffSetting (line 46) | public override bool HasLiftOffSetting()
    method HasRGB (line 51) | public override bool HasRGB()
    method HasXYDPI (line 56) | public override bool HasXYDPI()
    method IsLightingModeSupported (line 62) | public override bool IsLightingModeSupported(LightingMode lightingMode)
    method HasAutoPowerOff (line 72) | public override bool HasAutoPowerOff()
    method HasAngleSnapping (line 77) | public override bool HasAngleSnapping()
    method HasAngleTuning (line 82) | public override bool HasAngleTuning()
    method HasLowBatteryWarning (line 87) | public override bool HasLowBatteryWarning()
    method HasDPIColors (line 92) | public override bool HasDPIColors()
    method AngleTuningStep (line 97) | public override int AngleTuningStep()
  class KerisAceIIOmni (line 103) | public class KerisAceIIOmni : KerisIIAceWired
    method KerisAceIIOmni (line 105) | public KerisAceIIOmni() : base(0x1ACE, true, "mi_02&col03", 0x03)
    method GetDisplayName (line 109) | public override string GetDisplayName()
    method USBPacketSize (line 114) | public override int USBPacketSize()

FILE: app/Peripherals/Mouse/Models/KerisIIOrigin.cs
  class KerisIIOriginWired (line 4) | public class KerisIIOriginWired : AsusMouse
    method KerisIIOriginWired (line 6) | public KerisIIOriginWired() : base(0x0B05, 0x1C0C, "mi_00", true)
    method KerisIIOriginWired (line 10) | protected KerisIIOriginWired(ushort productId, bool wireless, string e...
    method DPIProfileCount (line 14) | public override int DPIProfileCount()
    method CanChangeDPICount (line 19) | public override bool CanChangeDPICount()
    method GetDisplayName (line 25) | public override string GetDisplayName()
    method SupportedPollingrates (line 31) | public override PollingRate[] SupportedPollingrates()
    method ProfileCount (line 44) | public override int ProfileCount()
    method MaxDPI (line 50) | public override int MaxDPI()
    method HasLiftOffSetting (line 55) | public override bool HasLiftOffSetting()
    method HasRGB (line 60) | public override bool HasRGB()
    method SupportedLightingZones (line 65) | public override LightingZone[] SupportedLightingZones()
    method HasXYDPI (line 70) | public override bool HasXYDPI()
    method IsLightingModeSupported (line 76) | public override bool IsLightingModeSupported(LightingMode lightingMode)
    method HasAutoPowerOff (line 86) | public override bool HasAutoPowerOff()
    method HasAngleSnapping (line 91) | public override bool HasAngleSnapping()
    method HasAngleTuning (line 96) | public override bool HasAngleTuning()
    method HasLowBatteryWarning (line 101) | public override bool HasLowBatteryWarning()
    method HasDPIColors (line 106) | public override bool HasDPIColors()
    method AngleTuningStep (line 111) | public override int AngleTuningStep()
    method USBPacketSize (line 116) | public override int USBPacketSize()
  class KerisIIOriginOmni (line 122) | public class KerisIIOriginOmni : KerisIIOriginWired
    method KerisIIOriginOmni (line 124) | public KerisIIOriginOmni() : base(0x1ACE, true, "mi_02&col03", 0x03)
    method GetDisplayName (line 128) | public override string GetDisplayName()

FILE: app/Peripherals/Mouse/Models/KerisWireless.cs
  class KerisWireless (line 4) | public class KerisWireless : AsusMouse
    method KerisWireless (line 6) | public KerisWireless() : base(0x0B05, 0x1960, "mi_00", true)
    method KerisWireless (line 10) | protected KerisWireless(ushort vendorId, bool wireless) : base(0x0B05,...
    method DPIProfileCount (line 14) | public override int DPIProfileCount()
    method GetDisplayName (line 19) | public override string GetDisplayName()
    method SupportedPollingrates (line 25) | public override PollingRate[] SupportedPollingrates()
    method ProfileCount (line 35) | public override int ProfileCount()
    method MaxDPI (line 39) | public override int MaxDPI()
    method HasLiftOffSetting (line 44) | public override bool HasLiftOffSetting()
    method HasRGB (line 49) | public override bool HasRGB()
    method HasAutoPowerOff (line 54) | public override bool HasAutoPowerOff()
    method HasAngleSnapping (line 59) | public override bool HasAngleSnapping()
    method HasAngleTuning (line 64) | public override bool HasAngleTuning()
    method HasLowBatteryWarning (line 69) | public override bool HasLowBatteryWarning()
    method HasDPIColors (line 74) | public override bool HasDPIColors()
    method IsLightingModeSupported (line 79) | public override bool IsLightingModeSupported(LightingMode lightingMode)
    method ParseBattery (line 90) | protected override int ParseBattery(byte[] packet)
    method DPIIncrements (line 101) | public override int DPIIncrements()
    method HasDebounceSetting (line 105) | public override bool HasDebounceSetting()
    method CanChangeDPIProfile (line 110) | public override bool CanChangeDPIProfile()
    method GetUpdateEnergySettingsPacket (line 115) | protected override byte[] GetUpdateEnergySettingsPacket(int lowBattery...
    method ParseLowBatteryWarning (line 120) | protected override int ParseLowBatteryWarning(byte[] packet)
    method ParseLiftOffDistance (line 127) | protected override LiftOffDistance ParseLiftOffDistance(byte[] packet)
    method GetUpdateLiftOffDistancePacket (line 137) | protected override byte[] GetUpdateLiftOffDistancePacket(LiftOffDistan...
    method SupportedLightingZones (line 142) | public override LightingZone[] SupportedLightingZones()
    method MaxBrightness (line 147) | public override int MaxBrightness()
    method IndexForLightingMode (line 152) | protected override byte IndexForLightingMode(LightingMode lightingMode)
  class Keris (line 163) | public class Keris : KerisWireless
    method Keris (line 165) | public Keris() : base(0x195C, false)
    method GetDisplayName (line 169) | public override string GetDisplayName()
    method HasBattery (line 174) | public override bool HasBattery()
    method HasLowBatteryWarning (line 179) | public override bool HasLowBatteryWarning()
    method HasAutoPowerOff (line 184) | public override bool HasAutoPowerOff()
  class KerisWirelessWired (line 190) | public class KerisWirelessWired : KerisWireless
    method KerisWirelessWired (line 192) | public KerisWirelessWired() : base(0x195E, false)
    method GetDisplayName (line 196) | public override string GetDisplayName()
  class KerisWirelessEvaEdition (line 202) | public class KerisWirelessEvaEdition : KerisWireless
    method KerisWirelessEvaEdition (line 204) | public KerisWirelessEvaEdition() : base(0x1A59, true)
    method GetDisplayName (line 208) | public override string GetDisplayName()
  class KerisWirelessEvaEditionWired (line 214) | public class KerisWirelessEvaEditionWired : KerisWireless
    method KerisWirelessEvaEditionWired (line 216) | public KerisWirelessEvaEditionWired() : base(0x1A57, false)
    method GetDisplayName (line 220) | public override string GetDisplayName()

FILE: app/Peripherals/Mouse/Models/KerisWirelssAimpoint.cs
  class KerisWirelssAimpoint (line 4) | public class KerisWirelssAimpoint : AsusMouse
    method KerisWirelssAimpoint (line 6) | public KerisWirelssAimpoint() : base(0x0B05, 0x1A68, "mi_00", true)
    method KerisWirelssAimpoint (line 10) | protected KerisWirelssAimpoint(ushort vendorId, bool wireless) : base(...
    method KerisWirelssAimpoint (line 14) | protected KerisWirelssAimpoint(ushort productId, bool wireless, string...
    method DPIProfileCount (line 18) | public override int DPIProfileCount()
    method GetDisplayName (line 23) | public override string GetDisplayName()
    method SupportedPollingrates (line 29) | public override PollingRate[] SupportedPollingrates()
    method ProfileCount (line 39) | public override int ProfileCount()
    method MaxDPI (line 43) | public override int MaxDPI()
    method HasXYDPI (line 48) | public override bool HasXYDPI()
    method HasDebounceSetting (line 53) | public override bool HasDebounceSetting()
    method HasLiftOffSetting (line 58) | public override bool HasLiftOffSetting()
    method HasRGB (line 63) | public override bool HasRGB()
    method SupportedLightingZones (line 68) | public override LightingZone[] SupportedLightingZones()
    method IsLightingModeSupported (line 73) | public override bool IsLightingModeSupported(LightingMode lightingMode)
    method HasAutoPowerOff (line 82) | public override bool HasAutoPowerOff()
    method HasAngleSnapping (line 87) | public override bool HasAngleSnapping()
    method HasAngleTuning (line 92) | public override bool HasAngleTuning()
    method HasLowBatteryWarning (line 97) | public override bool HasLowBatteryWarning()
    method HasDPIColors (line 102) | public override bool HasDPIColors()
  class KerisWirelssAimpointWired (line 108) | public class KerisWirelssAimpointWired : KerisWirelssAimpoint
    method KerisWirelssAimpointWired (line 110) | public KerisWirelssAimpointWired() : base(0x1A66, false)
    method GetDisplayName (line 114) | public override string GetDisplayName()
  class KerisWirelssAimpointOmni (line 120) | public class KerisWirelssAimpointOmni : KerisWirelssAimpoint
    method KerisWirelssAimpointOmni (line 122) | public KerisWirelssAimpointOmni() : base(0x1ACE, true, "mi_02&col03", ...
    method GetDisplayName (line 126) | public override string GetDisplayName()
    method USBPacketSize (line 131) | public override int USBPacketSize()

FILE: app/Peripherals/Mouse/Models/Pugio.cs
  class Pugio (line 4) | public class Pugio : AsusMouse
    method Pugio (line 6) | public Pugio() : base(0x0B05, 0x1846, "mi_02", false)
    method DPIProfileCount (line 10) | public override int DPIProfileCount()
    method GetDisplayName (line 15) | public override string GetDisplayName()
    method SupportedPollingrates (line 20) | public override PollingRate[] SupportedPollingrates()
    method ProfileCount (line 30) | public override int ProfileCount()
    method MaxDPI (line 34) | public override int MaxDPI()
    method DPIIncrements (line 38) | public override int DPIIncrements()
    method MinDPI (line 43) | public override int MinDPI()
    method HasLiftOffSetting (line 48) | public override bool HasLiftOffSetting()
    method HasRGB (line 53) | public override bool HasRGB()
    method HasAngleSnapping (line 58) | public override bool HasAngleSnapping()
    method CanChangeDPIProfile (line 63) | public override bool CanChangeDPIProfile()
    method HasBattery (line 68) | public override bool HasBattery()
    method HasAutoPowerOff (line 73) | public override bool HasAutoPowerOff()
    method ParsePollingRate (line 79) | protected override PollingRate ParsePollingRate(byte[] packet)
    method MaxBrightness (line 89) | public override int MaxBrightness()
    method SupportedLightingZones (line 94) | public override LightingZone[] SupportedLightingZones()
    method IsLightingModeSupported (line 99) | public override bool IsLightingModeSupported(LightingMode lightingMode)
    method GetUpdateLightingModePacket (line 109) | protected override byte[] GetUpdateLightingModePacket(LightingSetting ...
    method GetReadLightingModePacket (line 150) | protected override byte[] GetReadLightingModePacket(LightingZone zone)
    method ParseLightingSetting (line 155) | protected LightingSetting? ParseLightingSetting(byte[] packet, Lightin...
    method ReadLightingSetting (line 175) | public override void ReadLightingSetting()

FILE: app/Peripherals/Mouse/Models/PugioII.cs
  class PugioII (line 5) | public class PugioII : AsusMouse
    method PugioII (line 7) | public PugioII() : base(0x0B05, 0x1908, "mi_00", true)
    method PugioII (line 11) | protected PugioII(ushort vendorId, bool wireless) : base(0x0B05, vendo...
    method DPIProfileCount (line 14) | public override int DPIProfileCount()
    method GetDisplayName (line 19) | public override string GetDisplayName()
    method SupportedPollingrates (line 24) | public override PollingRate[] SupportedPollingrates()
    method ProfileCount (line 35) | public override int ProfileCount()
    method MaxDPI (line 39) | public override int MaxDPI()
    method HasDebounceSetting (line 44) | public override bool HasDebounceSetting()
    method HasLiftOffSetting (line 48) | public override bool HasLiftOffSetting()
    method DPIIncrements (line 52) | public override int DPIIncrements()
    method HasRGB (line 57) | public override bool HasRGB()
    method MaxBrightness (line 61) | public override int MaxBrightness()
    method SupportedLightingZones (line 66) | public override LightingZone[] SupportedLightingZones()
    method HasAutoPowerOff (line 71) | public override bool HasAutoPowerOff()
    method HasAngleSnapping (line 76) | public override bool HasAngleSnapping()
    method HasAngleTuning (line 81) | public override bool HasAngleTuning()
    method HasLowBatteryWarning (line 86) | public override bool HasLowBatteryWarning()
    method LowBatteryWarningStep (line 91) | public override int LowBatteryWarningStep()
    method LowBatteryWarningMax (line 96) | public override int LowBatteryWarningMax()
    method ParseBattery (line 101) | protected override int ParseBattery(byte[] packet)
    method ParseLowBatteryWarning (line 105) | protected override int ParseLowBatteryWarning(byte[] packet)
    method GetUpdateEnergySettingsPacket (line 109) | protected override byte[] GetUpdateEnergySettingsPacket(int lowBattery...
    method GetReadLightingModePacket (line 113) | protected override byte[] GetReadLightingModePacket(LightingZone zone)
    method ParseLightingSetting (line 118) | protected LightingSetting? ParseLightingSetting(byte[] packet, Lightin...
    method ReadLightingSetting (line 159) | public override void ReadLightingSetting()
    method CanChangeDPIProfile (line 191) | public override bool CanChangeDPIProfile()
  class PugioIIWired (line 198) | public class PugioIIWired : PugioII
    method PugioIIWired (line 200) | public PugioIIWired() : base(0x1906, false)
    method GetDisplayName (line 204) | public override string GetDisplayName()

FILE: app/Peripherals/Mouse/Models/SpathaX.cs
  class SpathaX (line 5) | public class SpathaX : AsusMouse
    method SpathaX (line 7) | public SpathaX() : base(0x0B05, 0x1979, "mi_00", true)
    method SpathaX (line 11) | protected SpathaX(ushort vendorId, bool wireless) : base(0x0B05, vendo...
    method GetDisplayName (line 15) | public override string GetDisplayName()
    method SupportedPollingrates (line 20) | public override PollingRate[] SupportedPollingrates()
    method HasAngleSnapping (line 29) | public override bool HasAngleSnapping()
    method ProfileCount (line 34) | public override int ProfileCount()
    method DPIProfileCount (line 39) | public override int DPIProfileCount()
    method MaxDPI (line 44) | public override int MaxDPI()
    method HasXYDPI (line 49) | public override bool HasXYDPI()
    method HasDebounceSetting (line 54) | public override bool HasDebounceSetting()
    method HasLiftOffSetting (line 59) | public override bool HasLiftOffSetting()
    method HasRGB (line 64) | public override bool HasRGB()
    method SupportedLightingZones (line 69) | public override LightingZone[] SupportedLightingZones()
    method HasAutoPowerOff (line 74) | public override bool HasAutoPowerOff()
    method HasAngleTuning (line 79) | public override bool HasAngleTuning()
    method HasLowBatteryWarning (line 84) | public override bool HasLowBatteryWarning()
    method HasDPIColors (line 89) | public override bool HasDPIColors()
  class SpathaXWired (line 95) | public class SpathaXWired : SpathaX
    method SpathaXWired (line 97) | public SpathaXWired() : base(0x1977, false)
    method GetDisplayName (line 101) | public override string GetDisplayName()

FILE: app/Peripherals/Mouse/Models/StrixCarry.cs
  class StrixCarry (line 4) | public class StrixCarry : AsusMouse
    method StrixCarry (line 6) | public StrixCarry() : base(0x0B05, 0x18B4, "mi_01", true)
    method DPIProfileCount (line 10) | public override int DPIProfileCount()
    method GetDisplayName (line 15) | public override string GetDisplayName()
    method SupportedPollingrates (line 20) | public override PollingRate[] SupportedPollingrates()
    method ProfileCount (line 30) | public override int ProfileCount()
    method MaxDPI (line 34) | public override int MaxDPI()
    method DPIIncrements (line 38) | public override int DPIIncrements()
    method MinDPI (line 43) | public override int MinDPI()
    method HasDebounceSetting (line 48) | public override bool HasDebounceSetting()
    method HasLiftOffSetting (line 53) | public override bool HasLiftOffSetting()
    method HasRGB (line 59) | public override bool HasRGB()
    method HasAutoPowerOff (line 64) | public override bool HasAutoPowerOff()
    method HasAngleSnapping (line 69) | public override bool HasAngleSnapping()
    method HasXYDPI (line 73) | public override bool HasXYDPI()
    method CanChangeDPIProfile (line 78) | public override bool CanChangeDPIProfile()
    method ParseBattery (line 84) | protected override int ParseBattery(byte[] packet)
    method ParsePowerOffSetting (line 94) | protected override PowerOffSetting ParsePowerOffSetting(byte[] packet)
    method ParsePollingRate (line 104) | protected override PollingRate ParsePollingRate(byte[] packet)
    method GetUpdatePollingRatePacket (line 114) | protected override byte[] GetUpdatePollingRatePacket(PollingRate polli...
    method ParseAngleSnapping (line 119) | protected override bool ParseAngleSnapping(byte[] packet)
    method GetUpdateAngleSnappingPacket (line 129) | protected override byte[] GetUpdateAngleSnappingPacket(bool angleSnapp...
    method ParseDebounce (line 134) | protected override DebounceTime ParseDebounce(byte[] packet)
    method GetUpdateDebouncePacket (line 154) | protected override byte[] GetUpdateDebouncePacket(DebounceTime debounce)
    method ParseProfile (line 159) | protected override int ParseProfile(byte[] packet)
    method ParseDPIProfile (line 169) | protected override int ParseDPIProfile(byte[] packet)
    method GetUpdateEnergySettingsPacket (line 179) | protected override byte[] GetUpdateEnergySettingsPacket(int lowBattery...

FILE: app/Peripherals/Mouse/Models/StrixEvolve.cs
  class StrixEvolve (line 3) | public class StrixEvolve : AsusMouse
    method StrixEvolve (line 5) | public StrixEvolve() : base(0x0B05, 0x185B, "mi_00", false)
    method DPIProfileCount (line 10) | public override int DPIProfileCount()
    method GetDisplayName (line 15) | public override string GetDisplayName()
    method SupportedPollingrates (line 21) | public override PollingRate[] SupportedPollingrates()
    method ProfileCount (line 31) | public override int ProfileCount()
    method MaxDPI (line 35) | public override int MaxDPI()
    method HasRGB (line 40) | public override bool HasRGB()
    method HasAutoPowerOff (line 45) | public override bool HasAutoPowerOff()
    method HasDebounceSetting (line 50) | public override bool HasDebounceSetting()
    method HasLowBatteryWarning (line 55) | public override bool HasLowBatteryWarning()
    method HasBattery (line 60) | public override bool HasBattery()
    method HasDPIColors (line 65) | public override bool HasDPIColors()
    method IsLightingModeSupported (line 70) | public override bool IsLightingModeSupported(LightingMode lightingMode)
    method SupportedLightingZones (line 78) | public override LightingZone[] SupportedLightingZones()
    method DPIIncrements (line 83) | public override int DPIIncrements()
    method MinDPI (line 89) | public override int MinDPI()
    method CanChangeDPIProfile (line 94) | public override bool CanChangeDPIProfile()
    method MaxBrightness (line 99) | public override int MaxBrightness()
    method HasLiftOffSetting (line 104) | public override bool HasLiftOffSetting()
    method HasAngleSnapping (line 109) | public override bool HasAngleSnapping()

FILE: app/Peripherals/Mouse/Models/StrixImpact.cs
  class StrixImpact (line 4) | public class StrixImpact : AsusMouse
    method StrixImpact (line 6) | public StrixImpact() : base(0x0B05, 0x1847, "mi_02", false)
    method StrixImpact (line 10) | public StrixImpact(ushort productId, string path) : base(0x0B05, produ...
    method DPIProfileCount (line 14) | public override int DPIProfileCount()
    method GetDisplayName (line 19) | public override string GetDisplayName()
    method SupportedPollingrates (line 25) | public override PollingRate[] SupportedPollingrates()
    method ProfileCount (line 35) | public override int ProfileCount()
    method MaxDPI (line 39) | public override int MaxDPI()
    method HasRGB (line 44) | public override bool HasRGB()
    method HasAutoPowerOff (line 49) | public override bool HasAutoPowerOff()
    method HasDebounceSetting (line 54) | public override bool HasDebounceSetting()
    method HasLowBatteryWarning (line 59) | public override bool HasLowBatteryWarning()
    method HasBattery (line 64) | public override bool HasBattery()
    method HasDPIColors (line 69) | public override bool HasDPIColors()
    method IsLightingModeSupported (line 74) | public override bool IsLightingModeSupported(LightingMode lightingMode)
    method SupportedLightingZones (line 82) | public override LightingZone[] SupportedLightingZones()
    method DPIIncrements (line 87) | public override int DPIIncrements()
    method CanChangeDPIProfile (line 94) | public override bool CanChangeDPIProfile()
    method MaxBrightness (line 99) | public override int MaxBrightness()
    method GetUpdateLightingModePacket (line 104) | protected override byte[] GetUpdateLightingModePacket(LightingSetting ...
    method GetReadLightingModePacket (line 117) | protected override byte[] GetReadLightingModePacket(LightingZone zone)
    method ParseLightingSetting (line 122) | protected LightingSetting? ParseLightingSetting(byte[] packet, Lightin...
    method ReadLightingSetting (line 142) | public override void ReadLightingSetting()
    method ParsePollingRate (line 187) | protected override PollingRate ParsePollingRate(byte[] packet)
    method GetUpdatePollingRatePacket (line 197) | protected override byte[] GetUpdatePollingRatePacket(PollingRate polli...
    method ParseAngleSnapping (line 202) | protected override bool ParseAngleSnapping(byte[] packet)
    method GetUpdateAngleSnappingPacket (line 212) | protected override byte[] GetUpdateAngleSnappingPacket(bool angleSnapp...
    method ParseDebounce (line 217) | protected override DebounceTime ParseDebounce(byte[] packet)
    method GetUpdateDebouncePacket (line 237) | protected override byte[] GetUpdateDebouncePacket(DebounceTime debounce)

FILE: app/Peripherals/Mouse/Models/StrixImpactII.cs
  class StrixImpactII (line 4) | public class StrixImpactII : AsusMouse
    method StrixImpactII (line 6) | public StrixImpactII() : base(0x0B05, 0x18E1, "mi_00", false)
    method StrixImpactII (line 10) | public StrixImpactII(ushort pid) : base(0x0B05, pid, "mi_00", false)
    method DPIProfileCount (line 14) | public override int DPIProfileCount()
    method GetDisplayName (line 19) | public override string GetDisplayName()
    method SupportedPollingrates (line 25) | public override PollingRate[] SupportedPollingrates()
    method ProfileCount (line 35) | public override int ProfileCount()
    method MaxDPI (line 39) | public override int MaxDPI()
    method HasRGB (line 44) | public override bool HasRGB()
    method HasAutoPowerOff (line 49) | public override bool HasAutoPowerOff()
    method HasAngleSnapping (line 54) | public override bool HasAngleSnapping()
    method HasAngleTuning (line 59) | public override bool HasAngleTuning()
    method HasDebounceSetting (line 64) | public override bool HasDebounceSetting()
    method HasLowBatteryWarning (line 69) | public override bool HasLowBatteryWarning()
    method HasBattery (line 74) | public override bool HasBattery()
    method HasDPIColors (line 79) | public override bool HasDPIColors()
    method IsLightingModeSupported (line 84) | public override bool IsLightingModeSupported(LightingMode lightingMode)
    method SupportedLightingZones (line 92) | public override LightingZone[] SupportedLightingZones()
    method DPIIncrements (line 97) | public override int DPIIncrements()
    method CanChangeDPIProfile (line 102) | public override bool CanChangeDPIProfile()
    method MaxBrightness (line 107) | public override int MaxBrightness()
    method IndexForLightingMode (line 112) | protected override byte IndexForLightingMode(LightingMode lightingMode)
    method LightingModeForIndex (line 121) | protected override LightingMode LightingModeForIndex(byte lightingMode)
    method GetReadLightingModePacket (line 130) | protected override byte[] GetReadLightingModePacket(LightingZone zone)
    method ParseLightingSetting (line 135) | protected LightingSetting? ParseLightingSetting(byte[] packet, Lightin...
    method ReadLightingSetting (line 155) | public override void ReadLightingSetting()
  class StrixImpactIIElectroPunk (line 182) | public class StrixImpactIIElectroPunk : StrixImpactII
    method StrixImpactIIElectroPunk (line 185) | public StrixImpactIIElectroPunk() : base(0x1956)
    method GetDisplayName (line 191) | public override string GetDisplayName()

FILE: app/Peripherals/Mouse/Models/StrixImpactIII.cs
  class StrixImpactIII (line 4) | public class StrixImpactIII : AsusMouse
    method StrixImpactIII (line 6) | public StrixImpactIII() : base(0x0B05, 0x1A88, "mi_00", false)
    method DPIProfileCount (line 11) | public override int DPIProfileCount()
    method GetDisplayName (line 16) | public override string GetDisplayName()
    method SupportedPollingrates (line 22) | public override PollingRate[] SupportedPollingrates()
    method ProfileCount (line 32) | public override int ProfileCount()
    method MaxDPI (line 37) | public override int MaxDPI()
    method HasRGB (line 42) | public override bool HasRGB()
    method SupportedLightingZones (line 47) | public override LightingZone[] SupportedLightingZones()
    method IsLightingModeSupported (line 52) | public override bool IsLightingModeSupported(LightingMode lightingMode)
    method HasBattery (line 62) | public override bool HasBattery()
    method HasAngleSnapping (line 67) | public override bool HasAngleSnapping()
    method HasLowBatteryWarning (line 72) | public override bool HasLowBatteryWarning()

FILE: app/Peripherals/Mouse/Models/StrixImpactIIIWireless.cs
  class StrixImpactIIIWirelessOmni (line 4) | public class StrixImpactIIIWirelessOmni : AsusMouse
    method StrixImpactIIIWirelessOmni (line 7) | public StrixImpactIIIWirelessOmni() : base(0x0B05, 0x1ACE, "mi_02&col0...
    method DPIProfileCount (line 11) | public override int DPIProfileCount()
    method GetDisplayName (line 16) | public override string GetDisplayName()
    method SupportedPollingrates (line 21) | public override PollingRate[] SupportedPollingrates()
    method ProfileCount (line 31) | public override int ProfileCount()
    method MaxDPI (line 35) | public override int MaxDPI()
    method HasXYDPI (line 40) | public override bool HasXYDPI()
    method HasLiftOffSetting (line 45) | public override bool HasLiftOffSetting()
    method HasRGB (line 50) | public override bool HasRGB()
    method SupportedLightingZones (line 55) | public override LightingZone[] SupportedLightingZones()
    method IsLightingModeSupported (line 60) | public override bool IsLightingModeSupported(LightingMode lightingMode)
    method HasAutoPowerOff (line 70) | public override bool HasAutoPowerOff()
    method HasAngleSnapping (line 75) | public override bool HasAngleSnapping()
    method HasAngleTuning (line 80) | public override bool HasAngleTuning()
    method HasLowBatteryWarning (line 85) | public override bool HasLowBatteryWarning()
    method HasDPIColors (line 90) | public override bool HasDPIColors()
    method AngleTuningStep (line 95) | public override int AngleTuningStep()
    method USBPacketSize (line 100) | public override int USBPacketSize()

FILE: app/Peripherals/Mouse/Models/StrixImpactIIWireless.cs
  class StrixImpactIIWireless (line 4) | public class StrixImpactIIWireless : AsusMouse
    method StrixImpactIIWireless (line 6) | public StrixImpactIIWireless() : base(0x0B05, 0x1949, "mi_00", true)
    method StrixImpactIIWireless (line 10) | protected StrixImpactIIWireless(ushort vendorId, bool wireless) : base...
    method DPIProfileCount (line 14) | public override int DPIProfileCount()
    method GetDisplayName (line 19) | public override string GetDisplayName()
    method SupportedPollingrates (line 25) | public override PollingRate[] SupportedPollingrates()
    method ProfileCount (line 35) | public override int ProfileCount()
    method MaxDPI (line 39) | public override int MaxDPI()
    method HasLiftOffSetting (line 44) | public override bool HasLiftOffSetting()
    method HasRGB (line 49) | public override bool HasRGB()
    method HasAutoPowerOff (line 54) | public override bool HasAutoPowerOff()
    method HasAngleSnapping (line 59) | public override bool HasAngleSnapping()
    method HasAngleTuning (line 64) | public override bool HasAngleTuning()
    method HasLowBatteryWarning (line 69) | public override bool HasLowBatteryWarning()
    method HasDPIColors (line 74) | public override bool HasDPIColors()
    method IsLightingModeSupported (line 79) | public override bool IsLightingModeSupported(LightingMode lightingMode)
    method SupportedLightingZones (line 89) | public override LightingZone[] SupportedLightingZones()
    method ParseBattery (line 95) | protected override int ParseBattery(byte[] packet)
    method DPIIncrements (line 106) | public override int DPIIncrements()
    method CanChangeDPIProfile (line 111) | public override bool CanChangeDPIProfile()
    method GetUpdateEnergySettingsPacket (line 116) | protected override byte[] GetUpdateEnergySettingsPacket(int lowBattery...
    method ParseLowBatteryWarning (line 121) | protected override int ParseLowBatteryWarning(byte[] packet)
    method ParseLiftOffDistance (line 128) | protected override LiftOffDistance ParseLiftOffDistance(byte[] packet)
    method GetUpdateLiftOffDistancePacket (line 138) | protected override byte[] GetUpdateLiftOffDistancePacket(LiftOffDistan...
    method MaxBrightness (line 143) | public override int MaxBrightness()
    method HasDebounceSetting (line 148) | public override bool HasDebounceSetting()
    method IndexForLightingMode (line 153) | protected override byte IndexForLightingMode(LightingMode lightingMode)
    method GetReadLightingModePacket (line 162) | protected override byte[] GetReadLightingModePacket(LightingZone zone)
    method ParseLightingSetting (line 167) | protected LightingSetting? ParseLightingSetting(byte[] packet, Lightin...
    method ReadLightingSetting (line 187) | public override void ReadLightingSetting()
  class StrixImpactIIWirelessWired (line 215) | public class StrixImpactIIWirelessWired : StrixImpactIIWireless
    method StrixImpactIIWirelessWired (line 217) | public StrixImpactIIWirelessWired() : base(0x1947, false)
    method GetDisplayName (line 221) | public override string GetDisplayName()

FILE: app/Peripherals/Mouse/Models/TUFM3.cs
  class TUFM3 (line 4) | public class TUFM3 : AsusMouse
    method TUFM3 (line 6) | public TUFM3() : base(0x0B05, 0x1910, "mi_01", false)
    method TUFM3 (line 10) | public TUFM3(ushort productId, string path) : base(0x0B05, productId, ...
    method DPIProfileCount (line 14) | public override int DPIProfileCount()
    method GetDisplayName (line 19) | public override string GetDisplayName()
    method SupportedPollingrates (line 25) | public override PollingRate[] SupportedPollingrates()
    method IndexForLightingMode (line 36) | protected override byte IndexForLightingMode(LightingMode lightingMode)
    method LightingModeForIndex (line 46) | protected override LightingMode LightingModeForIndex(byte lightingMode)
    method ProfileCount (line 56) | public override int ProfileCount()
    method MaxDPI (line 60) | public override int MaxDPI()
    method HasBattery (line 64) | public override bool HasBattery()
    method HasLiftOffSetting (line 69) | public override bool HasLiftOffSetting()
    method SupportedLightingZones (line 73) | public override LightingZone[] SupportedLightingZones()
    method HasRGB (line 78) | public override bool HasRGB()
    method HasAngleSnapping (line 83) | public override bool HasAngleSnapping()
    method DPIIncrements (line 88) | public override int DPIIncrements()
    method CanChangeDPIProfile (line 93) | public override bool CanChangeDPIProfile()
    method HasDebounceSetting (line 98) | public override bool HasDebounceSetting()
    method MaxBrightness (line 103) | public override int MaxBrightness()
    method IsLightingModeSupported (line 108) | public override bool IsLightingModeSupported(LightingMode lightingMode)
  class TUFM3GenII (line 117) | public class TUFM3GenII : TUFM3
    method TUFM3GenII (line 119) | public TUFM3GenII() : base(0x1A9B, "mi_02")
    method GetDisplayName (line 123) | public override string GetDisplayName()
    method MaxBrightness (line 128) | public override int MaxBrightness()
    method MaxDPI (line 133) | public override int MaxDPI()
    method MinDPI (line 138) | public override int MinDPI()
    method DPIIncrements (line 143) | public override int DPIIncrements()
    method HasDPIColors (line 148) | public override bool HasDPIColors()
    method ParseDPIProfile (line 153) | protected override int ParseDPIProfile(byte[] packet)
    method GetChangeDPIProfilePacket (line 158) | protected override byte[] GetChangeDPIProfilePacket(int profile)
    method GetChangeDPIProfilePacket2 (line 163) | protected override byte[] GetChangeDPIProfilePacket2(int profile)

FILE: app/Peripherals/Mouse/Models/TUFM4Air.cs
  class TUFM4Air (line 4) | public class TUFM4Air : AsusMouse
    method TUFM4Air (line 6) | public TUFM4Air() : base(0x0B05, 0x1A03, "mi_00", false)
    method DPIProfileCount (line 10) | public override int DPIProfileCount()
    method GetDisplayName (line 15) | public override string GetDisplayName()
    method SupportedPollingrates (line 21) | public override PollingRate[] SupportedPollingrates()
    method ProfileCount (line 31) | public override int ProfileCount()
    method MaxDPI (line 35) | public override int MaxDPI()
    method HasLiftOffSetting (line 40) | public override bool HasLiftOffSetting()
    method HasAngleSnapping (line 45) | public override bool HasAngleSnapping()
    method HasAngleTuning (line 50) | public override bool HasAngleTuning()
    method HasBattery (line 55) | public override bool HasBattery()
    method DPIIncrements (line 60) | public override int DPIIncrements()

FILE: app/Peripherals/Mouse/Models/TUFM4Wireless.cs
  class TUFM4Wirelss (line 4) | public class TUFM4Wirelss : AsusMouse
    method TUFM4Wirelss (line 6) | public TUFM4Wirelss() : base(0x0B05, 0x19F4, "mi_00", true)
    method TUFM4Wirelss (line 10) | public TUFM4Wirelss(ushort productId, bool wireless) : base(0x0B05, pr...
    method DPIProfileCount (line 14) | public override int DPIProfileCount()
    method GetDisplayName (line 19) | public override string GetDisplayName()
    method SupportedPollingrates (line 25) | public override PollingRate[] SupportedPollingrates()
    method ProfileCount (line 35) | public override int ProfileCount()
    method MaxDPI (line 39) | public override int MaxDPI()
    method HasLiftOffSetting (line 44) | public override bool HasLiftOffSetting()
    method HasDebounceSetting (line 49) | public override bool HasDebounceSetting()
    method HasAutoPowerOff (line 54) | public override bool HasAutoPowerOff()
    method HasAngleSnapping (line 59) | public override bool HasAngleSnapping()
    method HasAngleTuning (line 64) | public override bool HasAngleTuning()
    method HasLowBatteryWarning (line 69) | public override bool HasLowBatteryWarning()
    method HasDPIColors (line 74) | public override bool HasDPIColors()
    method DPIIncrements (line 79) | public override int DPIIncrements()
    method CanChangeDPIProfile (line 84) | public override bool CanChangeDPIProfile()
  class TUFM4WirelssCN (line 91) | public class TUFM4WirelssCN : TUFM4Wirelss
    method TUFM4WirelssCN (line 93) | public TUFM4WirelssCN() : base(0x1A8D, true)
    method GetDisplayName (line 99) | public override string GetDisplayName()
  class TXGamingMini (line 106) | public class TXGamingMini : TUFM4Wirelss
    method TXGamingMini (line 108) | public TXGamingMini() : base(0x1AF5, true)
    method TXGamingMini (line 112) | public TXGamingMini(ushort productId, bool wireless) : base(productId,...
    method DPIIncrements (line 116) | public override int DPIIncrements()
    method GetDisplayName (line 122) | public override string GetDisplayName()
    method HasXYDPI (line 127) | public override bool HasXYDPI()
  class TXGamingMiniWired (line 135) | public class TXGamingMiniWired : TXGamingMini
    method TXGamingMiniWired (line 137) | public TXGamingMiniWired() : base(0x1AF3, false)
    method DPIIncrements (line 141) | public override int DPIIncrements()
    method GetDisplayName (line 147) | public override string GetDisplayName()

FILE: app/Peripherals/Mouse/Models/TUFM5.cs
  class TUFM5 (line 4) | public class TUFM5 : AsusMouse
    method TUFM5 (line 6) | public TUFM5() : base(0x0B05, 0x1898, "mi_02", false)
    method DPIProfileCount (line 10) | public override int DPIProfileCount()
    method GetDisplayName (line 15) | public override string GetDisplayName()
    method SupportedPollingrates (line 21) | public override PollingRate[] SupportedPollingrates()
    method IndexForLightingMode (line 32) | protected override byte IndexForLightingMode(LightingMode lightingMode)
    method LightingModeForIndex (line 42) | protected override LightingMode LightingModeForIndex(byte lightingMode)
    method ProfileCount (line 52) | public override int ProfileCount()
    method MaxDPI (line 56) | public override int MaxDPI()
    method HasBattery (line 60) | public override bool HasBattery()
    method HasLiftOffSetting (line 65) | public override bool HasLiftOffSetting()
    method SupportedLightingZones (line 69) | public override LightingZone[] SupportedLightingZones()
    method HasRGB (line 74) | public override bool HasRGB()
    method HasAngleSnapping (line 79) | public override bool HasAngleSnapping()
    method DPIIncrements (line 84) | public override int DPIIncrements()
    method CanChangeDPIProfile (line 89) | public override bool CanChangeDPIProfile()
    method HasDebounceSetting (line 94) | public override bool HasDebounceSetting()
    method MaxBrightness (line 99) | public override int MaxBrightness()
    method IsLightingModeSupported (line 104) | public override bool IsLightingModeSupported(LightingMode lightingMode)
    method GetUpdatePollingRatePacket (line 113) | protected override byte[] GetUpdatePollingRatePacket(PollingRate polli...
    method GetUpdateAngleSnappingPacket (line 118) | protected override byte[] GetUpdateAngleSnappingPacket(bool angleSnapp...
    method ParsePollingRate (line 123) | protected override PollingRate ParsePollingRate(byte[] packet)
    method ParseAngleSnapping (line 134) | protected override bool ParseAngleSnapping(byte[] packet)
    method GetUpdateDebouncePacket (line 145) | protected override byte[] GetUpdateDebouncePacket(DebounceTime debounce)
    method ParseDebounce (line 150) | protected override DebounceTime ParseDebounce(byte[] packet)

FILE: app/Peripherals/PeripheralsProvider.cs
  class PeripheralsProvider (line 10) | public class PeripheralsProvider
    method PeripheralsProvider (line 20) | static PeripheralsProvider()
    method IsMouseConnected (line 28) | public static bool IsMouseConnected()
    method IsDeviceConnected (line 36) | public static bool IsDeviceConnected(IPeripheral peripheral)
    method IsAnyPeripheralConnect (line 42) | public static bool IsAnyPeripheralConnect()
    method AllPeripherals (line 47) | public static List<IPeripheral> AllPeripherals()
    method RefreshBatteryForAllDevices (line 57) | public static void RefreshBatteryForAllDevices()
    method RefreshBatteryForAllDevices (line 62) | public static void RefreshBatteryForAllDevices(bool force)
    method Disconnect (line 84) | public static void Disconnect(AsusMouse am)
    method Connect (line 99) | public static void Connect(AsusMouse am)
    method BatteryUpdated (line 147) | private static void BatteryUpdated(object? sender, EventArgs e)
    method MouseReadyChanged (line 152) | private static void MouseReadyChanged(object? sender, EventArgs e)
    method Mouse_Disconnect (line 157) | private static void Mouse_Disconnect(object? sender, EventArgs e)
    method UpdateSettingsView (line 177) | private static void UpdateSettingsView()
    method DetectAllAsusMice (line 185) | [MethodImpl(MethodImplOptions.Synchronized)]
    method DedectOmniMouse (line 243) | public static void DedectOmniMouse()
    method DetectMouse (line 307) | public static void DetectMouse(AsusMouse am)
    method RegisterForDeviceEvents (line 316) | public static void RegisterForDeviceEvents()
    method UnregisterForDeviceEvents (line 321) | public static void UnregisterForDeviceEvents()
    method Device_Changed (line 326) | private static void Device_Changed(object? sender, HidSharp.DeviceList...
    method DeviceTimer_Elapsed (line 331) | private static void DeviceTimer_Elapsed(object? sender, System.Timers....

FILE: app/Program.cs
  class Program (line 21) | static class Program
    method Main (line 46) | public static void Main(string[] args)
    method SystemEvents_SessionEnding (line 209) | private static void SystemEvents_SessionEnding(object sender, SessionE...
    method SystemEvents_SessionSwitch (line 217) | private static void SystemEvents_SessionSwitch(object sender, SessionS...
    method SystemEvents_UserPreferenceChanged (line 232) | static void SystemEvents_UserPreferenceChanged(object sender, UserPref...
    method SetAutoModes (line 271) | public static bool SetAutoModes(bool powerChanged = false, bool init =...
    method SystemEvents_PowerModeChanged (line 317) | private static void SystemEvents_PowerModeChanged(object sender, Power...
    method SettingsToggle (line 343) | public static void SettingsToggle(bool checkForFocus = true, bool tray...
    method TrayIcon_MouseClick (line 381) | static void TrayIcon_MouseClick(object? sender, MouseEventArgs e)
    method TrayIcon_MouseMove (line 388) | static void TrayIcon_MouseMove(object? sender, MouseEventArgs e)
    method OnExit (line 393) | static void OnExit(object sender, EventArgs e)
    method BatteryLimit (line 408) | static void BatteryLimit()

FILE: app/Properties/Resources.Designer.cs
  class Resources (line 23) | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resource...
    method Resources (line 33) | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Mic...

FILE: app/Properties/Settings.Designer.cs
  class Settings (line 14) | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

FILE: app/Properties/Strings.Designer.cs
  class Strings (line 22) | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resource...
    method Strings (line 31) | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Mic...

FILE: app/Ryzen/OpenLibSys.cs
  class Ols (line 15) | public class Ols : IDisposable
    type Status (line 21) | public enum Status
    type OlsDllStatus (line 30) | public enum OlsDllStatus
    type OlsDriverType (line 42) | public enum OlsDriverType
    type OlsErrorPci (line 53) | public enum OlsErrorPci : uint
    method PciBusDevFunc (line 62) | public uint PciBusDevFunc(uint bus, uint dev, uint func)
    method PciGetBus (line 68) | public uint PciGetBus(uint address)
    method PciGetDev (line 74) | public uint PciGetDev(uint address)
    method PciGetFunc (line 80) | public uint PciGetFunc(uint address)
    method LoadLibrary (line 85) | [DllImport("kernel32")]
    method FreeLibrary (line 89) | [DllImport("kernel32", SetLastError = true)]
    method GetProcAddress (line 92) | [DllImport("kernel32", CharSet = CharSet.Ansi, SetLastError = true, Ex...
    method Ols (line 98) | public Ols()
    method GetStatus (line 260) | public uint GetStatus()
    method Dispose (line 265) | public void Dispose()
    method GetDelegate (line 275) | public Delegate GetDelegate(string procName, Type delegateType)

FILE: app/Ryzen/RyzenControl.cs
  class RyzenControl (line 13) | internal class RyzenControl
    method Init (line 49) | public static void Init()
    method IsAMD (line 154) | public static bool IsAMD()
    method IsSupportedUV (line 160) | public static bool IsSupportedUV()
    method IsSupportedUViGPU (line 166) | public static bool IsSupportedUViGPU()
    method IsRingExsists (line 172) | public static bool IsRingExsists()
    method DownloadRing (line 178) | public static void DownloadRing()
    method SetAddresses (line 221) | public static void SetAddresses()

FILE: app/Ryzen/RyzenSmu.cs
  class Smu (line 11) | class Smu
    type Status (line 14) | public enum Status : int
    method Smu (line 39) | public Smu(bool EnableDebug)
    method Initialize (line 80) | public void Initialize()
    method Deinitialize (line 113) | public void Deinitialize()
    method SendMp1 (line 136) | public Status SendMp1(uint message, ref uint[] arguments)
    method SendPsmu (line 143) | public Status SendPsmu(uint message, ref uint[] arguments)
    method SendMsg (line 151) | public Status SendMsg(uint SMU_ADDR_MSG, uint SMU_ADDR_RSP, uint SMU_A...
    method SmuWaitDone (line 206) | public bool SmuWaitDone(uint SMU_ADDR_RSP)
    method SmuWriteReg (line 222) | private bool SmuWriteReg(uint addr, uint data)
    method SmuReadReg (line 231) | private bool SmuReadReg(uint addr, ref uint data)

FILE: app/Ryzen/SendCommand.cs
  class SendCommand (line 9) | internal class SendCommand
    method set_stapm_limit (line 34) | public static Smu.Status? set_stapm_limit(uint value)
    method set_fast_limit (line 69) | public static Smu.Status? set_fast_limit(uint value)
    method set_slow_limit (line 102) | public static Smu.Status? set_slow_limit(uint value)
    method set_tctl_temp (line 137) | public static Smu.Status? set_tctl_temp(uint value)
    method set_coall (line 185) | public static Smu.Status? set_coall(int value)
    method set_cogfx (line 235) | public static Smu.Status? set_cogfx(int value)

FILE: app/Settings.Designer.cs
  class SettingsForm (line 5) | partial class SettingsForm
    method Dispose (line 16) | protected override void Dispose(bool disposing)
    method InitializeComponent (line 31) | private void InitializeComponent()

FILE: app/Settings.cs
  class SettingsForm (line 21) | public partial class SettingsForm : RForm
    method SettingsForm (line 54) | public SettingsForm()
    method ButtonArmoury_Click (line 302) | private void ButtonArmoury_Click(object? sender, EventArgs e)
    method ButtonAmdOled_Click (line 309) | private void ButtonAmdOled_Click(object? sender, EventArgs e)
    method LabelBattery_Click (line 315) | private void LabelBattery_Click(object? sender, EventArgs e)
    method ButtonEnergySaver_Click (line 321) | private void ButtonEnergySaver_Click(object? sender, EventArgs e)
    method ButtonDonate_Click (line 327) | private void ButtonDonate_Click(object? sender, EventArgs e)
    method LabelBacklight_Click (line 334) | private void LabelBacklight_Click(object? sender, EventArgs e)
    method ButtonFHD_Click (line 339) | private void ButtonFHD_Click(object? sender, EventArgs e)
    method ButtonHDRControl_Click (line 344) | private void ButtonHDRControl_Click(object? sender, EventArgs e)
    method SliderBattery_ValueChanged (line 349) | private void SliderBattery_ValueChanged(object? sender, EventArgs e)
    method SliderBattery_KeyUp (line 354) | private void SliderBattery_KeyUp(object? sender, KeyEventArgs e)
    method SliderBattery_MouseUp (line 359) | private void SliderBattery_MouseUp(object? sender, MouseEventArgs e)
    method ButtonAutoTDP_Click (line 364) | private void ButtonAutoTDP_Click(object? sender, EventArgs e)
    method LabelCharge_Click (line 369) | private void LabelCharge_Click(object? sender, EventArgs e)
    method LabelVisual_Click (line 374) | private void LabelVisual_Click(object? sender, EventArgs e)
    method InitVisual (line 380) | public void InitVisual()
    method CycleVisualMode (line 468) | public void CycleVisualMode(int delta)
    method ButtonInstallColorProfile_Click (line 491) | private async void ButtonInstallColorProfile_Click(object? sender, Eve...
    method ComboGamut_SelectedValueChanged (line 497) | private void ComboGamut_SelectedValueChanged(object? sender, EventArgs e)
    method ComboVisual_SelectedValueChanged (line 502) | private void ComboVisual_SelectedValueChanged(object? sender, EventArg...
    method VisualiseBrightness (line 508) | public void VisualiseBrightness()
    method VisualiseAmdOled (line 519) | public void VisualiseAmdOled(bool status = false)
    method VisualiseArmoury (line 527) | public void VisualiseArmoury(bool status = false)
    method VisualiseDisabled (line 535) | public void VisualiseDisabled()
    method VisualiseGamut (line 540) | public void VisualiseGamut()
    method SliderGamma_ValueChanged (line 548) | private void SliderGamma_ValueChanged(object? sender, EventArgs e)
    method ButtonOverlay_Click (line 554) | private void ButtonOverlay_Click(object? sender, EventArgs e)
    method ButtonHandheld_Click (line 559) | private void ButtonHandheld_Click(object? sender, EventArgs e)
    method ButtonFPS_Click (line 578) | private void ButtonFPS_Click(object? sender, EventArgs e)
    method ButtonBacklight_Click (line 583) | private void ButtonBacklight_Click(object? sender, EventArgs e)
    method ButtonControllerMode_Click (line 588) | private void ButtonControllerMode_Click(object? sender, EventArgs e)
    method VisualiseAlly (line 593) | public void VisualiseAlly(bool visible = false)
    method VisualiseController (line 604) | public void VisualiseController(ControllerMode mode)
    method VisualiseBacklight (line 623) | public void VisualiseBacklight(int backlight)
    method VisualiseFPSLimit (line 628) | public void VisualiseFPSLimit(int limit)
    method VisualiseAutoTDP (line 633) | public void VisualiseAutoTDP(bool status)
    method SettingsForm_Focused (line 639) | private void SettingsForm_Focused(object? sender, EventArgs e)
    method SettingsForm_LostFocus (line 648) | private void SettingsForm_LostFocus(object? sender, EventArgs e)
    method ButtonBatteryFull_Click (line 653) | private void ButtonBatteryFull_Click(object? sender, EventArgs e)
    method ButtonBatteryFull_MouseLeave (line 658) | private void ButtonBatteryFull_MouseLeave(object? sender, EventArgs e)
    method ButtonBatteryFull_MouseEnter (line 664) | private void ButtonBatteryFull_MouseEnter(object? sender, EventArgs e)
    method SettingsForm_Resize (line 670) | private void SettingsForm_Resize(object? sender, EventArgs e)
    method PanelBattery_MouseEnter (line 676) | private void PanelBattery_MouseEnter(object? sender, EventArgs e)
    method PanelBattery_MouseLeave (line 682) | private void PanelBattery_MouseLeave(object? sender, EventArgs e)
    method ShowBatteryWear (line 688) | private void ShowBatteryWear()
    method SettingsForm_VisibleChanged (line 703) | private void SettingsForm_VisibleChanged(object? sender, EventArgs e)
    method RefreshPeripheralsBattery (line 716) | private void RefreshPeripheralsBattery()
    method ButtonUpdates_Click (line 721) | private void ButtonUpdates_Click(object? sender, EventArgs e)
    method VisualiseMatrixPicture (line 739) | public void VisualiseMatrixPicture(string image)
    method WndProc (line 745) | protected override void WndProc(ref Message m)
    method SetContextMenu (line 807) | public void SetContextMenu()
    method InitContextMenuTheme (line 884) | public void InitContextMenuTheme()
    method ButtonXGM_Click (line 893) | private void ButtonXGM_Click(object? sender, EventArgs e)
    method SetVersionLabel (line 899) | public void SetVersionLabel(string label, bool update = false)
    method LabelVersion_Click (line 915) | private void LabelVersion_Click(object? sender, EventArgs e)
    method OnTimedEvent (line 921) | private static void OnTimedEvent(Object? source, ElapsedEventArgs? e)
    method ButtonFHD_MouseHover (line 926) | private void ButtonFHD_MouseHover(object? sender, EventArgs e)
    method Button120Hz_MouseHover (line 931) | private void Button120Hz_MouseHover(object? sender, EventArgs e)
    method Button60Hz_MouseHover (line 936) | private void Button60Hz_MouseHover(object? sender, EventArgs e)
    method ButtonScreen_MouseLeave (line 941) | private void ButtonScreen_MouseLeave(object? sender, EventArgs e)
    method ButtonScreenAuto_MouseHover (line 946) | private void ButtonScreenAuto_MouseHover(object? sender, EventArgs e)
    method ButtonUltimate_MouseHover (line 951) | private void ButtonUltimate_MouseHover(object? sender, EventArgs e)
    method ButtonStandard_MouseHover (line 956) | private void ButtonStandard_MouseHover(object? sender, EventArgs e)
    method ButtonEco_MouseHover (line 961) | private void ButtonEco_MouseHover(object? sender, EventArgs e)
    method ButtonOptimized_MouseHover (line 966) | private void ButtonOptimized_MouseHover(object? sender, EventArgs e)
    method ButtonGPU_MouseLeave (line 971) | private void ButtonGPU_MouseLeave(object? sender, EventArgs e)
    method ButtonXGM_MouseMove (line 976) | private void ButtonXGM_MouseMove(object? sender, MouseEventArgs e)
    method ButtonScreenAuto_Click (line 989) | private void ButtonScreenAuto_Click(object? sender, EventArgs e)
    method CheckStartup_CheckedChanged (line 996) | private void CheckStartup_CheckedChanged(object? sender, EventArgs e)
    method CheckMatrix_CheckedChanged (line 1007) | private void CheckMatrix_CheckedChanged(object? sender, EventArgs e)
    method CheckMatrixLid_CheckedChanged (line 1013) | private void CheckMatrixLid_CheckedChanged(object? sender, EventArgs e)
    method ButtonMatrix_Click (line 1020) | private void ButtonMatrix_Click(object? sender, EventArgs e)
    method VisualiseMatrixRunning (line 1041) | public void VisualiseMatrixRunning(int mode)
    method ComboInterval_DropDownClosed (line 1050) | private void ComboInterval_DropDownClosed(object? sender, EventArgs e)
    method ComboMatrixRunning_SelectedValueChanged (line 1056) | private void ComboMatrixRunning_SelectedValueChanged(object? sender, E...
    method ComboMatrix_SelectedValueChanged (line 1063) | private void ComboMatrix_SelectedValueChanged(object? sender, EventArg...
    method LabelCPUFan_Click (line 1070) | private void LabelCPUFan_Click(object? sender, EventArgs e)
    method PictureColor2_Click (line 1076) | private void PictureColor2_Click(object? sender, EventArgs e)
    method PictureColor_Click (line 1081) | private void PictureColor_Click(object? sender, EventArgs e)
    method ButtonKeyboard_Click (line 1086) | private void ButtonKeyboard_Click(object? sender, EventArgs e)
    method FansInit (line 1104) | public void FansInit()
    method GPUInit (line 1110) | public void GPUInit()
    method FansToggle (line 1116) | public void FansToggle(int index = 0)
    method ButtonFans_Click (line 1137) | private void ButtonFans_Click(object? sender, EventArgs e)
    method SetColorPicker (line 1142) | private void SetColorPicker(string colorField = "aura_color")
    method ButtonKeyboardColor_Click (line 1162) | private void ButtonKeyboardColor_Click(object? sender, EventArgs e)
    method InitAura (line 1167) | public void InitAura()
    method SetAura (line 1196) | public void SetAura()
    method _VisualiseAura (line 1205) | private void _VisualiseAura()
    method VisualiseAura (line 1228) | public void VisualiseAura()
    method InitMatrix 
Condensed preview — 178 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,624K chars).
[
  {
    "path": ".gitattributes",
    "chars": 2518,
    "preview": "###############################################################################\n# Set default behavior to automatically "
  },
  {
    "path": ".github/CODE_OF_CONDUCT.md",
    "chars": 5202,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participa"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "chars": 125,
    "preview": "Please, feel free to contribute. Especially if you own model differnt from G14 2022 and can offer extra features or supp"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 83,
    "preview": "# These are supported funding model platforms\ncustom: https://g-helper.com/support\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "chars": 2986,
    "preview": "name: Bug Report\ndescription: Something isn't working correctly\nbody:\n  - type: markdown\n    attributes:\n      value: |\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 28,
    "preview": "blank_issues_enabled: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "chars": 1719,
    "preview": "name: Feature request\ndescription: Suggest an idea for this project\nbody:\n  - type: checkboxes\n    id: rules\n    attribu"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/peripherals_request.yml",
    "chars": 1303,
    "preview": "name: Mouse and other peripherals support request\ndescription: Request support for a new device\nbody:\n  - type: input\n  "
  },
  {
    "path": ".github/SECURITY.md",
    "chars": 432,
    "preview": "# Security Policy\n\n## Supported Versions\n\n| Version | Supported          |\n| ------- | ------------------ |\n| 0.200+   |"
  },
  {
    "path": ".github/workflows/build.yml",
    "chars": 397,
    "preview": "name: Build\n\non:\n  push:\n    branches: [ main ]\n  pull_request:\n    branches: [ main ]\n  workflow_dispatch:\n\npermissions"
  },
  {
    "path": ".github/workflows/codeql.yml",
    "chars": 519,
    "preview": "name: CodeQL\n\non:\n  push:\n    branches: [ main ]\n  pull_request:\n    branches: [ main ]\n  schedule:\n  - cron: '34 18 * *"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 1702,
    "preview": "name: Release\n\non:\n  release:\n    types: [ published ]\n  workflow_dispatch:\n\npermissions:\n  contents: write\n  id-token: "
  },
  {
    "path": ".gitignore",
    "chars": 6223,
    "preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## G"
  },
  {
    "path": "LICENSE",
    "chars": 35149,
    "preview": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
  },
  {
    "path": "app/.editorconfig",
    "chars": 95,
    "preview": "[*.{cs,vb}]\n\n# IDE0017: Simplify object initialization\ndotnet_style_object_initializer = true\n"
  },
  {
    "path": "app/Ally/AllyControl.cs",
    "chars": 24153,
    "preview": "using GHelper.Gpu.AMD;\nusing GHelper.Helpers;\nusing GHelper.Input;\nusing GHelper.Mode;\nusing GHelper.USB;\nusing HidShar"
  },
  {
    "path": "app/AnimeMatrix/AniMatrixControl.cs",
    "chars": 23233,
    "preview": "using NAudio.CoreAudioApi;\nusing NAudio.Wave;\nusing System.Diagnostics;\nusing System.Drawing.Drawing2D;\nusing System.Dr"
  },
  {
    "path": "app/AnimeMatrix/AnimeMatrixDevice.cs",
    "chars": 16653,
    "preview": "// Source thanks to https://github.com/vddCore/Starlight with some adjustments from me\n\nusing GHelper.AnimeMatrix.Commu"
  },
  {
    "path": "app/AnimeMatrix/Communication/Device.cs",
    "chars": 1729,
    "preview": "// Source thanks to https://github.com/vddCore/Starlight :)\n\nusing GHelper.AnimeMatrix.Communication.Platform;\n\nnamespa"
  },
  {
    "path": "app/AnimeMatrix/Communication/Packet.cs",
    "chars": 1613,
    "preview": "// Source thanks to https://github.com/vddCore/Starlight :)\n\nnamespace GHelper.AnimeMatrix.Communication\n{\n    public a"
  },
  {
    "path": "app/AnimeMatrix/Communication/Platform/UsbProvider.cs",
    "chars": 596,
    "preview": "namespace GHelper.AnimeMatrix.Communication.Platform\n{\n    public abstract class UsbProvider : IDisposable\n    {\n       "
  },
  {
    "path": "app/AnimeMatrix/Communication/Platform/WindowsUsbProvider.cs",
    "chars": 3464,
    "preview": "using System.ComponentModel;\nusing HidSharp;\n\nnamespace GHelper.AnimeMatrix.Communication.Platform\n{\n    internal class "
  },
  {
    "path": "app/AnimeMatrix/SlashDevice.cs",
    "chars": 8805,
    "preview": "using GHelper.AnimeMatrix.Communication;\nusing System.Management;\nusing System.Text;\n\nnamespace GHelper.AnimeMatrix\n{\n "
  },
  {
    "path": "app/App.config",
    "chars": 336,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n\t<System.Windows.Forms.ApplicationConfigurationSection>\n\t\t<add "
  },
  {
    "path": "app/AppConfig.cs",
    "chars": 23416,
    "preview": "using GHelper.Mode;\nusing System.Diagnostics;\nusing System.Management;\nusing System.Text.Json;\n\npublic static class AppC"
  },
  {
    "path": "app/AsusACPI.cs",
    "chars": 24353,
    "preview": "using GHelper;\nusing GHelper.USB;\nusing System.Management;\nusing System.Runtime.InteropServices;\n\npublic enum AsusFan\n{"
  },
  {
    "path": "app/AsusMouseSettings.Designer.cs",
    "chars": 85949,
    "preview": "namespace GHelper\n{\n    partial class AsusMouseSettings\n    {\n        /// <summary>\n        /// Required designer varia"
  },
  {
    "path": "app/AsusMouseSettings.cs",
    "chars": 44584,
    "preview": "using GHelper.Peripherals.Mouse;\nusing GHelper.UI;\n\nnamespace GHelper\n{\n    public partial class AsusMouseSettings : RF"
  },
  {
    "path": "app/AsusMouseSettings.resx",
    "chars": 5627,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!--\n    Microsoft ResX Schema\n\n    Version 2.0\n\n    The primary goals "
  },
  {
    "path": "app/AutoUpdate/AutoUpdateControl.cs",
    "chars": 7382,
    "preview": "using GHelper.Helpers;\nusing System.Diagnostics;\nusing System.Net;\nusing System.Reflection;\nusing System.Text.Json;\nusi"
  },
  {
    "path": "app/Battery/BatteryControl.cs",
    "chars": 2633,
    "preview": "using System.Diagnostics;\n\nnamespace GHelper.Battery\n{\n    public static class BatteryControl\n    {\n\n        static boo"
  },
  {
    "path": "app/Display/AmdDisplay.cs",
    "chars": 2822,
    "preview": "using Microsoft.Win32;\nusing Ryzen;\nusing System.Diagnostics;\n\npublic static class AmdDisplay\n{\n    private const strin"
  },
  {
    "path": "app/Display/ColorProfileHelper.cs",
    "chars": 50911,
    "preview": "using GHelper.Helpers;\nusing System.IO.Compression;\n\nnamespace GHelper.Display\n{\n    public static class ColorProfileHe"
  },
  {
    "path": "app/Display/DisplayGammaRamp.cs",
    "chars": 3484,
    "preview": "namespace GHelper.Display\n{\n\n    public class DisplayGammaRamp\n    {\n\n        public DisplayGammaRamp(ushort[] red, ush"
  },
  {
    "path": "app/Display/GammaRamp.cs",
    "chars": 1481,
    "preview": "using System.Runtime.InteropServices;\n\nnamespace GHelper.Display\n{\n\n    [StructLayout(LayoutKind.Sequential)]\n    inter"
  },
  {
    "path": "app/Display/ScreenBrightness.cs",
    "chars": 1406,
    "preview": "namespace GHelper.Display\n{\n    using System;\n    using System.Diagnostics;\n    using System.Management;\n\n    public st"
  },
  {
    "path": "app/Display/ScreenCCD.cs",
    "chars": 15670,
    "preview": "using System.ComponentModel;\nusing System.Runtime.InteropServices;\n\nnamespace GHelper.Display\n{\n    public class Screen"
  },
  {
    "path": "app/Display/ScreenControl.cs",
    "chars": 8901,
    "preview": "using System.Diagnostics;\n\nnamespace GHelper.Display\n{\n    public static class ScreenControl\n    {\n\n        public cons"
  },
  {
    "path": "app/Display/ScreenInterrogatory.cs",
    "chars": 14094,
    "preview": "using GHelper.Helpers;\nusing NvAPIWrapper.Display;\nusing System.ComponentModel;\nusing System.Runtime.InteropServices;\n\n"
  },
  {
    "path": "app/Display/ScreenNative.cs",
    "chars": 9964,
    "preview": "using System.Collections;\nusing System.Runtime.InteropServices;\nusing static GHelper.Display.ScreenInterrogatory;\n\nname"
  },
  {
    "path": "app/Display/VisualControl.cs",
    "chars": 17648,
    "preview": "using GHelper.Helpers;\nusing Microsoft.Win32;\nusing Ryzen;\nusing System.Management;\n\nnamespace GHelper.Display\n{\n    pu"
  },
  {
    "path": "app/Extra.Designer.cs",
    "chars": 85047,
    "preview": "using GHelper.Properties;\nusing GHelper.UI;\n\nnamespace GHelper\n{\n    partial class Extra\n    {\n        /// <summary>\n  "
  },
  {
    "path": "app/Extra.cs",
    "chars": 34834,
    "preview": "using GHelper.Display;\nusing GHelper.Gpu.AMD;\nusing GHelper.Helpers;\nusing GHelper.Input;\nusing GHelper.Mode;\nusing GHe"
  },
  {
    "path": "app/Extra.resx",
    "chars": 5989,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!--\n    Microsoft ResX Schema\n\n    Version 2.0\n\n    The primary goals "
  },
  {
    "path": "app/Fan/FanSensorControl.cs",
    "chars": 7250,
    "preview": "using GHelper.Mode;\n\nnamespace GHelper.Fan\n{\n    public class FanSensorControl\n    {\n        public const int DEFAULT_F"
  },
  {
    "path": "app/Fans.Designer.cs",
    "chars": 86578,
    "preview": "using GHelper.UI;\nusing System.Windows.Forms.DataVisualization.Charting;\n\nnamespace GHelper\n{\n    partial class Fans\n  "
  },
  {
    "path": "app/Fans.cs",
    "chars": 47378,
    "preview": "using GHelper.Fan;\nusing GHelper.Gpu.NVidia;\nusing GHelper.Mode;\nusing GHelper.UI;\nusing GHelper.USB;\nusing Ryzen;\nusin"
  },
  {
    "path": "app/Fans.resx",
    "chars": 5917,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!--\n    Microsoft ResX Schema\n\n    Version 2.0\n\n    The primary goals "
  },
  {
    "path": "app/GHelper.csproj",
    "chars": 4882,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>WinExe</OutputType>\n    <TargetFramework>net8.0-wi"
  },
  {
    "path": "app/GHelper.sln",
    "chars": 1667,
    "preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.4.3340"
  },
  {
    "path": "app/Gpu/AMD/AmdAdl2.cs",
    "chars": 23291,
    "preview": "using System.Diagnostics;\nusing System.Runtime.InteropServices;\nusing static GHelper.Gpu.AMD.Adl2.NativeMethods;\n\nnamesp"
  },
  {
    "path": "app/Gpu/AMD/AmdGpuControl.cs",
    "chars": 10277,
    "preview": "using GHelper.Helpers;\nusing System.Runtime.InteropServices;\nusing static GHelper.Gpu.AMD.Adl2.NativeMethods;\n\nnamespace"
  },
  {
    "path": "app/Gpu/GPUModeControl.cs",
    "chars": 11990,
    "preview": "using GHelper.Display;\nusing GHelper.Gpu.NVidia;\nusing GHelper.Helpers;\nusing GHelper.USB;\nusing Microsoft.Win32;\nusing"
  },
  {
    "path": "app/Gpu/IGpuControl.cs",
    "chars": 243,
    "preview": "namespace GHelper.Gpu;\n\npublic  interface IGpuControl : IDisposable {\n    bool IsNvidia { get; }\n    bool IsValid { get"
  },
  {
    "path": "app/Gpu/NVidia/NvidiaGpuControl.cs",
    "chars": 8070,
    "preview": "using GHelper.Helpers;\nusing NvAPIWrapper.GPU;\nusing NvAPIWrapper.Native;\nusing NvAPIWrapper.Native.GPU;\nusing NvAPIWra"
  },
  {
    "path": "app/Gpu/NVidia/NvidiaSmi.cs",
    "chars": 2539,
    "preview": "using Ryzen;\nusing System.Diagnostics;\nusing System.Text.RegularExpressions;\n\npublic static class NvidiaSmi\n{\n    publi"
  },
  {
    "path": "app/Handheld.Designer.cs",
    "chars": 49817,
    "preview": "namespace GHelper\n{\n    partial class Handheld\n    {\n        /// <summary>\n        /// Required designer variable.\n    "
  },
  {
    "path": "app/Handheld.cs",
    "chars": 9096,
    "preview": "using GHelper.Ally;\nusing GHelper.UI;\n\nnamespace GHelper\n{\n    public partial class Handheld : RForm\n    {\n\n        sta"
  },
  {
    "path": "app/Handheld.resx",
    "chars": 5632,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!--\n    Microsoft ResX Schema \n\n    Version 2.0\n\n    The primary goals"
  },
  {
    "path": "app/HardwareControl.cs",
    "chars": 10887,
    "preview": "using GHelper;\nusing GHelper.Battery;\nusing GHelper.Fan;\nusing GHelper.Gpu;\nusing GHelper.Gpu.AMD;\nusing GHelper.Gpu.NV"
  },
  {
    "path": "app/Helpers/AsusService.cs",
    "chars": 3488,
    "preview": "using System.Diagnostics;\n\nnamespace GHelper.Helpers\n{\n    public static class AsusService\n    {\n\n        static List<s"
  },
  {
    "path": "app/Helpers/Audio.cs",
    "chars": 2292,
    "preview": "using NAudio.CoreAudioApi;\n\nnamespace GHelper.Helpers\n{\n    internal class Audio\n    {\n        public static bool Toggl"
  },
  {
    "path": "app/Helpers/ClamshellModeControl.cs",
    "chars": 5001,
    "preview": "using GHelper.Display;\nusing GHelper.Mode;\nusing Microsoft.Win32;\n\nnamespace GHelper.Helpers\n{\n    internal class Clams"
  },
  {
    "path": "app/Helpers/ColorUtilities.cs",
    "chars": 6374,
    "preview": "using System.Runtime.CompilerServices;\n\nnamespace GHelper.Helpers\n{\n    public class ColorUtils\n    {\n        // Method"
  },
  {
    "path": "app/Helpers/DynamicLightingHelper.cs",
    "chars": 5105,
    "preview": "using Microsoft.Win32;\n\nnamespace GHelper.Helpers\n{\n    public static class DynamicLightingHelper\n    {\n\n        const "
  },
  {
    "path": "app/Helpers/Logger.cs",
    "chars": 993,
    "preview": "using System.Diagnostics;\n\npublic static class Logger\n{\n    public static string appPath = Environment.GetFolderPath(En"
  },
  {
    "path": "app/Helpers/OSDBase.cs",
    "chars": 17821,
    "preview": "using System.Drawing.Imaging;\nusing System.Runtime.InteropServices;\n\nnamespace GHelper.Helpers\n{\n\n    public class OSDN"
  },
  {
    "path": "app/Helpers/OnScreenKeyboard.cs",
    "chars": 5705,
    "preview": "using System.Diagnostics;\nusing System.Runtime.InteropServices;\n\nnamespace GHelper.Helpers\n{\n    public static class On"
  },
  {
    "path": "app/Helpers/ProcessHelper.cs",
    "chars": 6129,
    "preview": "using System.Diagnostics;\nusing System.Security.Principal;\n\nnamespace GHelper.Helpers\n{\n    public static class Process"
  },
  {
    "path": "app/Helpers/RestrictedProcessHelper.cs",
    "chars": 12381,
    "preview": "using System.Diagnostics;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\npublic static class RestrictedProce"
  },
  {
    "path": "app/Helpers/Startup.cs",
    "chars": 7613,
    "preview": "using GHelper.Helpers;\nusing Microsoft.Win32.TaskScheduler;\nusing System.Diagnostics;\nusing System.Reflection;\nusing Sy"
  },
  {
    "path": "app/Helpers/ToastForm.cs",
    "chars": 6042,
    "preview": "using System.Diagnostics;\nusing System.Drawing.Drawing2D;\n\nnamespace GHelper.Helpers\n{\n\n    static class Drawing\n    {\n"
  },
  {
    "path": "app/Helpers/TouchscreenHelper.cs",
    "chars": 920,
    "preview": "using GHelper.Helpers;\n\npublic static class TouchscreenHelper\n{\n\n    public static bool? GetStatus()\n    {\n        try\n"
  },
  {
    "path": "app/Input/InputDispatcher.cs",
    "chars": 49283,
    "preview": "using GHelper.Display;\nusing GHelper.Helpers;\nusing GHelper.Mode;\nusing GHelper.USB;\nusing Microsoft.Win32;\nusing System"
  },
  {
    "path": "app/Input/KeyboardHook.cs",
    "chars": 7443,
    "preview": "using System.Runtime.InteropServices;\n\npublic sealed class KeyboardHook : IDisposable\n{\n    // Registers a hot key with"
  },
  {
    "path": "app/Input/KeyboardListener.cs",
    "chars": 2408,
    "preview": "using GHelper.USB;\nusing HidSharp;\nusing System.Text;\n\nnamespace GHelper.Input\n{\n    public class KeyboardListener\n    "
  },
  {
    "path": "app/Matrix.Designer.cs",
    "chars": 18030,
    "preview": "namespace GHelper\n{\n    partial class Matrix\n    {\n        /// <summary>\n        /// Required designer variable.\n      "
  },
  {
    "path": "app/Matrix.cs",
    "chars": 8073,
    "preview": "using GHelper.AnimeMatrix;\nusing GHelper.UI;\n\nnamespace GHelper\n{\n    public partial class Matrix : RForm\n    {\n\n      "
  },
  {
    "path": "app/Matrix.resx",
    "chars": 5632,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!--\n    Microsoft ResX Schema \n\n    Version 2.0\n\n    The primary goals"
  },
  {
    "path": "app/Mode/ModeControl.cs",
    "chars": 17492,
    "preview": "using GHelper.Gpu.NVidia;\nusing GHelper.Helpers;\nusing GHelper.USB;\nusing Ryzen;\n\nnamespace GHelper.Mode\n{\n    public c"
  },
  {
    "path": "app/Mode/Modes.cs",
    "chars": 4994,
    "preview": "namespace GHelper.Mode\n{\n    internal class Modes\n    {\n        static Dictionary<string, string> settings = new Dictio"
  },
  {
    "path": "app/Mode/PowerNative.cs",
    "chars": 13382,
    "preview": "using Microsoft.Win32;\nusing System.Runtime.InteropServices;\n\nnamespace GHelper.Mode\n{\n    internal class PowerNative\n "
  },
  {
    "path": "app/NativeMethods.cs",
    "chars": 5424,
    "preview": "using System.Runtime.InteropServices;\n\n\npublic static class NativeMethods\n{\n\n    internal struct LASTINPUTINFO\n    {\n  "
  },
  {
    "path": "app/Peripherals/IPeripheral.cs",
    "chars": 618,
    "preview": "\nnamespace GHelper.Peripherals\n{\n    public enum PeripheralType\n    {\n        Mouse,\n        Keyboard\n    }\n\n    public"
  },
  {
    "path": "app/Peripherals/Mouse/AsusMouse.cs",
    "chars": 66706,
    "preview": "using GHelper.AnimeMatrix.Communication;\nusing GHelper.AnimeMatrix.Communication.Platform;\nusing System.Runtime.Compile"
  },
  {
    "path": "app/Peripherals/Mouse/Models/Chakram.cs",
    "chars": 6329,
    "preview": "\nnamespace GHelper.Peripherals.Mouse.Models\n{\n    //P704\n    public class Chakram : AsusMouse\n    {\n        public Chak"
  },
  {
    "path": "app/Peripherals/Mouse/Models/ChakramCore.cs",
    "chars": 6635,
    "preview": "\nnamespace GHelper.Peripherals.Mouse.Models\n{\n    //P511\n    public class ChakramCore : AsusMouse\n    {\n        public "
  },
  {
    "path": "app/Peripherals/Mouse/Models/ChakramX.cs",
    "chars": 2558,
    "preview": "\nnamespace GHelper.Peripherals.Mouse.Models\n{\n    public class ChakramX : AsusMouse\n    {\n        public ChakramX() : b"
  },
  {
    "path": "app/Peripherals/Mouse/Models/GladiusII.cs",
    "chars": 15432,
    "preview": "namespace GHelper.Peripherals.Mouse.Models\n{\n    //P504\n    public class GladiusIIOrigin : AsusMouse\n    {\n        publ"
  },
  {
    "path": "app/Peripherals/Mouse/Models/GladiusIIIAimpoint.cs",
    "chars": 4147,
    "preview": "namespace GHelper.Peripherals.Mouse.Models\n{\n    //P711\n    public class GladiusIIIAimpoint : AsusMouse\n    {\n        p"
  },
  {
    "path": "app/Peripherals/Mouse/Models/GladiusIIIWireless.cs",
    "chars": 3003,
    "preview": "namespace GHelper.Peripherals.Mouse.Models\n{\n    //P706_Wireless\n    public class GladiusIIIWireless : AsusMouse\n    {\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/GladiusIIWireless.cs",
    "chars": 8941,
    "preview": "namespace GHelper.Peripherals.Mouse.Models\n{\n    public class GladiusIIWireless : AsusMouse\n    {\n        public Gladiu"
  },
  {
    "path": "app/Peripherals/Mouse/Models/HarpeAceAimLab.cs",
    "chars": 4890,
    "preview": "namespace GHelper.Peripherals.Mouse.Models\n{\n    //P713_Wireless\n    public class HarpeAceAimLabEdition : AsusMouse\n   "
  },
  {
    "path": "app/Peripherals/Mouse/Models/HarpeAceMini.cs",
    "chars": 2933,
    "preview": "namespace GHelper.Peripherals.Mouse.Models\n{\n    //P716_Wireless\n    public class HarpeAceMiniWired : AsusMouse\n    {\n\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/HarpeIIAce.cs",
    "chars": 3383,
    "preview": "namespace GHelper.Peripherals.Mouse.Models\n{\n    //P723 - ROG HARPE II ACE (USB Wired)\n    public class HarpeIIAceWired"
  },
  {
    "path": "app/Peripherals/Mouse/Models/KerisIIAce.cs",
    "chars": 2659,
    "preview": "namespace GHelper.Peripherals.Mouse.Models\n{\n\n    public class KerisIIAceWired : AsusMouse\n    {\n        public KerisII"
  },
  {
    "path": "app/Peripherals/Mouse/Models/KerisIIOrigin.cs",
    "chars": 3091,
    "preview": "namespace GHelper.Peripherals.Mouse.Models\n{\n\n    public class KerisIIOriginWired : AsusMouse\n    {\n        public Keri"
  },
  {
    "path": "app/Peripherals/Mouse/Models/KerisWireless.cs",
    "chars": 5329,
    "preview": "namespace GHelper.Peripherals.Mouse.Models\n{\n    //P513\n    public class KerisWireless : AsusMouse\n    {\n        public"
  },
  {
    "path": "app/Peripherals/Mouse/Models/KerisWirelssAimpoint.cs",
    "chars": 3265,
    "preview": "namespace GHelper.Peripherals.Mouse.Models\n{\n    //P709_Wireless\n    public class KerisWirelssAimpoint : AsusMouse\n    "
  },
  {
    "path": "app/Peripherals/Mouse/Models/Pugio.cs",
    "chars": 7121,
    "preview": "namespace GHelper.Peripherals.Mouse.Models\n{\n    //P503\n    public class Pugio : AsusMouse\n    {\n        public Pugio()"
  },
  {
    "path": "app/Peripherals/Mouse/Models/PugioII.cs",
    "chars": 6329,
    "preview": "\nnamespace GHelper.Peripherals.Mouse.Models\n{\n    //P705\n    public class PugioII : AsusMouse\n    {\n        public Pugi"
  },
  {
    "path": "app/Peripherals/Mouse/Models/SpathaX.cs",
    "chars": 2213,
    "preview": "\nnamespace GHelper.Peripherals.Mouse.Models\n{\n    //SPATHA_WIRELESS\n    public class SpathaX : AsusMouse\n    {\n        "
  },
  {
    "path": "app/Peripherals/Mouse/Models/StrixCarry.cs",
    "chars": 4864,
    "preview": "namespace GHelper.Peripherals.Mouse.Models\n{\n    //P508\n    public class StrixCarry : AsusMouse\n    {\n        public St"
  },
  {
    "path": "app/Peripherals/Mouse/Models/StrixEvolve.cs",
    "chars": 2411,
    "preview": "namespace GHelper.Peripherals.Mouse.Models\n{\n    public class StrixEvolve : AsusMouse\n    {\n        public StrixEvolve("
  },
  {
    "path": "app/Peripherals/Mouse/Models/StrixImpact.cs",
    "chars": 7154,
    "preview": "namespace GHelper.Peripherals.Mouse.Models\n{\n    //P303\n    public class StrixImpact : AsusMouse\n    {\n        public S"
  },
  {
    "path": "app/Peripherals/Mouse/Models/StrixImpactII.cs",
    "chars": 5118,
    "preview": "namespace GHelper.Peripherals.Mouse.Models\n{\n    //P506\n    public class StrixImpactII : AsusMouse\n    {\n        public"
  },
  {
    "path": "app/Peripherals/Mouse/Models/StrixImpactIII.cs",
    "chars": 1784,
    "preview": "namespace GHelper.Peripherals.Mouse.Models\n{\n    //P518\n    public class StrixImpactIII : AsusMouse\n    {\n        publi"
  },
  {
    "path": "app/Peripherals/Mouse/Models/StrixImpactIIIWireless.cs",
    "chars": 2413,
    "preview": "namespace GHelper.Peripherals.Mouse.Models\n{\n    //P520\n    public class StrixImpactIIIWirelessOmni : AsusMouse\n    {\n\n"
  },
  {
    "path": "app/Peripherals/Mouse/Models/StrixImpactIIWireless.cs",
    "chars": 6233,
    "preview": "namespace GHelper.Peripherals.Mouse.Models\n{\n    //P513\n    public class StrixImpactIIWireless : AsusMouse\n    {\n      "
  },
  {
    "path": "app/Peripherals/Mouse/Models/TUFM3.cs",
    "chars": 3987,
    "preview": "namespace GHelper.Peripherals.Mouse.Models\n{\n    //P306_Wireless\n    public class TUFM3 : AsusMouse\n    {\n        publi"
  },
  {
    "path": "app/Peripherals/Mouse/Models/TUFM4Air.cs",
    "chars": 1309,
    "preview": "namespace GHelper.Peripherals.Mouse.Models\n{\n    //P307\n    public class TUFM4Air : AsusMouse\n    {\n        public TUFM"
  },
  {
    "path": "app/Peripherals/Mouse/Models/TUFM4Wireless.cs",
    "chars": 3034,
    "preview": "namespace GHelper.Peripherals.Mouse.Models\n{\n    //P306_Wireless\n    public class TUFM4Wirelss : AsusMouse\n    {\n      "
  },
  {
    "path": "app/Peripherals/Mouse/Models/TUFM5.cs",
    "chars": 4345,
    "preview": "namespace GHelper.Peripherals.Mouse.Models\n{\n    //P304\n    public class TUFM5 : AsusMouse\n    {\n        public TUFM5()"
  },
  {
    "path": "app/Peripherals/PeripheralsProvider.cs",
    "chars": 13254,
    "preview": "using GHelper.Peripherals.Mouse;\nusing GHelper.Peripherals.Mouse.Models;\nusing HidSharp;\nusing System.IO;\nusing System."
  },
  {
    "path": "app/Program.cs",
    "chars": 15517,
    "preview": "using GHelper.Ally;\nusing GHelper.Battery;\nusing GHelper.Display;\nusing GHelper.Gpu;\nusing GHelper.Helpers;\nusing GHelpe"
  },
  {
    "path": "app/Properties/Resources.Designer.cs",
    "chars": 34978,
    "preview": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code w"
  },
  {
    "path": "app/Properties/Resources.resx",
    "chars": 26838,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "app/Properties/Settings.Designer.cs",
    "chars": 1062,
    "preview": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code w"
  },
  {
    "path": "app/Properties/Settings.settings",
    "chars": 225,
    "preview": "<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"http://schemas.microsoft.com/VisualStudio/2004/01/settings\""
  },
  {
    "path": "app/Properties/Strings.Designer.cs",
    "chars": 78566,
    "preview": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code w"
  },
  {
    "path": "app/Properties/Strings.ar.resx",
    "chars": 31191,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "app/Properties/Strings.da.resx",
    "chars": 31039,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "app/Properties/Strings.de.resx",
    "chars": 31202,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "app/Properties/Strings.es.resx",
    "chars": 31563,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "app/Properties/Strings.fr.resx",
    "chars": 32057,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "app/Properties/Strings.hu.resx",
    "chars": 31531,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "app/Properties/Strings.id.resx",
    "chars": 31206,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "app/Properties/Strings.it.resx",
    "chars": 31590,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "app/Properties/Strings.ja.resx",
    "chars": 28986,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "app/Properties/Strings.ko.resx",
    "chars": 28688,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "app/Properties/Strings.lt.resx",
    "chars": 31814,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "app/Properties/Strings.pl.resx",
    "chars": 31563,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "app/Properties/Strings.pt-BR.resx",
    "chars": 31608,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "app/Properties/Strings.pt-PT.resx",
    "chars": 31741,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "app/Properties/Strings.resx",
    "chars": 30603,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "app/Properties/Strings.ro.resx",
    "chars": 31350,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "app/Properties/Strings.tr.resx",
    "chars": 31277,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "app/Properties/Strings.uk.resx",
    "chars": 31050,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "app/Properties/Strings.vi.resx",
    "chars": 30925,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "app/Properties/Strings.zh-CN.resx",
    "chars": 28019,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "app/Properties/Strings.zh-TW.resx",
    "chars": 28125,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "app/Properties/launchSettings.json",
    "chars": 77,
    "preview": "{\n  \"profiles\": {\n    \"GHelper\": {\n      \"commandName\": \"Project\"\n    }\n  }\n}"
  },
  {
    "path": "app/Ryzen/OpenLibSys.cs",
    "chars": 21879,
    "preview": "//-----------------------------------------------------------------------------\n//     Author : hiyohiyo\n//       Mail "
  },
  {
    "path": "app/Ryzen/RyzenControl.cs",
    "chars": 10314,
    "preview": "//\n// This is a optimised/simplified version of Ryzen System Management Unit from https://github.com/JamesCJ60/Universa"
  },
  {
    "path": "app/Ryzen/RyzenSmu.cs",
    "chars": 8541,
    "preview": "//\n// This is a optimised/simplified version of Ryzen System Management Unit from https://github.com/JamesCJ60/Universa"
  },
  {
    "path": "app/Ryzen/SendCommand.cs",
    "chars": 7641,
    "preview": "//\n// This is a optimised/simplified version of Ryzen System Management Unit from https://github.com/JamesCJ60/Universa"
  },
  {
    "path": "app/Settings.Designer.cs",
    "chars": 107248,
    "preview": "using GHelper.UI;\n\nnamespace GHelper\n{\n    partial class SettingsForm\n    {\n        /// <summary>\n        /// Required "
  },
  {
    "path": "app/Settings.cs",
    "chars": 72964,
    "preview": "using GHelper.Ally;\nusing GHelper.AnimeMatrix;\nusing GHelper.AutoUpdate;\nusing GHelper.Battery;\nusing GHelper.Display;\n"
  },
  {
    "path": "app/Settings.resx",
    "chars": 5627,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!--\n    Microsoft ResX Schema\n\n    Version 2.0\n\n    The primary goals "
  },
  {
    "path": "app/UI/ControlHelper.cs",
    "chars": 6396,
    "preview": "using GHelper.UI;\nusing System.Drawing.Drawing2D;\nusing System.Windows.Forms.DataVisualization.Charting;\n\npublic static"
  },
  {
    "path": "app/UI/CustomContextMenu.cs",
    "chars": 1241,
    "preview": "using System.Runtime.InteropServices;\n\nnamespace GHelper.UI\n{\n    class CustomContextMenu : ContextMenuStrip\n    {\n    "
  },
  {
    "path": "app/UI/IconHelper.cs",
    "chars": 890,
    "preview": "using System.Diagnostics;\nusing System.Runtime.InteropServices;\n\nnamespace GHelper.UI\n{\n    public class IconHelper\n   "
  },
  {
    "path": "app/UI/NumericUpDownWithUnit.cs",
    "chars": 3897,
    "preview": "using System.Globalization;\nusing System.Text.RegularExpressions;\n\npublic class NumericUpDownWithUnit : NumericUpDown\n{"
  },
  {
    "path": "app/UI/RBadgeButton.cs",
    "chars": 1754,
    "preview": "using System.Drawing.Drawing2D;\n\nnamespace GHelper.UI\n{\n    public class RBadgeButton : RButton\n    {\n        private in"
  },
  {
    "path": "app/UI/RButton.cs",
    "chars": 3548,
    "preview": "using System.Drawing.Drawing2D;\n\nnamespace GHelper.UI\n{\n    public class RButton : Button\n    {\n\n        //Fields\n     "
  },
  {
    "path": "app/UI/RCheckBox.cs",
    "chars": 77,
    "preview": "namespace GHelper.UI\n{\n    public class RCheckBox : CheckBox\n    {\n\n    }\n}\n"
  },
  {
    "path": "app/UI/RComboBox.cs",
    "chars": 9163,
    "preview": "using System.ComponentModel;\nusing System.Drawing.Drawing2D;\nusing System.Runtime.InteropServices;\n\nnamespace GHelper.U"
  },
  {
    "path": "app/UI/RForm.cs",
    "chars": 3850,
    "preview": "using Microsoft.Win32;\nusing System.Runtime.InteropServices;\n\nnamespace GHelper.UI\n{\n    public class RForm : Form\n    "
  },
  {
    "path": "app/UI/RForm.resx",
    "chars": 5696,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "app/UI/Slider.cs",
    "chars": 5921,
    "preview": "using System.Drawing.Drawing2D;\n\nnamespace GHelper.UI\n{\n    public static class GraphicsExtensions\n    {\n        public"
  },
  {
    "path": "app/USB/AsusHid.cs",
    "chars": 5677,
    "preview": "using HidSharp;\nusing HidSharp.Reports;\n\nnamespace GHelper.USB;\npublic static class AsusHid\n{\n    public const int ASUS"
  },
  {
    "path": "app/USB/Aura.cs",
    "chars": 42943,
    "preview": "using GHelper.Gpu;\nusing GHelper.Helpers;\nusing GHelper.Input;\nusing System.Drawing.Drawing2D;\nusing System.Drawing.Ima"
  },
  {
    "path": "app/USB/XGM.cs",
    "chars": 4141,
    "preview": "// Reference : thanks to https://github.com/RomanYazvinsky/ for initial discovery of XGM payloads\n\nusing GHelper.Helper"
  },
  {
    "path": "app/Updates.Designer.cs",
    "chars": 16623,
    "preview": "using GHelper.UI;\n\nnamespace GHelper\n{\n    partial class Updates\n    {\n        /// <summary>\n        /// Required desig"
  },
  {
    "path": "app/Updates.cs",
    "chars": 15852,
    "preview": "using GHelper.Helpers;\nusing GHelper.UI;\nusing NvAPIWrapper.Native.Display.Structures;\nusing System.Diagnostics;\nusing "
  },
  {
    "path": "app/Updates.resx",
    "chars": 5819,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!--\n    Microsoft ResX Schema\n\n    Version 2.0\n\n    The primary goals "
  },
  {
    "path": "app/app.manifest",
    "chars": 3318,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<assembly manifestVersion=\"1.0\" xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n  <ass"
  },
  {
    "path": "app/global.json",
    "chars": 3,
    "preview": "{\n}"
  },
  {
    "path": "crowdin.yml",
    "chars": 113,
    "preview": "files:\n  - source: /app/Properties/Strings.resx\n    translation: /app/Properties/Strings.%two_letters_code%.resx\n"
  },
  {
    "path": "docs/README.ja-JP.md",
    "chars": 7809,
    "preview": "# G-Helper - Asusノートパソコン用の軽量コントロールツール\n[![United24](https://raw.githubusercontent.com/seerge/g-helper/main/docs/ua.png)]("
  },
  {
    "path": "docs/README.md",
    "chars": 12208,
    "preview": "# G-Helper - Lightweight control tool for Asus laptops\n[![United24](https://raw.githubusercontent.com/seerge/g-helper/ma"
  },
  {
    "path": "docs/README.zh-CN.md",
    "chars": 13897,
    "preview": "# G-Helper——轻量级的华硕笔记本控制中心\n[![United24](https://raw.githubusercontent.com/seerge/g-helper/main/docs/ua.png)](https://u24."
  },
  {
    "path": "docs/_config.yml",
    "chars": 155,
    "preview": "title: G-Helper\ndescription: Open source Armory Crate alternative for Asus ROG Zephyrus G14, G15, Flow X13, Flow X16, an"
  },
  {
    "path": "docs/_layouts/default.html",
    "chars": 1028,
    "preview": "<!DOCTYPE html>\n<html lang=\"{{ page.lang | default: site.lang | default: \"en-US\" }}\">\n  <head>\n    <meta charset=\"UTF-8\""
  },
  {
    "path": "docs/bloat.bat",
    "chars": 715,
    "preview": "sc config  AsusAppService start= auto\nsc config  ASUSLinkNear start= auto\nsc config  ASUSLinkRemote start= auto\nsc confi"
  },
  {
    "path": "docs/debloat.bat",
    "chars": 746,
    "preview": "sc STOP  AsusAppService\nsc STOP  ASUSLinkNear\nsc STOP  ASUSLinkRemote\nsc STOP  ASUSSoftwareManager\nsc STOP  ASUSSwitch\ns"
  }
]

// ... and 2 more files (download for full content)

About this extraction

This page contains the full source code of the seerge/g-helper GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 178 files (2.4 MB), approximately 634.8k tokens, and a symbol index with 2488 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!